aboutsummaryrefslogtreecommitdiffstats
path: root/src/cnki_nh.c
blob: 94613b5a7415cb169e1152ec391ec874a63fb298 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
 * Copyright (c) 2020, yzrh <yzrh@noema.org>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <stdlib.h>

#include "cnki.h"

int
cnki_nh(cnki_t **param)
{
	if (*param == NULL)
		return 1;

	if ((*param)->stat > 0)
		printf("Begin 'HN' conversion\n");

	if ((*param)->file_stat->page > 0)
		(*param)->object_nh = malloc(sizeof(object_nh_t));
	else
		return 1;

	if ((*param)->object_nh == NULL)
		return 1;

	if ((*param)->stat > 1) {
		printf("Loading page(s)\n");
		printf("\t%8s\t%8s\t%13s\t%6s\t%4s\t%8s\t%8s\n",
			"address",
			"text",
			"page",
			"zero",
			"code",
			"address",
			"image");
	}

	object_nh_t *ptr = (*param)->object_nh;
	for (int i = 0; i < (*param)->file_stat->page; i++) {
		fread(&ptr->address, 4, 1, (*param)->fp_i);
		fread(&ptr->size, 4, 1, (*param)->fp_i);
		fread(&ptr->page, 4, 1, (*param)->fp_i);
		fread(&ptr->zero, 8, 1, (*param)->fp_i);

		ptr->text = NULL;
		ptr->image_format = -1;
		ptr->image_address = 0;
		ptr->image_size = 0;
		ptr->image = NULL;
		ptr->next = NULL;

		if (i < (*param)->file_stat->page - 1) {
			ptr->next = malloc(sizeof(object_nh_t));

			if (ptr->next == NULL)
				return 1;
		}

		ptr = ptr->next;
	}

	ptr = (*param)->object_nh;
	while (ptr != NULL) {
		ptr->text = malloc(ptr->size);

		if (ptr->text == NULL)
			return 1;

		fseek((*param)->fp_i, ptr->address, SEEK_SET);
		fread(ptr->text, ptr->size, 1, (*param)->fp_i);
		fread(&ptr->image_format, 4, 1, (*param)->fp_i);
		fread(&ptr->image_address, 4, 1, (*param)->fp_i);
		fread(&ptr->image_size, 4, 1, (*param)->fp_i);

		ptr->image = malloc(ptr->image_size);

		if (ptr->image == NULL)
			return 1;

		fseek((*param)->fp_i, ptr->image_address, SEEK_SET);
		fread(ptr->image, ptr->image_size, 1, (*param)->fp_i);

		if ((*param)->stat > 1)
			printf("\t%08x\t%8d\t{%d, %8d}\t{%d, %d}\t%4d\t%08x\t%8d\n",
				ptr->address,
				ptr->size,
				ptr->page[0],
				ptr->page[1],
				ptr->zero[0],
				ptr->zero[1],
				ptr->image_format,
				ptr->image_address,
				ptr->image_size);

		ptr = ptr->next;
	}

	if ((*param)->stat > 1)
		printf("Loaded %d page(s)\n", (*param)->file_stat->page);

	/* TODO: Study signed int __fastcall CAJDoc::OpenNHCAJFile(int a1, int a2) */

	if ((*param)->stat > 0)
		printf("Conversion ended\n");

	/* TODO: Finish me please :) */
	return 1;
}