1
This commit is contained in:
Alex Yatskov 2016-11-20 18:23:50 -08:00
parent 3aeee4b0ee
commit 7d049e1f0a
6 changed files with 102 additions and 97 deletions

View File

@ -2,5 +2,5 @@ cmake_minimum_required(VERSION 3.5)
project(zero-epwing) project(zero-epwing)
include_directories(eb) include_directories(eb)
link_directories(eb/eb/.libs jansson/lib) 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) target_link_libraries(zero-epwing libeb.a libz.a libjansson.a)

View File

@ -16,12 +16,11 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <stdbool.h>
#include <string.h> #include <string.h>
#include <stdio.h>
#include "util.h" #include "book.h"
#include "convert.h" #include "convert.h"
#include "util.h"
#include "eb/eb/eb.h" #include "eb/eb/eb.h"
#include "eb/eb/error.h" #include "eb/eb/error.h"
@ -33,12 +32,12 @@
* Local functions * 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, "heading", json_string(entry->heading));
json_object_set_new(entry_json, "text", json_string(entry->text)); 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) { if (subbook->title != NULL) {
json_object_set_new(subbook_json, "title", json_string(subbook->title)); 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 * 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) { if (eb_seek_text(book, position) != EB_SUCCESS) {
return NULL; return NULL;
} }
@ -89,7 +88,7 @@ char* read_book_data(EB_Book* book, EB_Hookset* hookset, Gaiji_Context* context,
EB_Error_Code error; EB_Error_Code error;
switch (mode) { switch (mode) {
case READ_MODE_TEXT: case BOOK_MODE_TEXT:
error = eb_read_text( error = eb_read_text(
book, book,
NULL, NULL,
@ -100,7 +99,7 @@ char* read_book_data(EB_Book* book, EB_Hookset* hookset, Gaiji_Context* context,
&data_length &data_length
); );
break; break;
case READ_MODE_HEADING: case BOOK_MODE_HEADING:
error = eb_read_heading( error = eb_read_heading(
book, book,
NULL, NULL,
@ -128,14 +127,14 @@ char* read_book_data(EB_Book* book, EB_Hookset* hookset, Gaiji_Context* context,
return result; return result;
} }
void free_book(Book* book) { void book_free(Book* book) {
for (int i = 0; i < book->subbook_count; ++i) { 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->title);
free(subbook->copyright); free(subbook->copyright);
for (int j = 0; j < subbook->entry_count; ++j) { 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->heading);
free(entry->text); 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(); json_t* book_json = json_object();
encode_book(book, book_json); encode_book(book, book_json);

68
book.h Normal file
View File

@ -0,0 +1,68 @@
/*
* Copyright (C) 2016 Alex Yatskov <alex@foosoft.net>
* Author: Alex Yatskov <alex@foosoft.net>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#ifndef BOOK_H
#define BOOK_H
#include <stdbool.h>
#include <stdio.h>
#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 */

View File

@ -16,7 +16,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <stdio.h>
#include <iconv.h> #include <iconv.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>

47
main.c
View File

@ -17,10 +17,13 @@
*/ */
#include <string.h> #include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h> #include <getopt.h>
#include "convert.h" #include "convert.h"
#include "util.h" #include "util.h"
#include "book.h"
#include "hooks.h" #include "hooks.h"
#include "gaiji.h" #include "gaiji.h"
@ -32,10 +35,10 @@
* Local functions * Local functions
*/ */
static void export_subbook_entries(Subbook* subbook, EB_Book* eb_book, EB_Hookset* eb_hookset, Gaiji_Context* context) { static void export_subbook_entries(Book_Subbook* subbook, EB_Book* eb_book, EB_Hookset* eb_hookset, Gaiji_Context* context) {
if (subbook->entry_cap == 0) { if (subbook->entry_capacity == 0) {
subbook->entry_cap = 16384; subbook->entry_capacity = 16384;
subbook->entries = malloc(subbook->entry_cap * sizeof(Entry)); subbook->entries = malloc(subbook->entry_capacity * sizeof(Book_Entry));
} }
EB_Hit hits[256]; 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) { for (int i = 0; i < hit_count; ++i) {
EB_Hit* hit = hits + i; EB_Hit* hit = hits + i;
if (subbook->entry_count == subbook->entry_cap) { if (subbook->entry_count == subbook->entry_capacity) {
subbook->entry_cap *= 2; subbook->entry_capacity *= 2;
subbook->entries = realloc(subbook->entries, subbook->entry_cap * sizeof(Entry)); subbook->entries = realloc(subbook->entries, subbook->entry_capacity * sizeof(Book_Entry));
} }
Entry* entry = subbook->entries + subbook->entry_count++; Book_Entry* entry = subbook->entries + subbook->entry_count++;
entry->heading = read_book_data( entry->heading = book_read(eb_book, eb_hookset, &hit->heading, BOOK_MODE_HEADING, context);
eb_book, entry->text = book_read(eb_book, eb_hookset, &hit->text, BOOK_MODE_TEXT, context);
eb_hookset,
context,
&hit->heading,
READ_MODE_HEADING
);
entry->text = read_book_data(
eb_book,
eb_hookset,
context,
&hit->text,
READ_MODE_TEXT
);
} }
} }
while (hit_count > 0); 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 = {}; Gaiji_Context context = {};
char title[EB_MAX_TITLE_LENGTH + 1]; char title[EB_MAX_TITLE_LENGTH + 1];
if (eb_subbook_title(eb_book, title) == EB_SUCCESS) { 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)) { if (eb_have_copyright(eb_book)) {
EB_Position position; EB_Position position;
if (eb_copyright(eb_book, &position) == EB_SUCCESS) { 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]; EB_Subbook_Code sub_codes[EB_MAX_SUBBOOKS];
if ((error = eb_subbook_list(&eb_book, sub_codes, &book->subbook_count)) == EB_SUCCESS) { if ((error = eb_subbook_list(&eb_book, sub_codes, &book->subbook_count)) == EB_SUCCESS) {
if (book->subbook_count > 0) { 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) { 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) { if ((error = eb_set_subbook(&eb_book, sub_codes[i])) == EB_SUCCESS) {
export_subbook(subbook, &eb_book, &eb_hookset); export_subbook(subbook, &eb_book, &eb_hookset);
} }
@ -210,8 +201,8 @@ int main(int argc, char *argv[]) {
Book book = {}; Book book = {};
export_book(&book, argv[optind]); export_book(&book, argv[optind]);
dump_book(&book, pretty_print, stdout); book_dump(&book, pretty_print, stdout);
free_book(&book); book_free(&book);
return 0; return 0;
} }

58
util.h
View File

@ -16,65 +16,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef UTIL_H
#define UTIL_H
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include "eb/eb/eb.h"
#include "gaiji.h"
/* /*
* Macros * Macros
*/ */
#ifndef UTIL_H
#define UTIL_H
#define ARRSIZE(arr) (sizeof(arr) / sizeof(arr[0])) #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 */ #endif /* UTIL_H */