initial commit
This commit is contained in:
commit
a42421a083
24
Makefile
Normal file
24
Makefile
Normal file
@ -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)
|
BIN
build/isbn-lookup
Executable file
BIN
build/isbn-lookup
Executable file
Binary file not shown.
BIN
build/src/curl.c.o
Normal file
BIN
build/src/curl.c.o
Normal file
Binary file not shown.
BIN
build/src/main.c.o
Normal file
BIN
build/src/main.c.o
Normal file
Binary file not shown.
84
src/curl.c
Normal file
84
src/curl.c
Normal file
@ -0,0 +1,84 @@
|
||||
#include <curl/curl.h>
|
||||
#include <curl/easy.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
|
||||
|
15
src/include/curl.h
Normal file
15
src/include/curl.h
Normal file
@ -0,0 +1,15 @@
|
||||
#include <curl/curl.h>
|
||||
|
||||
#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
|
16
src/main.c
Normal file
16
src/main.c
Normal file
@ -0,0 +1,16 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include "include/curl.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
get_response resp;
|
||||
|
||||
book_api_call("9780762437818", &resp);
|
||||
|
||||
puts(resp.buf);
|
||||
|
||||
free_get_response(&resp);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user