diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9a1b779..4327e7e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,5 +2,5 @@ cmake_minimum_required(VERSION 3.5)
project(zero-epwing)
include_directories(eb)
link_directories(eb/eb/.libs jansson/lib)
-add_executable(zero-epwing main.c util.c gaiji.c convert.c hooks.c)
+add_executable(zero-epwing main.c book.c gaiji.c convert.c hooks.c)
target_link_libraries(zero-epwing libeb.a libz.a libjansson.a)
diff --git a/util.c b/book.c
similarity index 87%
rename from util.c
rename to book.c
index 522ef5c..cb6e205 100644
--- a/util.c
+++ b/book.c
@@ -16,12 +16,11 @@
* along with this program. If not, see .
*/
-#include
#include
-#include
-#include "util.h"
+#include "book.h"
#include "convert.h"
+#include "util.h"
#include "eb/eb/eb.h"
#include "eb/eb/error.h"
@@ -33,12 +32,12 @@
* Local functions
*/
-static void encode_entry(Entry* entry, json_t* entry_json) {
+static void encode_entry(Book_Entry* entry, json_t* entry_json) {
json_object_set_new(entry_json, "heading", json_string(entry->heading));
json_object_set_new(entry_json, "text", json_string(entry->text));
}
-static void encode_subbook(Subbook* subbook, json_t* subbook_json) {
+static void encode_subbook(Book_Subbook* subbook, json_t* subbook_json) {
if (subbook->title != NULL) {
json_object_set_new(subbook_json, "title", json_string(subbook->title));
}
@@ -79,7 +78,7 @@ static void encode_book(Book* book, json_t* book_json) {
* Exported functions
*/
-char* read_book_data(EB_Book* book, EB_Hookset* hookset, Gaiji_Context* context, const EB_Position* position, Read_Mode mode) {
+char* book_read(EB_Book* book, EB_Hookset* hookset, const EB_Position* position, Book_Mode mode, Gaiji_Context* context) {
if (eb_seek_text(book, position) != EB_SUCCESS) {
return NULL;
}
@@ -89,7 +88,7 @@ char* read_book_data(EB_Book* book, EB_Hookset* hookset, Gaiji_Context* context,
EB_Error_Code error;
switch (mode) {
- case READ_MODE_TEXT:
+ case BOOK_MODE_TEXT:
error = eb_read_text(
book,
NULL,
@@ -100,7 +99,7 @@ char* read_book_data(EB_Book* book, EB_Hookset* hookset, Gaiji_Context* context,
&data_length
);
break;
- case READ_MODE_HEADING:
+ case BOOK_MODE_HEADING:
error = eb_read_heading(
book,
NULL,
@@ -128,14 +127,14 @@ char* read_book_data(EB_Book* book, EB_Hookset* hookset, Gaiji_Context* context,
return result;
}
-void free_book(Book* book) {
+void book_free(Book* book) {
for (int i = 0; i < book->subbook_count; ++i) {
- Subbook* subbook = book->subbooks + i;
+ Book_Subbook* subbook = book->subbooks + i;
free(subbook->title);
free(subbook->copyright);
for (int j = 0; j < subbook->entry_count; ++j) {
- Entry* entry = subbook->entries + j;
+ Book_Entry* entry = subbook->entries + j;
free(entry->heading);
free(entry->text);
}
@@ -144,7 +143,7 @@ void free_book(Book* book) {
}
}
-void dump_book(Book* book, bool pretty_print, FILE* fp) {
+void book_dump(Book* book, bool pretty_print, FILE* fp) {
json_t* book_json = json_object();
encode_book(book, book_json);
diff --git a/book.h b/book.h
new file mode 100644
index 0000000..a07cd56
--- /dev/null
+++ b/book.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2016 Alex Yatskov
+ * Author: Alex Yatskov
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef BOOK_H
+#define BOOK_H
+
+#include
+#include
+
+#include "eb/eb/eb.h"
+
+#include "gaiji.h"
+
+/*
+ * Types
+ */
+
+typedef struct {
+ char* heading;
+ char* text;
+} Book_Entry;
+
+typedef struct {
+ char* title;
+ char* copyright;
+
+ Book_Entry* entries;
+ int entry_count;
+ int entry_capacity;
+} Book_Subbook;
+
+typedef struct {
+ char character_code[32];
+ char disc_code[32];
+
+ Book_Subbook* subbooks;
+ int subbook_count;
+} Book;
+
+typedef enum {
+ BOOK_MODE_TEXT,
+ BOOK_MODE_HEADING,
+} Book_Mode;
+
+/*
+ * Functions
+ */
+
+char* book_read(EB_Book* book, EB_Hookset* hookset, const EB_Position* position, Book_Mode mode, Gaiji_Context* context);
+void book_free(Book* book);
+void book_dump(Book* book, bool pretty_print, FILE* fp);
+
+#endif /* BOOK_H */
diff --git a/convert.c b/convert.c
index 9eacf74..ffca933 100644
--- a/convert.c
+++ b/convert.c
@@ -16,7 +16,6 @@
* along with this program. If not, see .
*/
-#include
#include
#include
#include
diff --git a/main.c b/main.c
index da0a9dc..64153c2 100644
--- a/main.c
+++ b/main.c
@@ -17,10 +17,13 @@
*/
#include
+#include
+#include
#include
#include "convert.h"
#include "util.h"
+#include "book.h"
#include "hooks.h"
#include "gaiji.h"
@@ -32,10 +35,10 @@
* Local functions
*/
-static void export_subbook_entries(Subbook* subbook, EB_Book* eb_book, EB_Hookset* eb_hookset, Gaiji_Context* context) {
- if (subbook->entry_cap == 0) {
- subbook->entry_cap = 16384;
- subbook->entries = malloc(subbook->entry_cap * sizeof(Entry));
+static void export_subbook_entries(Book_Subbook* subbook, EB_Book* eb_book, EB_Hookset* eb_hookset, Gaiji_Context* context) {
+ if (subbook->entry_capacity == 0) {
+ subbook->entry_capacity = 16384;
+ subbook->entries = malloc(subbook->entry_capacity * sizeof(Book_Entry));
}
EB_Hit hits[256];
@@ -49,32 +52,20 @@ static void export_subbook_entries(Subbook* subbook, EB_Book* eb_book, EB_Hookse
for (int i = 0; i < hit_count; ++i) {
EB_Hit* hit = hits + i;
- if (subbook->entry_count == subbook->entry_cap) {
- subbook->entry_cap *= 2;
- subbook->entries = realloc(subbook->entries, subbook->entry_cap * sizeof(Entry));
+ if (subbook->entry_count == subbook->entry_capacity) {
+ subbook->entry_capacity *= 2;
+ subbook->entries = realloc(subbook->entries, subbook->entry_capacity * sizeof(Book_Entry));
}
- Entry* entry = subbook->entries + subbook->entry_count++;
- entry->heading = read_book_data(
- eb_book,
- eb_hookset,
- context,
- &hit->heading,
- READ_MODE_HEADING
- );
- entry->text = read_book_data(
- eb_book,
- eb_hookset,
- context,
- &hit->text,
- READ_MODE_TEXT
- );
+ Book_Entry* entry = subbook->entries + subbook->entry_count++;
+ entry->heading = book_read(eb_book, eb_hookset, &hit->heading, BOOK_MODE_HEADING, context);
+ entry->text = book_read(eb_book, eb_hookset, &hit->text, BOOK_MODE_TEXT, context);
}
}
while (hit_count > 0);
}
-static void export_subbook(Subbook* subbook, EB_Book* eb_book, EB_Hookset* eb_hookset) {
+static void export_subbook(Book_Subbook* subbook, EB_Book* eb_book, EB_Hookset* eb_hookset) {
Gaiji_Context context = {};
char title[EB_MAX_TITLE_LENGTH + 1];
if (eb_subbook_title(eb_book, title) == EB_SUCCESS) {
@@ -85,7 +76,7 @@ static void export_subbook(Subbook* subbook, EB_Book* eb_book, EB_Hookset* eb_ho
if (eb_have_copyright(eb_book)) {
EB_Position position;
if (eb_copyright(eb_book, &position) == EB_SUCCESS) {
- subbook->copyright = read_book_data(eb_book, eb_hookset, &context, &position, READ_MODE_TEXT);
+ subbook->copyright = book_read(eb_book, eb_hookset, &position, BOOK_MODE_TEXT, &context);
}
}
@@ -161,9 +152,9 @@ static void export_book(Book* book, const char path[]) {
EB_Subbook_Code sub_codes[EB_MAX_SUBBOOKS];
if ((error = eb_subbook_list(&eb_book, sub_codes, &book->subbook_count)) == EB_SUCCESS) {
if (book->subbook_count > 0) {
- book->subbooks = calloc(book->subbook_count, sizeof(Subbook));
+ book->subbooks = calloc(book->subbook_count, sizeof(Book_Subbook));
for (int i = 0; i < book->subbook_count; ++i) {
- Subbook* subbook = book->subbooks + i;
+ Book_Subbook* subbook = book->subbooks + i;
if ((error = eb_set_subbook(&eb_book, sub_codes[i])) == EB_SUCCESS) {
export_subbook(subbook, &eb_book, &eb_hookset);
}
@@ -210,8 +201,8 @@ int main(int argc, char *argv[]) {
Book book = {};
export_book(&book, argv[optind]);
- dump_book(&book, pretty_print, stdout);
- free_book(&book);
+ book_dump(&book, pretty_print, stdout);
+ book_free(&book);
return 0;
}
diff --git a/util.h b/util.h
index 5559ddb..fdd07e2 100644
--- a/util.h
+++ b/util.h
@@ -16,65 +16,13 @@
* along with this program. If not, see .
*/
-#ifndef UTIL_H
-#define UTIL_H
-
-#include
-#include
-#include
-
-#include "eb/eb/eb.h"
-
-#include "gaiji.h"
-
/*
* Macros
*/
+#ifndef UTIL_H
+#define UTIL_H
+
#define ARRSIZE(arr) (sizeof(arr) / sizeof(arr[0]))
-/*
- * Types
- */
-
-typedef struct {
- char* heading;
- char* text;
-} Text_Block;
-
-typedef struct {
- char* heading;
- char* text;
-} Entry;
-
-typedef struct {
- char* title;
- char* copyright;
-
- Entry* entries;
- int entry_count;
- int entry_cap;
-} Subbook;
-
-typedef struct {
- char character_code[32];
- char disc_code[32];
-
- Subbook* subbooks;
- int subbook_count;
-} Book;
-
-typedef enum {
- READ_MODE_TEXT,
- READ_MODE_HEADING,
-} Read_Mode;
-
-/*
- * Functions
- */
-
-char* read_book_data(EB_Book* book, EB_Hookset* hookset, Gaiji_Context* context, const EB_Position* position, Read_Mode mode);
-void free_book(Book* book);
-void dump_book(Book* book, bool pretty_print, FILE* fp);
-
#endif /* UTIL_H */