#include #include #include #include #define WEATHER_FORMAT "?format=%f+%C" #define MAX_SIZE 1024 size_t write_callback(void *ptr, size_t size, size_t nmemb, char *data) { strncat(data, ptr, size * nmemb); return size * nmemb; } int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } char url[MAX_SIZE], weather_data[MAX_SIZE] = {0}, cache_path[MAX_SIZE]; const char *cache_dir = getenv("XDG_CACHE_HOME") ?: "/tmp"; snprintf(url, sizeof(url), "https://wttr.in/%s%s", argv[1], WEATHER_FORMAT); snprintf(cache_path, sizeof(cache_path), "%s/weatherreport", cache_dir); curl_global_init(CURL_GLOBAL_DEFAULT); CURL *curl = curl_easy_init(); if (!curl) return 1; curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, weather_data); if (curl_easy_perform(curl) != CURLE_OK) { curl_easy_cleanup(curl); curl_global_cleanup(); return 1; } curl_easy_cleanup(curl); curl_global_cleanup(); // Remove '+' character for (char *p = weather_data; *p; p++) { if (*p == '+') memmove(p, p + 1, strlen(p)); } FILE *fp = fopen(cache_path, "w"); if (fp) { fputs(weather_data, fp); fclose(fp); } printf("%s\n", weather_data); return 0; }