#include #include #include #include #include #include "histogram.h" #include "text.h" #include "svg.h" #include"string" using namespace std; struct Input { vector numbers; size_t bin_count{}; }; Input input_data(istream& in, bool prompt) { size_t number_count; if (prompt) { cerr << "Enter number count: "; } in >> number_count; Input iinn; iinn.numbers.resize(number_count); if (prompt) { cerr << "Enter numbers: "; } for (size_t i = 0; i < number_count; i++) { in >> iinn.numbers[i]; } if (prompt) { cerr << "Enter bin count: "; } in >> iinn.bin_count; return iinn; } static size_t write_data(void* items, size_t item_size, size_t item_count, void* ctx) { size_t data_size = item_size * item_count; stringstream* buffer = reinterpret_cast(ctx); buffer->write(reinterpret_cast(items), data_size); return data_size; } Input download(const string& address) { stringstream buffer; CURL* curl = curl_easy_init(); if (curl) { CURLcode res; curl_easy_setopt(curl, CURLOPT_URL, address.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer); res = curl_easy_perform(curl); if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); exit(1); } curl_easy_cleanup(curl); } return input_data(buffer, false); } void usage() { cout << "Usage: (lab34.exe [-format {text|svg}] URL) or (lab34.exe URL [-format {text|svg}])\n" ; exit(1); } int main(int argc, char* argv[]) { #include curl_global_init(CURL_GLOBAL_ALL); Input input; string format_option; if ((argc > 3) && (strcmp(argv[1], "-format") == 0)) { if (strcmp(argv[2], "svg") == 0) { format_option = "svg"; } else if (strcmp(argv[2], "text") == 0) { format_option = "text"; } input = download(argv[3]); } else if ((argc > 3) && (strcmp(argv[2], "-format") == 0)) { if (strcmp(argv[3], "svg") == 0) { format_option = "svg"; } else if (strcmp(argv[3], "text") == 0) { format_option = "text"; } input = download(argv[1]); } else { usage(); } if (format_option != "text" && format_option != "svg") { usage(); } const auto bins = make_histogram(input.numbers, input.bin_count); if (format_option == "text") { show_histogram_text(bins, input.bin_count); } else if (format_option == "svg") { show_histogram_svg(bins); } return(0); }