100 lines
2.3 KiB
C
100 lines
2.3 KiB
C
#include <curl/curl.h>
|
|
#include <errno.h>
|
|
#include <error.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/param.h>
|
|
#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)
|
|
{
|
|
const char base[] =
|
|
"https://api.binance.com/api/v3/ticker/price?symbols=[";
|
|
size_t s = sizeof base;
|
|
char* url;
|
|
char* tmp = (char*)s - 1;
|
|
|
|
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);
|
|
tmp += (size_t)url;
|
|
for (size_t i = 0; WALLET[i].to; i++) {
|
|
tmp += sprintf(tmp, "\"%s%s\",", 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;
|
|
}
|