X-Git-Url: https://git.toastfreeware.priv.at/gregoa/bti.git/blobdiff_plain/081129fe97e87549df39e0ef9e1d924035138ed5..d20c2ca45742deb99e874071a175b29d6c5f9857:/bti.c diff --git a/bti.c b/bti.c index a19b75c..6f77ddc 100644 --- a/bti.c +++ b/bti.c @@ -75,6 +75,7 @@ static void display_help(void) " --retweet ID\n" " --shrink-urls\n" " --page PAGENUMBER\n" + " --column COLUMNWIDTH\n" " --bash\n" " --background\n" " --debug\n" @@ -99,8 +100,10 @@ static char *get_string(const char *name) exit(1); if (name != NULL) fprintf(stdout, "%s", name); - if (!fgets(string, 999, stdin)) + if (!fgets(string, 999, stdin)) { + free(string); return NULL; + } temp = strchr(string, '\n'); if (temp) *temp = '\0'; @@ -116,7 +119,7 @@ static char *get_string(const char *name) * lib/ss/get_readline.c file, which is licensed under the MIT license. * * This keeps us from having to relicense the bti codebase if readline - * ever changes its license, as there is no link-time dependancy. + * ever changes its license, as there is no link-time dependency. * It is a run-time thing only, and we handle any readline-like library * in the same manner, making bti not be a derivative work of any * other program. @@ -291,9 +294,10 @@ static void bti_output_line(struct session *session, xmlChar *user, xmlChar *id, xmlChar *created, xmlChar *text) { if (session->verbose) - printf("[%s] {%s} (%.16s) %s\n", user, id, created, text); + printf("[%*s] {%s} (%.16s) %s\n", -session->column_output, user, + id, created, text); else - printf("[%s] %s\n", user, text); + printf("[%*s] %s\n", -session->column_output, user, text); } static void parse_statuses(struct session *session, @@ -327,7 +331,8 @@ static void parse_statuses(struct session *session, } if (user && text && created && id) { - bti_output_line(session, user, id, created, text); + bti_output_line(session, user, id, + created, text); xmlFree(user); xmlFree(text); xmlFree(created); @@ -448,7 +453,7 @@ static int request_access_token(struct session *session) { char *post_params = NULL; char *request_url = NULL; - char *reply = NULL; + char *reply = NULL; char *at_key = NULL; char *at_secret = NULL; char *verifier = NULL; @@ -576,8 +581,10 @@ static int send_request(struct session *session) if (session->replyto) curl_formadd(&formpost, &lastptr, - CURLFORM_COPYNAME, "in_reply_to_status_id", - CURLFORM_COPYCONTENTS, session->replyto, + CURLFORM_COPYNAME, + "in_reply_to_status_id", + CURLFORM_COPYCONTENTS, + session->replyto, CURLFORM_END); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); @@ -644,10 +651,37 @@ static int send_request(struct session *session) curl_easy_setopt(curl, CURLOPT_WRITEDATA, curl_buf); if (!session->dry_run) { res = curl_easy_perform(curl); - if (res && !session->background) { - fprintf(stderr, "error(%d) trying to perform " - "operation\n", res); - return -EINVAL; + if (!session->background) { + xmlDocPtr doc; + xmlNodePtr current; + + if (res) { + fprintf(stderr, "error(%d) trying to " + "perform operation\n", res); + return -EINVAL; + } + + doc = xmlReadMemory(curl_buf->data, + curl_buf->length, + "response.xml", NULL, + XML_PARSE_NOERROR); + if (doc == NULL) + return -EINVAL; + + current = xmlDocGetRootElement(doc); + if (current == NULL) { + fprintf(stderr, "empty document\n"); + xmlFreeDoc(doc); + return -EINVAL; + } + + if (xmlStrcmp(current->name, (const xmlChar *)"status")) { + fprintf(stderr, "unexpected document type\n"); + xmlFreeDoc(doc); + return -EINVAL; + } + + xmlFreeDoc(doc); } } @@ -803,8 +837,10 @@ static char *get_string_from_stdin(void) if (!string) return NULL; - if (!fgets(string, 999, stdin)) + if (!fgets(string, 999, stdin)) { + free(string); return NULL; + } temp = strchr(string, '\n'); if (temp) *temp = '\0'; @@ -1118,6 +1154,7 @@ int main(int argc, char *argv[], char *envp[]) { "background", 0, NULL, 'B' }, { "dry-run", 0, NULL, 'n' }, { "page", 1, NULL, 'g' }, + { "column", 1, NULL, 'o' }, { "version", 0, NULL, 'v' }, { "config", 1, NULL, 'c' }, { "replyto", 1, NULL, 'r' }, @@ -1181,7 +1218,7 @@ int main(int argc, char *argv[], char *envp[]) while (1) { option = getopt_long_only(argc, argv, - "dp:P:H:a:A:u:c:hg:G:sr:nVvw:", + "dp:P:H:a:A:u:c:hg:o:G:sr:nVvw:", options, NULL); if (option == -1) break; @@ -1203,6 +1240,10 @@ int main(int argc, char *argv[], char *envp[]) dbg("page = %d\n", page_nr); session->page = page_nr; break; + case 'o': + session->column_output = atoi(optarg); + dbg("column_output = %d\n", session->column_output); + break; case 'r': session->replyto = strdup(optarg); dbg("in_reply_to_status_id = %s\n", session->replyto); @@ -1236,7 +1277,7 @@ int main(int argc, char *argv[], char *envp[]) session->action = ACTION_PUBLIC; else if (strcasecmp(optarg, "group") == 0) session->action = ACTION_GROUP; - else if (strcasecmp(optarg,"retweet") == 0) + else if (strcasecmp(optarg, "retweet") == 0) session->action = ACTION_RETWEET; else session->action = ACTION_UNKNOWN; @@ -1330,7 +1371,10 @@ int main(int argc, char *argv[], char *envp[]) if (!session->consumer_key || !session->consumer_secret) { if (session->action == ACTION_USER || session->action == ACTION_PUBLIC) { - /* Some actions may still work without authentication */ + /* + * Some actions may still work without + * authentication + */ session->guest = 1; } else { fprintf(stderr, @@ -1386,7 +1430,7 @@ int main(int argc, char *argv[], char *envp[]) fprintf(stdout, "Status ID to retweet: "); rtid = get_string_from_stdin(); session->retweet = zalloc(strlen(rtid) + 10); - sprintf(session->retweet,"%s", rtid); + sprintf(session->retweet, "%s", rtid); free(rtid); }