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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
%% options
copyright owner = Dirk Krause
copyright year = 2015-xxxx
SPDX-License-Identifier: BSD-3-Clause
%% module
#include "dk4app.h"
#ifndef DK4MEM_H_INCLUDED
#include "dk4mem.h"
#endif
#ifndef DK4MPL_H_INCLUDED
#include "dk4mpl.h"
#endif
#ifndef DK4STT_H_INCLUDED
#include "dk4stt.h"
#endif
#ifndef DK4STRM_H_INCLUDED
#include "dk4strm.h"
#endif
#ifndef DK4STRMR_H_INCLUDED
#include "dk4strmr.h"
#endif
#ifndef DK4FS_H_INCLUDED
#include "dk4fs.h"
#endif
#if DK4_HAVE_ASSERT_H
#ifndef ASSERT_H_INCLUDED
#include <assert.h>
#define ASSERT_H_INCLUDED 1
#endif
#endif
$!trace-include
size_t
dk4app_string_table_size(const dkChar * const *texts)
{
size_t back = 0;
$? "+ dk4app_string_table_size"
if (NULL != texts) {
while (NULL != *(texts++)) { back++; }
} $? "- dk4app_string_table_size %u", (unsigned)back
return back;
}
const dkChar * const *
dk4app_string_table(
dk4_app_t *app,
const dkChar *shortname,
const dkChar * const *deftexts
)
{
dkChar buffer[DK4_MAX_PATH];
dk4_string_table_t *sttptr;
dk4_stream_t *istrm;
const dkChar * const *back;
size_t rqlen;
int res;
int ok;
$? "+ dk4app_string_table \"%!ds\"", TR_STR(shortname)
#if DK4_USE_ASSERT
assert(NULL != app);
assert(NULL != shortname);
assert(NULL != deftexts);
#endif
back = deftexts;
if ((NULL != app) && (NULL != shortname)) { $? ". args ok"
back = NULL;
rqlen = dk4app_string_table_size(deftexts); $? ". elements %u", (unsigned)rqlen
sttptr = (dk4_string_table_t *)dk4sto_it_find_like(app->i_stt,shortname,1);
if (NULL == sttptr) { $? ". create new string table"
res = dk4app_search_data_file(
buffer, DK4_SIZEOF(buffer,dkChar), app, shortname,
DK4_FS_DATA_MAX_SYS, 1, NULL
);
if (0 < res) { $? ". file found"
sttptr = dk4stt_open(shortname, rqlen, NULL);
if (NULL != sttptr) { $? ". allocated"
ok = 0;
istrm = dk4stream_open_file_reader(buffer, NULL);
if (NULL != istrm) { $? ". input stream ok"
res = dk4stt_apply_stream(sttptr, istrm, app->encoding, NULL);
if (0 < res) { $? ". stream applied"
if (0 < dk4sto_add(app->s_stt, (void *)sttptr, NULL)) {
ok = 1; $? ". added to storage"
} else { $? "! memory"
}
} else { $? "! failed to apply stream"
}
dk4stream_close(istrm, NULL);
} else { $? "! failed to open stream"
}
if (0 == ok) {
dk4stt_close(sttptr);
sttptr = NULL;
}
} else { $? "! memory"
}
} else { $? "! file not found"
}
}
if (NULL != sttptr) { $? ". have string table"
if (sttptr->nstrings >= rqlen) {
back = (const dkChar * const *)(sttptr->strings);
}
}
if (NULL == back) { $? ". no string table"
back = deftexts;
}
} $? "- dk4app_string_table PTR=%d", TR_IPTR(back)
return back;
}
|