summaryrefslogtreecommitdiff
path: root/support/dktools/dk4appstt.ctr
blob: 045de8bfe59a83c6b376c08d646da9eabf9d2b57 (plain)
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;
}