diff --git a/src/main/lkt.c b/src/main/lkt.c index 4a6d84ef6ec3c9af7c94853b96847a0f231fcb4d..b641966f4583542d291a29f3f315a9cd1bda9d5f 100644 --- a/src/main/lkt.c +++ b/src/main/lkt.c @@ -17,7 +17,7 @@ #define LKT_KEY_VALUE_SEP ": \n\t\0" -#define ___HANDLE_STATUS(buffer, ok) \ +#define HANDLE_STATUS(buffer, ok) \ if (STR_NMATCH(buffer, "OK", 2)) { \ ok; \ } else if (STR_NMATCH(buffer, "ACK", 3)) \ @@ -25,15 +25,6 @@ /* Type definition. */ -typedef struct { - const char *host; /* Serveur host, may be resolved. */ - const char *port; /* Serveur port. */ - const char *pwd; /* The password for the user. */ - const char *row_format; /* The row format. */ - const char **argv; /* Pointer to the argv from the main function. */ - int argc; /* Argument count of the args. */ -} args_t; - #define ROW_FORMAT_ONELINE "oneline" #define ROW_FORMAT_PRETTY "pretty" #define ROW_FORMAT_AUTO "auto" @@ -138,7 +129,7 @@ setup_row_printer(void) /* Communication functions and fonction that interact with lektor stuff. */ PRIVATE_FUNCTION void -___concat_strings(char *const res, size_t len, const char **tab, size_t count) +concat_strings(char *const res, size_t len, const char **tab, size_t count) { size_t i; for (i = 0; i < count - 1; ++i) { @@ -195,7 +186,7 @@ lkt_get_query_type(struct cmd_args *args, char *const regex, size_t regex_len) #define ___explicit_with_concat_strings(matches, uri) \ if (STR_MATCH(matches, args->argv[0])) { \ strncat(regex, uri, regex_len - 1); \ - ___concat_strings(regex, regex_len, args->argv + 1, args->argc - 1); \ + concat_strings(regex, regex_len, args->argv + 1, args->argc - 1); \ return 0; \ } #define ___explicit_with_snprintf(matches, uri) \ @@ -204,15 +195,16 @@ lkt_get_query_type(struct cmd_args *args, char *const regex, size_t regex_len) return 0; \ } - ___explicit_with_concat_strings("author", "author://"); /* Type ?== author */ - ___explicit_with_concat_strings("plt", "playlist://"); /* Type ?== playlist */ + // clang-format off + ___explicit_with_concat_strings("author", "author://"); /* Type ?== author */ + ___explicit_with_concat_strings("plt", "playlist://"); /* Type ?== playlist */ ___explicit_with_concat_strings("playlist", "playlist://"); /* Type ?== playlist */ - - ___explicit_with_snprintf("cat", "category://"); /* Type ?== category */ - ___explicit_with_snprintf("category", "category://"); /* Type ?== category */ - ___explicit_with_snprintf("lang", "lang://"); /* Type ?== lang */ - ___explicit_with_snprintf("language", "lang://"); /* Type ?== lang */ - ___explicit_with_snprintf("type", "type://"); /* Type ?== type */ + ___explicit_with_snprintf("cat", "category://"); /* Type ?== category */ + ___explicit_with_snprintf("category", "category://"); /* Type ?== category */ + ___explicit_with_snprintf("lang", "lang://"); /* Type ?== lang */ + ___explicit_with_snprintf("language", "lang://"); /* Type ?== lang */ + ___explicit_with_snprintf("type", "type://"); /* Type ?== type */ + // clang-format on #undef ___explicit_with_snprintf #undef ___explicit_concat_strings @@ -221,7 +213,7 @@ lkt_get_query_type(struct cmd_args *args, char *const regex, size_t regex_len) /* If 'query' is specified, skip it */ int index = STR_MATCH("query", args->argv[0]) ? 1 : 0; strncat(regex, "query://%", regex_len - 1); - ___concat_strings(regex, regex_len, args->argv + index, args->argc - index); + concat_strings(regex, regex_len, args->argv + index, args->argc - index); strncat(regex, "%", regex_len - 1); return 0; } @@ -241,7 +233,7 @@ read_socket(FILE *sock, char *buff, size_t max_len) } PRIVATE_FUNCTION EXIT_FUNCTION -___exit_with_status(FILE *sock, char *buff) +exit_with_status(FILE *sock, char *buff) { read_socket(sock, buff, 2); FAIL_IF(buff[0] != 'O' && buff[1] != 'K', "ACK"); @@ -343,10 +335,7 @@ PRIVATE_FUNCTION void send_cmd_with_uri(FILE *sock, char *cmd, int argc, const char **argv) { char buf[LKT_MESSAGE_MAX]; - struct cmd_args args = { - .argc = argc, - .argv = argv, - }; + struct cmd_args args = CMD_ARGS_FROM(argc, argv); memset(buf, 0, LKT_MESSAGE_MAX * sizeof(char)); FAIL_IF(lkt_get_query_type(&args, buf, LKT_MESSAGE_MAX), "Query is invalid"); @@ -356,13 +345,14 @@ send_cmd_with_uri(FILE *sock, char *cmd, int argc, const char **argv) /* Functions implementing options. */ #define just_send_two_args(func, cmd) \ - EXIT_FUNCTION func(struct cmd_args *args) \ + EXIT_FUNCTION \ + func(struct cmd_args *args) \ { \ FAIL_IF(args->argc != 2, "Need two arguments"); \ FILE *sock = lkt_connect(); \ char buff[2]; \ write_socket(sock, cmd " %s %s\n", args->argv[0], args->argv[1]); \ - ___exit_with_status(sock, buff); \ + exit_with_status(sock, buff); \ } // clang-format off just_send_two_args(queue_swap__, "swap"); @@ -371,13 +361,14 @@ just_send_two_args(queue_swapid__, "swapid"); #undef just_send_two_args #define just_send_one_arg(func, cmd) \ - EXIT_FUNCTION func(struct cmd_args *args) \ + EXIT_FUNCTION \ + func(struct cmd_args *args) \ { \ FAIL_IF(args->argc != 1, "Invalid argument"); \ FILE *sock = lkt_connect(); \ char buff[2]; \ write_socket(sock, cmd " %s\n", args->argv[0]); \ - ___exit_with_status(sock, buff); \ + exit_with_status(sock, buff); \ } // clang-format off just_send_one_arg(stickers_create__, "sticker __create"); @@ -389,7 +380,8 @@ just_send_one_arg(queue_dump__, "__dump"); #undef just_send_one_arg #define just_send(func, msg) /* Just send a simple string functions */ \ - EXIT_FUNCTION func(struct cmd_args *args) \ + EXIT_FUNCTION \ + func(struct cmd_args *args) \ { \ FAIL_IF(args->argc, "This command takes no arguments"); \ lkt_send_and_exit(msg, sizeof(msg)); \ @@ -494,7 +486,7 @@ queue_replace__(struct cmd_args *args) break; } - ___HANDLE_STATUS(buff, { break; }); + HANDLE_STATUS(buff, { break; }); } fclose(sock); @@ -505,7 +497,7 @@ queue_replace__(struct cmd_args *args) if (play) write_socket(sock, "play\n"); write_socket(sock, "command_list_end\n"); - ___exit_with_status(sock, buff); + exit_with_status(sock, buff); } EXIT_FUNCTION @@ -572,7 +564,7 @@ ping__(struct cmd_args *args) } PRIVATE_FUNCTION EXIT_FUNCTION -___read_kara_and_exit(FILE *sock) +read_kara_and_exit(FILE *sock) { char *mem = NULL; char buff[LKT_MESSAGE_MAX]; @@ -606,18 +598,17 @@ ___read_kara_and_exit(FILE *sock) ___assign_mdt(category); /* At this point every key has been parsed. */ - ___HANDLE_STATUS(buff, { goto ok; }); + HANDLE_STATUS(buff, { break; }); } #undef ___assign_mdt -ok: if (language[0]) printf("%s - %s / %s - %s - %s [%s]\n", category, language, source, type, title, author); else if (category[0]) printf("%s / %s - %s - %s [%s]\n", category, source, type, title, author); else - exit(EXIT_FAILURE); + abort(); exit(EXIT_SUCCESS); } @@ -629,7 +620,7 @@ queue_id__(struct cmd_args *args) safe_snprintf(probe_id__, LKT_LINE_MAX, "playlistid %ld\n", strtol(args->argv[0], NULL, 0)); FILE *sock = lkt_connect(); write_socket(sock, probe_id__); - ___read_kara_and_exit(sock); + read_kara_and_exit(sock); } EXIT_FUNCTION @@ -639,7 +630,7 @@ current__(struct cmd_args *args) static const char current_song__[] = "currentsong\n"; FILE *sock = lkt_connect(); write_socket(sock, current_song__); - ___read_kara_and_exit(sock); + read_kara_and_exit(sock); } EXIT_FUNCTION @@ -665,7 +656,7 @@ queue_pop__(struct cmd_args *args) assign_int("song", song); /* At this point every key has been parsed. */ - ___HANDLE_STATUS(buff, { break; }); + HANDLE_STATUS(buff, { break; }); } #undef assign_int song += 1; /* Needs the +1, see status command */ @@ -675,7 +666,7 @@ queue_pop__(struct cmd_args *args) if (!song) exit(EXIT_FAILURE); write_socket(sock, "next\ndelete %d\n", song); - ___exit_with_status(sock, buff); + exit_with_status(sock, buff); } EXIT_FUNCTION @@ -743,7 +734,7 @@ status__(struct cmd_args *args) assign_int("elapsed", time_pos) assign_int("duration", time_duration) assign_int("song", song_index); assign_int("playlistlength", plt_len); - ___HANDLE_STATUS(buff, { break; }); + HANDLE_STATUS(buff, { break; }); } /* Get lektor's stats */ @@ -754,7 +745,7 @@ status__(struct cmd_args *args) assign_int("__is_updating", is_updating) assign_int("db_update", update_ts); assign_two_int("__update_progress", update_tick, update_count); - ___HANDLE_STATUS(buff, { break; }); + HANDLE_STATUS(buff, { break; }); } /* End of communication */ @@ -807,7 +798,7 @@ queue_remove__(struct cmd_args *args) sscanf(args->argv[0], "%d", &dumy); if (dumy != 0) { write_socket(sock, cmd__, dumy); - ___exit_with_status(sock, buff); + exit_with_status(sock, buff); } LOG_FATAL("Invalid argument"); @@ -826,7 +817,7 @@ queue_delete__(struct cmd_args *args) sscanf(args->argv[0], "%d", &dumy); if (dumy != 0) { write_socket(sock, cmd_id__, dumy); - ___exit_with_status(sock, buff); + exit_with_status(sock, buff); } LOG_FATAL("Invalid argument"); @@ -839,7 +830,7 @@ queue_add__(struct cmd_args *args) FAIL_IF(args->argc < 1, "Invalid arguments"); FILE *sock = lkt_connect(); send_cmd_with_uri(sock, "add", args->argc, args->argv); - ___exit_with_status(sock, buff); + exit_with_status(sock, buff); } EXIT_FUNCTION @@ -849,7 +840,7 @@ queue_insert__(struct cmd_args *args) FAIL_IF(args->argc < 1, "Invalid arguments"); FILE *sock = lkt_connect(); send_cmd_with_uri(sock, "__insert", args->argc, args->argv); - ___exit_with_status(sock, buff); + exit_with_status(sock, buff); } EXIT_FUNCTION @@ -866,7 +857,7 @@ queue_seek__(struct cmd_args *args) FILE *sock = lkt_connect(); write_socket(sock, "playid %ld\n", id); - ___exit_with_status(sock, buf); + exit_with_status(sock, buf); } EXIT_FUNCTION @@ -910,7 +901,7 @@ redo: } } - ___HANDLE_STATUS(buff, { exit(EXIT_SUCCESS); }); + HANDLE_STATUS(buff, { exit(EXIT_SUCCESS); }); row_print(buff); } } @@ -951,7 +942,7 @@ queue_list__(struct cmd_args *args) assign_int("song", song_index); /* At this point every key has been parsed. */ - ___HANDLE_STATUS(buff, { break; }); + HANDLE_STATUS(buff, { break; }); } #undef assign_int fclose(sock); @@ -975,15 +966,12 @@ plt_add__(struct cmd_args *args) FAIL_IF(args->argc < 2, "Invalid argument, need at least three arguments: plt add <plt> <query>"); char regex[LKT_MESSAGE_MAX]; - struct cmd_args args_regex = { - .argc = args->argc - 1, - .argv = args->argv + 1, - }; + struct cmd_args args_regex = CMD_ARGS_NEXT(*args); FAIL_IF(lkt_get_query_type(&args_regex, regex, LKT_MESSAGE_MAX), "Query is invalid"); FILE *sock = lkt_connect(); write_socket(sock, "playlistadd %s %s\n", args->argv[0], regex); - ___exit_with_status(sock, buff); + exit_with_status(sock, buff); } EXIT_FUNCTION @@ -996,7 +984,7 @@ plt_delete__(struct cmd_args *args) snprintf(cmd, 128 - 1, "playlistdelete %s", args->argv[0]); cmd[127] = '\0'; send_cmd_with_uri(sock, cmd, args->argc - 1, &args->argv[1]); - ___exit_with_status(sock, buff); + exit_with_status(sock, buff); } EXIT_FUNCTION @@ -1025,7 +1013,7 @@ stickers_get__(struct cmd_args *args) FOR_EVER { memset(buff, 0, LKT_MESSAGE_MAX * sizeof(char)); read_socket(sock, buff, LKT_MESSAGE_MAX - 1); - ___HANDLE_STATUS(buff, { exit(EXIT_SUCCESS); }); + HANDLE_STATUS(buff, { exit(EXIT_SUCCESS); }); fprintf(stdout, "%s", buff); } } @@ -1037,7 +1025,7 @@ stickers_set__(struct cmd_args *args) FILE *sock = lkt_connect(); char buff[2]; write_socket(sock, "sticker set %s %s %s %s\n", args->argv[0], args->argv[1], args->argv[2], args->argv[3]); - ___exit_with_status(sock, buff); + exit_with_status(sock, buff); } EXIT_FUNCTION @@ -1051,7 +1039,7 @@ stickers_delete__(struct cmd_args *args) write_socket(sock = lkt_connect(), "sticker delete %s %s %s", args->argv[0], args->argv[1], args->argv[2]); else LOG_FATAL("Invalid argument"); - ___exit_with_status(sock, buff); + exit_with_status(sock, buff); } /* Search functions. */ @@ -1077,7 +1065,7 @@ redo: goto redo; } - ___HANDLE_STATUS(buff, { exit(EXIT_SUCCESS); }); + HANDLE_STATUS(buff, { exit(EXIT_SUCCESS); }); if (STR_NMATCH(buff, "name: ", strlen("name: "))) { char *real_line = buff + sizeof("name: ") - sizeof(char); @@ -1129,7 +1117,7 @@ redo: goto redo; } - ___HANDLE_STATUS(buff, { exit(EXIT_SUCCESS); }); + HANDLE_STATUS(buff, { exit(EXIT_SUCCESS); }); row_print(buff); } } @@ -1147,7 +1135,7 @@ search_get__(struct cmd_args *args) FOR_EVER { memset(buff, 0, LKT_MESSAGE_MAX * sizeof(char)); read_socket(sock, buff, LKT_MESSAGE_MAX - 1); - ___HANDLE_STATUS(buff, { exit(EXIT_SUCCESS); }); + HANDLE_STATUS(buff, { exit(EXIT_SUCCESS); }); sink = write(1, buff, strlen(buff)); } } @@ -1164,10 +1152,7 @@ search_plt__(struct cmd_args *args) char regex[LKT_MESSAGE_MAX]; int continuation = 0; FILE *sock = NULL; - struct cmd_args args_regex = { - .argc = args->argc - 1, - .argv = args->argv + 1, - }; + struct cmd_args args_regex = CMD_ARGS_NEXT(*args); FAIL_IF(args->argc < 2, "Invalid number of arguments"); FAIL_IF(lkt_get_query_type(&args_regex, regex, LKT_MESSAGE_MAX), "Query is invalid"); @@ -1186,7 +1171,7 @@ redo: goto redo; } - ___HANDLE_STATUS(buff, { exit(EXIT_SUCCESS); }); + HANDLE_STATUS(buff, { exit(EXIT_SUCCESS); }); row_print(buff); } }