/* Copyright (C) 2015-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk4wxstt.cpt */ /** @file dk4wxstt.cpp The dk4wxstt module. */ #line 166 "dk4wxstt.cpt" #include "dk4conf.h" #ifndef DK4_SIZEOF_WXCHAR #ifndef DK4WXCS_H_INCLUDED #include "dk4wxcs.h" #endif #endif #include "dk4mem.h" #include "dk4enc.h" #include "dk4strd.h" #include "dk4wxtypes.h" #include "dk4strx.h" #include "dk4wxstt.h" #include "dk4tspwx.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 192 "dk4wxstt.cpt" void dk4wxstt_shutdown(dk4_wx_string_table_t *ptr) { wxChar **stptr; size_t nstrings; #line 201 "dk4wxstt.cpt" #if DK4_USE_ASSERT assert(NULL != ptr); #endif if (NULL != ptr) { #line 205 "dk4wxstt.cpt" if (NULL != ptr->strings) { #line 206 "dk4wxstt.cpt" stptr = ptr->strings; nstrings = ptr->nstrings; while (0 < nstrings--) { #line 209 "dk4wxstt.cpt" dk4mem_release(*stptr); stptr++; } #line 212 "dk4wxstt.cpt" dk4mem_release(ptr->strings); } } #line 216 "dk4wxstt.cpt" } void dk4wxstt_close(dk4_wx_string_table_t *ptr) { #line 223 "dk4wxstt.cpt" #if DK4_USE_ASSERT assert(NULL != ptr); #endif if (NULL != ptr) { #line 227 "dk4wxstt.cpt" dk4wxstt_shutdown(ptr); #line 228 "dk4wxstt.cpt" dk4mem_release(ptr->shrtfn); ptr->nstrings = 0; #line 230 "dk4wxstt.cpt" dk4mem_free(ptr); } #line 233 "dk4wxstt.cpt" } dk4_wx_string_table_t * dk4wxstt_open(const dkChar *fn, size_t sz, dk4_er_t *erp) { dk4_wx_string_table_t *back = NULL; wxChar **stptr = NULL; int ok = 0; #line 244 "dk4wxstt.cpt" #if DK4_USE_ASSERT assert(NULL != fn); assert(0 < sz); #endif if ((NULL != fn) && (0 < sz)) { #line 249 "dk4wxstt.cpt" back = dk4mem_new(dk4_wx_string_table_t,1,erp); if (NULL != back) { #line 251 "dk4wxstt.cpt" back->strings = NULL; back->nstrings = 0; back->shrtfn = dk4str_dup(fn, erp); if (NULL != back->shrtfn) { #line 255 "dk4wxstt.cpt" back->nstrings = sz; back->strings = dk4mem_new(DK4_PWXCHAR,sz,erp); if (NULL != back->strings) { #line 258 "dk4wxstt.cpt" stptr = back->strings; while (0 < sz--) { *(stptr++) = NULL; } ok = 1; } } if (1 > ok) { #line 264 "dk4wxstt.cpt" dk4wxstt_close(back); back = NULL; } } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 272 "dk4wxstt.cpt" return back; } int dk4wxstt_compare(const void *l, const void *r, int cr) { const dk4_wx_string_table_t *lptr; const dk4_wx_string_table_t *rptr; int back = 0; if (NULL != l) { if (NULL != r) { lptr = (const dk4_wx_string_table_t *)l; switch (cr) { case 1: { if (NULL != lptr->shrtfn) { back = dk4str_pathcmp(lptr->shrtfn, (const dkChar *)r); } else { back = -1; } } break; default : { rptr = (const dk4_wx_string_table_t *)r; if (NULL != lptr->shrtfn) { if (NULL != rptr->shrtfn) { back = dk4str_pathcmp(lptr->shrtfn, rptr->shrtfn); } else { back = 1; } } else { if (NULL != rptr->shrtfn) { back = -1; } } } break; } } else { back = 1; } } else { if (NULL != r) { back = -1; } } return back; } /** Support structure for reading string table from stream. */ typedef struct { dk4_wx_string_table_t *dptr; /**< String table to set up. */ size_t curpos; /**< Current string number. */ } dk4_wx_string_table_reader_t; #if DK4_SIZEOF_WXCHAR > 1 #if DK4_SIZEOF_WXCHAR > 2 #define TO_SIZED_CHAR(x) ((dk4_c32_t)(x)) #else #define TO_SIZED_CHAR(x) ((dk4_c16_t)(x)) #endif #else #define TO_SIZED_CHAR(x) ((char)(x)) #endif /** Handler function for text lines. @param obj Object to modify while processing the character. @param line Text line to process. @param lineno Current line number. @param erp Error report, may be NULL. @return DK4_TSP_RES_OK if the character was processed successfully, DK4_TSP_RES_ERROR if there was an error but we can continue, DK4_TSP_RES_FATAL if there was a fatal error so we should abort processing. */ static int dk4wxstt_line_handler( void *obj, #if DK4_SIZEOF_WXCHAR > 1 #if DK4_SIZEOF_WXCHAR > 2 dk4_c32_t *line, #else dk4_c16_t *line, #endif #else char *line, #endif dk4_um_t WXUNUSED(lineno), dk4_er_t * WXUNUSED(erp) ) { dk4_wx_string_table_reader_t *reader; wxChar *linecp; int back = DK4_TSP_RES_ERROR; #line 366 "dk4wxstt.cpt" reader = (dk4_wx_string_table_reader_t *)obj; if (wxT('#') != (wxChar)(*line)) { #line 368 "dk4wxstt.cpt" if (reader->curpos < reader->dptr->nstrings) { #line 369 "dk4wxstt.cpt" linecp = dk4strx_dup((wxChar *)line, NULL); if (NULL != linecp) { (reader->dptr->strings)[reader->curpos] = linecp; reader->curpos += 1; back = DK4_TSP_RES_OK; while (wxT('\0') != (wxChar)(*linecp)) { if (wxT('\\') == (wxChar)(*linecp)) { if (wxT('r') == (wxChar)(linecp[1])) { *linecp = TO_SIZED_CHAR(wxT('\r')); dk4strx_cpy_to_left( (wxChar *)(&(linecp[1])), (wxChar *)(&(linecp[2])) ); } else { if (wxT('n') == wxChar(linecp[1])) { *linecp = TO_SIZED_CHAR(wxT('\n')); dk4strx_cpy_to_left( (wxChar *)(&(linecp[1])), (wxChar *)(&(linecp[2])) ); } else { if (wxT('t') == (wxChar)(linecp[1])) { *linecp = TO_SIZED_CHAR(wxT('\t')); dk4strx_cpy_to_left( (wxChar *)(&(linecp[1])), (wxChar *)(&(linecp[2])) ); } else { dk4strx_cpy_to_left( (wxChar *)(linecp), (wxChar *)(&(linecp[1])) ); if (wxT('\0') == (wxChar)(*linecp)) { linecp--; } } } } } else { if (wxT('\n') == (wxChar)(*linecp)) { *linecp = TO_SIZED_CHAR(wxT('\0')); linecp--; } else { if ((wxT('\r') == (wxChar)(*linecp)) && (wxT('\n') == (wxChar)(linecp[1]))) { *linecp = TO_SIZED_CHAR(wxT('\0')); linecp--; } } } linecp++; } } else { back = DK4_TSP_RES_FATAL; } } else { #line 420 "dk4wxstt.cpt" back = DK4_TSP_RES_OK; } } else { back = DK4_TSP_RES_OK; } #line 425 "dk4wxstt.cpt" return back; } bool dk4wxstt_apply_stream( dk4_wx_string_table_t *tptr, dk4_stream_t *strm, int pre, dk4_er_t * WXUNUSED(erp1), dk4_er_t *erp2 ) { wxChar line[1024]; /* Line buffer */ char buf[4096]; /* Input bytes from stream */ dk4_wx_string_table_reader_t reader; /* Reader structure */ dk4_tspwx_t tspwx; /* Text stream processor */ dk4_er_t e1; /* Error report decoding */ dk4_er_t e2; /* Error report processing */ size_t rdb; /* Number of bytes read */ int cc; /* Flag: Can continue */ bool back = false; /* Function result */ #line 449 "dk4wxstt.cpt" #if DK4_USE_ASSERT assert(NULL != tptr); assert(NULL != strm); #endif if ((NULL != tptr) && (NULL != strm)) { #line 454 "dk4wxstt.cpt" dk4error_init(&e1); dk4error_init(&e2); reader.dptr = tptr; reader.curpos = 0; cc = dk4tspwx_setup_line( &tspwx, (void *)(&reader), dk4wxstt_line_handler, line, DK4_SIZEOF(line,wxChar), pre, DK4_FILE_ENCODING_UTF8, &e2 ); back = ((cc != 0) ? true : false); if (back) { #line 464 "dk4wxstt.cpt" #if VERSION_BEFORE_20150821 cc = 1; #endif do { cc = 0; rdb = sizeof(buf); if (0 < dk4stream_read(buf, &rdb, strm, NULL)) { if (0 < rdb) { #line 472 "dk4wxstt.cpt" switch (dk4tspwx_add_bytes(&tspwx, (unsigned char *)buf, rdb)) { case DK4_TSP_RES_OK: { cc = 1; #line 475 "dk4wxstt.cpt" } break; case DK4_TSP_RES_ERROR: { cc = 1; #line 478 "dk4wxstt.cpt" } break; default: { back = false; #line 481 "dk4wxstt.cpt" } break; } } } } while (0 != cc); if (back) { #line 487 "dk4wxstt.cpt" if (DK4_TSP_RES_FATAL == dk4tspwx_finish(&tspwx)) { back = false; #line 489 "dk4wxstt.cpt" } if (back) { if (reader.curpos < (reader.dptr)->nstrings) { back = false; #line 493 "dk4wxstt.cpt" } } } } else { #line 497 "dk4wxstt.cpt" } } else { dk4error_set_simple_error_code(erp2, DK4_E_INVALID_ARGUMENTS); } #line 502 "dk4wxstt.cpt" return back; }