From 5c327958e264377162cdd4326171fc7f4654a152 Mon Sep 17 00:00:00 2001 From: SuperNovaa41 Date: Fri, 12 Jan 2024 12:15:17 -0500 Subject: [PATCH] initial commit --- Makefile | 2 + a.out | Bin 0 -> 16712 bytes isbn | Bin 0 -> 19512 bytes main.c | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ test.c | 14 +++++ 5 files changed, 195 insertions(+) create mode 100644 Makefile create mode 100755 a.out create mode 100755 isbn create mode 100644 main.c create mode 100644 test.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f7f8a65 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +all: main.c + gcc main.c -lcurl -lcjson -o isbn -Wall diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..1290597c9e62eb327e9c18282b968b6bdfae38a6 GIT binary patch literal 16712 zcmeHOeQaA-6~DHd#{F{Au7#|H)f=ryY2!L&4Jliwov%KF)0Q@Ai?;UFiC+?L{)p`7 zEiFhCWt(QwbWsOlAP|#aXn>H0K&a}FNY|<@(ln)$7!lJTj83E-Y}rO36SU@>ch7O& zdv*{AX@9*N`JH=y=i{Dx-hKAHdG~&~BiiY9xda!F_>4eqs8%8&5?tOv6(AweESACb z4)Ia382Cj7CgmYXKq||i+e*EJdw`Q(ggy41tI!dRRPB~D&c_zaC{Cb z=_dg9!^d8R0r1;F;8(!st_rvq%Ii6i)3Zq}EmXB{IHvX|(y?UXxCSgFzfaBSv8=A9 zVu`fKrH8VKwB9dJfH$E@?21NO+th7=ZGr7VjdXXZaV@J2Byzfz?e1zzX3|=BtT&0y z22zQ;%DGO8EZKQI>j}eVDq<{_3Z}qO<ne(Jc}KV6fTB;g_X0oBr-Hylh0%QETYOk-cuf&s8u#y zfGEHnwtq$$?Sh7Trj*eD-V@o}IE(C2_20(uB&%R9y5WuW!%7K^h$9|zh@FU#sq(G z+B@#5u0mwte;D*bsO_um^woW~X4%8u6JqDudp_~W4R;}o z_VDilF%EiO1gN0>{qRXa%x@wV_SHV-Zdve^A9gl5=20^%U_=`iZG z`f8tWM|^dsJRLs&*rE zU2Scj_Sd&-y@^=b-x!4Lzl{w|o2cgB7TnetY-|j&Rb}dd9k#sx->l(*|4r~db}Q}? zGkk+h0uStf^;Srz2X_ARxH753{_n+t$Db9i7JQ$qxL5G~wc<+zj~gq#RPgw+;xL+R z`9!$~o`LMAkiGWoiGvS?Ylu=Z7ll-&Xn_u`SMr7S1>O`<2e!B=&#Q9rk-WNWPi^My{c|_Lm`_Cws5^ zf1!ST+wikW!2k8iN+mx(GPG_hi}QKIPx*bkK>EDzo*VhCQ7Io+*9|}A_xDBUfE!K~ zl|2`LufqF6zeCthEVWSa8#U|Yq=A=@lP!Rg3yVPu;I%NW?Bi!C>buLIqxJ>-99#fT zE`Wa(aBSB;p1%QjrGEVY@Rjbm()TWR0=G@A#H5iC{k(`50LQ$AsME&(G{NW>@TrCI zsf3_nD&wTj=e{}9}F-=3e}lYS4Kqj;0_{{%S3Y1e-naKEWNt}byea2};EtLOB5 ze}AA)%%3Dt^_1F&XGwB!jwGH@2a=iISW=DanQTst<%dOICN-4QbS)kTR@T5%EeSQ2 z&Bl(YT3XK@6aCp(N>k(cRO%R*m^c+Qb&IO5<#dQgRXg{EyE@d4-R&xzV6p1Oh1&jw z-QliCn^j_*o&g9BAE_M*c~IK-33XR=Pir`;?&<8@-_fmhhg+i^=+!uL)0fK|5&y>{ zHF$I+AC$a~$;)%4H z&uNf``5s^*f$z=b$c=G`NLArr5GN5&3{^Y^WIc;yiA)4?$5MK%7pR__` zOUBTEYC}m~1dLt=pc)v+0IO@maK+&UN*UvZ1hhdKV1sdR!kjdfBTZUx9a@N`5`EBo zMn}&O9NyRfWKslRtfycI^ON-dQJl}iBMRTavhaM2DbMFgZ0K?w>Brz>KC{I0Hl`cQ z%24O;DTbSD_B_91>SslwcKdd~{|<9%j-Tg&Ou7Biy2IvgH}LT5Q|dp@7nx3xKA#8U z^#QL34uBk|o~8CFK%QToCVM8BYjZgQ46Yg2p68!T`L~PXXFaA5f<3N5nCE#aQ$ICk zkDp+194Z(x+w**u=>#cq`}Y1nLiVks$MasMipd_=UUvIafMHHbXXkjnMHFq!h0Pe`e$ph$KL z@fpIx^GQA@Y}aR=>2JWM20m=h^X%CM^fo`v&N=jrw`}aU%ZlC9sK{Dhx*#Wo9{QFQr zjN=c5q$EW4c6~~RRD$a*_#kGFlkGoV(v%gpH`CJCHR%qL!yqLde~0jvay&e)@%iA` gP3Gb${9%Ez!RDOXl~SBTSGNCUv(%`z8Q56yZ}tF^H~;_u literal 0 HcmV?d00001 diff --git a/isbn b/isbn new file mode 100755 index 0000000000000000000000000000000000000000..4b69e2d71c62d14ad3b2d145699ddad1a1fbcc2a GIT binary patch literal 19512 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 +#include +#include +#include + +#include + +#define BASE_URL_SIZE 38 + +/** + * struct string_t + * char* buf - The buffer containing the string data + * size_t len - The length of the buffer + */ +typedef struct string_t { + char* buf; + size_t len; +} string; + +/** + * void init_string + * string* s - The string struct + * + * Initializes the string struct */ +void init_string (string* s) +{ + s->len = 0; + s->buf = malloc(s->len + 1); + + if (NULL == s->buf) { + fprintf(stderr, "malloc() failed\n"); + exit(EXIT_FAILURE); + } + s->buf[0] = '\0'; +} + +/** + * size_t writefunc + * + * The arguments come from CURLOPT_WRITEFUNCTION + * + * Writes the cURL get into the string struct + */ +size_t writefunc(void* ptr, size_t size, size_t nmemb, string* s) +{ + size_t new_len = s->len + (size * nmemb); + s->buf = realloc(s->buf, new_len + 1); + if (NULL == s->buf) { + fprintf(stderr, "realloc() failed\n"); + exit(EXIT_FAILURE); + } + + memcpy(s->buf + s->len, ptr, size * nmemb); + s->buf[new_len] = '\0'; + s->len = new_len; + + return size * nmemb; +} + +/** + * CURLcode perform_book_get + * char isbn_buf[14] - The ISBN + * string* s - The string struct to place the GET output in + * + * Perforrms a GET request with the ISBN + */ +CURLcode perform_book_get(char isbn_buf[14], string* s) +{ + CURL* handler; + char *base_url; + size_t finalurl_size = BASE_URL_SIZE + 15; + char finalurl[finalurl_size]; + CURLcode result; + + handler = curl_easy_init(); + if (!handler) { + fprintf(stderr, "cURL failed to initialize!\n"); + exit(EXIT_FAILURE); + } + + base_url = "https://openlibrary.org/search.json?q="; + /** + * Setup the URL for the request + */ + snprintf(finalurl, finalurl_size, "%s%s", base_url, isbn_buf); + + curl_easy_setopt(handler, CURLOPT_URL, finalurl); + curl_easy_setopt(handler, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(handler, CURLOPT_WRITEFUNCTION, writefunc); + curl_easy_setopt(handler, CURLOPT_WRITEDATA, s); + + result = curl_easy_perform(handler); + + // Always clean up + curl_easy_cleanup(handler); + + return result; +} + +void parse_json(string* s) +{ + cJSON* json = cJSON_Parse(s->buf); + if (NULL == json) { + const char* error_ptr = cJSON_GetErrorPtr(); + if (NULL != error_ptr) + fprintf(stderr, "JSON error: %s\n", error_ptr); + cJSON_Delete(json); + exit(EXIT_FAILURE); + } + + cJSON* docs = cJSON_GetObjectItemCaseSensitive(json, "docs"); + cJSON* child = docs->child; // this is the JSON object that stores all of the books information + + printf("Title: %s\n", cJSON_GetObjectItemCaseSensitive(child, "title")->valuestring); + + cJSON* authors = cJSON_GetObjectItemCaseSensitive(child, "author_name"); + printf("Author(s): "); + if (cJSON_IsArray(authors)) { + cJSON* authorarr = authors->child; + while (NULL != authorarr->next) { + printf("%s, ", authorarr->valuestring); + authorarr = authorarr->next; + } + printf("%s\n", authorarr->valuestring); + } else { + printf("Author(s): %s\n", authors->valuestring); + } + + printf("Year of Publication: %d\n", cJSON_GetObjectItemCaseSensitive(child, "publish_year")->child->valueint); + printf("Page length: %d\n", cJSON_GetObjectItemCaseSensitive(child, "number_of_pages_median")->valueint); +} + +int main(int argc, char* argv[]) +{ + char isbn_buf[14]; + CURLcode res; + + if (2 != argc) { + printf("Usage: isbn [isbn]\n"); + return EXIT_FAILURE; + } + + /** + * We must initialize cURL + */ + curl_global_init(CURL_GLOBAL_ALL); + + /** + * Grab the ISBN from argv + */ + snprintf(isbn_buf, 14, "%s", argv[1]); + + /** + * Setup the output string + */ + string get_output; + init_string(&get_output); + + /** + * Perform the get request + */ res = perform_book_get(isbn_buf, &get_output); + if (0 != res) { + fprintf(stderr, "Failed to perform the get request!\n"); + return EXIT_FAILURE; + } + + /** + * Now we want to parse the JSON input + */ + parse_json(&get_output); + + /** + * We need to free this string + */ + free(get_output.buf); + + + return 0; +} diff --git a/test.c b/test.c new file mode 100644 index 0000000..f70a520 --- /dev/null +++ b/test.c @@ -0,0 +1,14 @@ +#include +#include + +int main(void) +{ + char* x = "Hello, "; + char* y = "world!"; + + size_t out_len = strlen(x) + strlen(y) + 1; + char out[out_len]; + snprintf(out, out_len, "%s%s", x, y); + puts(out); + return 0; +}