diff --git a/main.cpp b/main.cpp index f9a590c..95fa242 100644 --- a/main.cpp +++ b/main.cpp @@ -4,6 +4,8 @@ #include "text.h" #include "svg.h" #include <curl/curl.h> +#include <sstream> +#include <string> using namespace std; @@ -11,7 +13,6 @@ struct Input { vector<double> numbers; size_t bin_count{}; - vector<string> colors; }; Input input_data(istream& inp, bool prompt) @@ -38,17 +39,50 @@ Input input_data(istream& inp, bool prompt) } inp >> in.bin_count; - in.colors.resize(in.bin_count); - cerr << "Enter colors: "; - for (size_t i = 0; i < in.bin_count; i++) + return in; +} + +size_t write_data(void* items, size_t item_size, size_t item_count, void* ctx) +{ + size_t data_size = item_count * item_size; + stringstream* buffer = reinterpret_cast<stringstream*>(ctx); + char* item = reinterpret_cast<char *>(items); + buffer->write(item, data_size); + return data_size; +} + +Input download(const string& address) +{ + stringstream buffer; + + CURL* curl = curl_easy_init(); + + if(curl) { - inp >> in.colors[i]; + 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); + curl_easy_cleanup(curl); + if (res != 0) + { + cerr << curl_easy_strerror(res) << endl; + exit(1); + } } - return in; + + curl_easy_cleanup(curl); + + return input_data(buffer, false); } -int main(int argc, char* argv[]) + +/*int main(int argc, char* argv[]) { + curl_global_init(CURL_GLOBAL_ALL); + Input input; + if (argc > 1) { CURL* curl = curl_easy_init(); @@ -70,11 +104,22 @@ int main(int argc, char* argv[]) return 0; } - curl_global_init(CURL_GLOBAL_ALL); - auto in = input_data(cin, true); auto bins = make_histogram(in.numbers, in.bin_count); - show_histogram_svg(bins, in.colors); + show_histogram_svg(bins); + + return 0; +} */ + +int main(int argc, char* argv[]) { + Input input; + if (argc > 1) { + input = download(argv[1]); + } else { + input = input_data(cin, true); + } + const auto bins = make_histogram(input.numbers, input.bin_count); + show_histogram_svg(bins); return 0; } diff --git a/svg.cpp b/svg.cpp index 1ec5992..4fb4674 100644 --- a/svg.cpp +++ b/svg.cpp @@ -22,26 +22,12 @@ void svg_text(double left, double baseline, std::string text) std::cout << "<text x='" << left << "' y='"<< baseline <<"'>"<< text <<"</text>"; } -void svg_rect(double x, double y, double width, double height, std::string fill = "black", std::string stroke = "black") +void svg_rect(double x, double y, double width, double height, std::string fill = "purple", std::string stroke = "black") { std::cout << "<rect x='" << x << "' y='" << y << "' width='" << width << "' height='" << height << "' fill='" << fill << "' stroke='" << stroke << "' />\n"; } -std::string check_color(const std::string& color) -{ - if (color.find(" ") == -1 || color.find('#') == 0) - { - return color; - } - else - { - return "black"; - } -} - - - -void show_histogram_svg(const std::vector<std::size_t>& bins, const std::vector<std::string>& colors) +void show_histogram_svg(const std::vector<std::size_t>& bins) { const auto IMAGE_WIDTH = 400; @@ -68,7 +54,7 @@ void show_histogram_svg(const std::vector<std::size_t>& bins, const std::vector< for (std::size_t j=0; j < bins.size(); j++) { const double bin_width= MAX_ASTERISK * (static_cast<double>(bins[j]) / maxbin); svg_text(TEXT_LEFT, top + TEXT_BASELINE, std::to_string(bins[j])); - svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, check_color(colors[j]), "black"); + svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT); top += BIN_HEIGHT; } svg_end(); @@ -77,9 +63,10 @@ void show_histogram_svg(const std::vector<std::size_t>& bins, const std::vector< for (std::size_t j=0; j < bins.size(); j++) { const double bin_width= MAX_ASTERISK * (static_cast<double>(bins[j]) / maxbin); svg_text(TEXT_LEFT, top + TEXT_BASELINE, std::to_string(bins[j])); - svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT, check_color(colors[j]), "black"); + svg_rect(TEXT_WIDTH, top, bin_width, BIN_HEIGHT); top += BIN_HEIGHT; } svg_end(); } } + diff --git a/svg.h b/svg.h index 92ce6c8..b29b7fd 100644 --- a/svg.h +++ b/svg.h @@ -1,5 +1,5 @@ #ifndef SVG_H_INCLUDED #define SVG_H_INCLUDED #include <vector> -void show_histogram_svg(const std::vector<std::size_t>& bins, const std::vector<std::string>& colors); +void show_histogram_svg(const std::vector<std::size_t>& bins); #endif // SVG_H_INCLUDED