#include #include #include #include #include #include #include #include "config.h" #define BUF_SIZE 1024 // [{"symbol":"BTCUSDT","price":"69420.69420"}] static int get_next_symbol(char* buf, float* price) { static const char output[] = "\"symbol\":\"%*[^\"]\",\"price\":\"%f\""; char* tmp = strtok(buf, "{"); if (!tmp) { return 1; } tmp = strtok(0, "}"); if (!tmp) { return 1; } return !sscanf(tmp, output, price); } static size_t write_callback(char *response, size_t s, size_t n, void *buf) { size_t size = s * n; return snprintf(buf, MIN(size, BUF_SIZE), response); } static char* build_url(void) { static const char base[] = "https://api.binance.com/api/v3/ticker/price?symbols=["; size_t s = sizeof base; char* url; for (size_t i = 0; WALLET[i].to; i++) { s += strlen(WALLET[i].from) + strlen(WALLET[i].to) + 3; // ["SYMBOL",] } url = malloc(s); if (!url) { return 0; } strcpy(url, base); for (size_t i = 0; WALLET[i].to; i++) { strcat(strcat(strcat(strcat( url, "\""), WALLET[i].from), WALLET[i].to), "\"," ); } url[strlen(url) - 1] = ']'; return url; } static CURL* init_curl(char* response) { char* url = build_url(); CURL* curl = curl_easy_init(); if (!url || !curl) { free(url); curl_easy_cleanup(curl); return 0; } curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, response); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_perform(curl); free(url); return curl; } int main(void) { char response[BUF_SIZE]; CURL* curl = init_curl(response); int err; float price, current; float sum = 0; if (!curl) { error(1, errno, "cannot init curl"); } err = get_next_symbol(response, &price); for (size_t i = 0; !err && WALLET[i].to; i++) { current = price * WALLET[i].value; printf("%s=%.2f" CUR " ", WALLET[i].from, current); sum += current; err = get_next_symbol(0, &price); } printf("TOT=%.2f" CUR "\n", sum); curl_easy_cleanup(curl); return 0; }