From 6fdd07f649a1b17a319b7f23187c01fcc0b7d6c3 Mon Sep 17 00:00:00 2001
From: TekotovaVA <TekotovaVA@mpei.ru>
Date: Mon, 29 May 2023 14:37:46 +0300
Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D1=81?=
 =?UTF-8?q?=20=D0=B1=D1=83=D1=84=D0=B5=D1=80=D0=BE=D0=BC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 cs-lab34.cpp | 67 ++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 49 insertions(+), 18 deletions(-)

diff --git a/cs-lab34.cpp b/cs-lab34.cpp
index 9c5782f..38131c4 100644
--- a/cs-lab34.cpp
+++ b/cs-lab34.cpp
@@ -1,3 +1,5 @@
+#include <sstream>
+#include <string>
 #include <curl/curl.h>
 #include "text.h"
 #include "histogram.h"
@@ -10,37 +12,66 @@ struct Input {
     vector<double> numbers;
     size_t bin_count{};
 };
-Input input_data(istream& in)
+
+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<stringstream*>(ctx);
+    buffer->write(reinterpret_cast<const char*>(items), data_size);
+
+    return data_size;
+}
+
+Input input_data(istream& in, bool pro)
+{
+    if (pro)
+        cerr << "enter the number of numbers:";
     size_t number_count;
     in >> number_count;
     Input k;
+    if (pro)
+        cerr << "enter the numbers:";
     k.numbers.resize(number_count);
-    for (size_t i = 0; i < number_count; i++) {
+    for (size_t i = 0; i < number_count; i++)
         in >> k.numbers[i];
-    }
+    if (pro)
+        cerr << "enter the number of buckets:";
     in >> k.bin_count;
     return k;
 }
+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 != 0) {
+            cout << curl_easy_strerror(res);
+            exit(1);
+        }
+       
+        
+        curl_easy_cleanup(curl);
+    }
+
+    return input_data(buffer, false);
+}
 int
 main(int argc, char* argv[]) {
+    Input in;
     if (argc > 1) {
-        CURL* curl = curl_easy_init();
-        if (curl) {
-            CURLcode res;
-            curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
-            res = curl_easy_perform(curl);
-            if (res != 0) {
-                cout << curl_easy_strerror(res);
-                exit(1);
-            }
-            curl_easy_cleanup(curl);
-        }
-        return 0;
+        in = download(argv[1]);
+    }
+    else {
+        in = input_data(cin, true);
     }
-    curl_global_init(CURL_GLOBAL_ALL);
-    Input in = input_data(cin);
     auto ch = make_histogram(in.numbers, in.bin_count);
     show_histogram_svg(ch);
-    return 0;
 }
\ No newline at end of file