commit a42421a0832c7e51cef6f9c223e3f546d6313153 Author: SuperNovaa41 Date: Mon Feb 24 15:04:53 2025 -0500 initial commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c1b4188 --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +CC=gcc +CFLAGS= -c -g -Wall + +LDLIBS = -lcurl + +TARGET := isbn-lookup + +BUILD_DIR := ./build +SRC_DIRS := ./src + +SRCS := $(shell find $(SRC_DIRS) -name '*.c') + +OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) + +$(BUILD_DIR)/$(TARGET): $(OBJS) + $(CC) $(OBJS) -o $@ $(LDLIBS) + +$(BUILD_DIR)/%.c.o: %.c + mkdir -p $(dir $@) + $(CC) $(CFLAGS) -c $< -o $@ + +.PHONY: clean +clean: + rm -rf $(BUILD_DIR) diff --git a/build/isbn-lookup b/build/isbn-lookup new file mode 100755 index 0000000..9d675a7 Binary files /dev/null and b/build/isbn-lookup differ diff --git a/build/src/curl.c.o b/build/src/curl.c.o new file mode 100644 index 0000000..4e83f40 Binary files /dev/null and b/build/src/curl.c.o differ diff --git a/build/src/main.c.o b/build/src/main.c.o new file mode 100644 index 0000000..3a8acfd Binary files /dev/null and b/build/src/main.c.o differ diff --git a/src/curl.c b/src/curl.c new file mode 100644 index 0000000..9fd2860 --- /dev/null +++ b/src/curl.c @@ -0,0 +1,84 @@ +#include +#include +#include +#include + +#include "include/curl.h" + +#define API_URL "https://openlibrary.org/search.json?q=" +#define API_URL_LEN 38 + +static void setup_api_link(const char* isbn, char** buf) +{ + size_t buffer_len; + + buffer_len = API_URL_LEN + strlen(isbn); + (*buf) = malloc(sizeof(char) * buffer_len); + + strncpy((*buf), API_URL, API_URL_LEN + 1); + strncpy((*buf)+ API_URL_LEN, isbn, strlen(isbn)); + (*buf)[buffer_len] = '\0'; + +} + +#undef API_URL +#undef API_URL_LEN + +static void init_get_response(get_response* buf) +{ + buf->len = 0; + buf->buf = malloc(buf->len + 1); + if (!(buf->buf)) { + perror("malloc"); + exit(EXIT_FAILURE); + } + buf->buf[0] = '\0'; +} + +void free_get_response(get_response* buf) +{ + free(buf->buf); +} + +static size_t curl_write_response(void* ptr, size_t size, size_t nmemb, get_response* buf) +{ + size_t new_len = buf->len + (size * nmemb); + buf->buf = realloc(buf->buf, new_len + 1); + if (!(buf->buf)) { + perror("realloc"); + exit(EXIT_FAILURE); + } + memcpy(buf->buf + buf->len, ptr, size * nmemb); + buf->buf[new_len] = '\0'; + buf->len = new_len; + return size * nmemb; +} + +CURLcode book_api_call(const char* isbn, get_response* buf) +{ + CURL* handler; + CURLcode result; + char* request_url; + + handler = curl_easy_init(); + if (!handler) { + perror("curl_easy_init"); + exit(EXIT_FAILURE); + } + + setup_api_link(isbn, &request_url); + init_get_response(buf); + + curl_easy_setopt(handler, CURLOPT_URL, request_url); + curl_easy_setopt(handler, CURLOPT_HTTPGET, 1L); + curl_easy_setopt(handler, CURLOPT_WRITEFUNCTION, curl_write_response); + curl_easy_setopt(handler, CURLOPT_WRITEDATA, buf); + + result = curl_easy_perform(handler); + + curl_easy_cleanup(handler); + + return result; +} + + diff --git a/src/include/curl.h b/src/include/curl.h new file mode 100644 index 0000000..b2fdbf5 --- /dev/null +++ b/src/include/curl.h @@ -0,0 +1,15 @@ +#include + +#ifndef CURL_H +#define CURL_H + +typedef struct { + char* buf; + size_t len; +} get_response; + +void free_get_response(get_response* buf); + +CURLcode book_api_call(const char* isbn, get_response* buf); + +#endif diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..3e18e60 --- /dev/null +++ b/src/main.c @@ -0,0 +1,16 @@ +#include + +#include "include/curl.h" + +int main(void) +{ + get_response resp; + + book_api_call("9780762437818", &resp); + + puts(resp.buf); + + free_get_response(&resp); + + return 0; +}