summaryrefslogtreecommitdiff
path: root/support/dktools/dk4fs.ctr
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dk4fs.ctr
Initial commit
Diffstat (limited to 'support/dktools/dk4fs.ctr')
-rw-r--r--support/dktools/dk4fs.ctr1371
1 files changed, 1371 insertions, 0 deletions
diff --git a/support/dktools/dk4fs.ctr b/support/dktools/dk4fs.ctr
new file mode 100644
index 0000000000..75f0dc75cd
--- /dev/null
+++ b/support/dktools/dk4fs.ctr
@@ -0,0 +1,1371 @@
+%% options
+
+copyright owner = Dirk Krause
+copyright year = 2015-xxxx
+license = bsd
+
+
+%% header
+
+/** @file
+ File search for configuration and data files.
+ Specify short file name and a number of directories:
+ - shared data directory (i.e. /usr/share) or system
+ configuration directory (i.e. /etc),
+ - users home directory,
+ - program name,
+ - program group name,
+ - language,
+ - region
+
+ Use dk4fs_config_one() or dk4fs_data_one() multiple times to
+ find the file best matching
+ program name, group name, language and region. See below.
+
+ CRT on Windows: Optional.
+*/
+
+#ifndef DK4CONF_H_INCLUDED
+#include "dk4conf.h"
+#endif
+
+#ifndef DK4TYPES_H_INCLUDED
+#include "dk4types.h"
+#endif
+
+#ifndef DK4ERROR_H_INCLUDED
+#include "dk4error.h"
+#endif
+
+
+
+/** Pass numbers for configuration file search.
+
+ The group name passed as name_group is used instead of group,
+ the program name passed as name_prog is used instead of prog.
+*/
+enum {
+ DK4_FS_CONF_SHARE_LIB = 0, /**< /usr/share/dk4app */
+ DK4_FS_CONF_ETC_LIB , /**< /etc/dk4app */
+ DK4_FS_CONF_SHARE_LIB_SITE , /**< /usr/share/dk4app-site */
+ DK4_FS_CONF_ETC_LIB_SITE , /**< /etc/dk4app-site */
+ DK4_FS_CONF_SHARE_GROUP , /**< /usr/share/group */
+ DK4_FS_CONF_ETC_GROUP , /**< /etc/group */
+ DK4_FS_CONF_SHARE_GROUP_SITE , /**< /usr/share/group-site */
+ DK4_FS_CONF_ETC_GROUP_SITE , /**< /etc/group-site */
+ DK4_FS_CONF_SHARE_APP , /**< /usr/share/prog */
+ DK4_FS_CONF_ETC_APP , /**< /etc/prog */
+ DK4_FS_CONF_SHARE_APP_SITE , /**< /usr/share/prog-site */
+ DK4_FS_CONF_ETC_APP_SITE , /**< /etc/prog-site */
+ DK4_FS_CONF_HOME_LIB , /**< HOME/.dk4app */
+ DK4_FS_CONF_HOME_GROUP , /**< HOME/.dk4app/group */
+ DK4_FS_CONF_HOME_APP , /**< HOME/.dk4app/prog */
+ DK4_FS_CONF_CURRENT_DIR , /**< Current directory */
+
+ /** Maximum value.
+ */
+ DK4_FS_CONF_MAX = DK4_FS_CONF_CURRENT_DIR ,
+
+ /** Maximum value to search
+ system directories only.
+ */
+ DK4_FS_CONF_SYS_MAX = DK4_FS_CONF_ETC_APP_SITE
+};
+
+
+
+/** Pass numbers for data file search.
+
+ The group name passed as name_group is used instead of group,
+ the program name passed as name_prog is used instead of prog.
+*/
+enum {
+ DK4_FS_DATA_SHARE_LIB = 0, /**< /usr/share/dk4app */
+ DK4_FS_DATA_SHARE_LIB_SITE , /**< /usr/share/dk4app-site */
+ DK4_FS_DATA_SHARE_GROUP , /**< /usr/share/group */
+ DK4_FS_DATA_SHARE_GROUP_SITE , /**< /usr/share/group-site */
+ DK4_FS_DATA_SHARE_APP , /**< /usr/share/prog */
+ DK4_FS_DATA_SHARE_APP_SITE , /**< /usr/share/prog-site */
+ DK4_FS_DATA_SHARE_LIB_LANG , /**< /usr/share/dk4app/l */
+ DK4_FS_DATA_SHARE_LIB_SITE_LANG , /**< /usr/share/dk4app-site/l */
+ DK4_FS_DATA_SHARE_GROUP_LANG , /**< /usr/share/group/l */
+ DK4_FS_DATA_SHARE_GROUP_SITE_LANG , /**< /usr/share/group-site/l */
+ DK4_FS_DATA_SHARE_APP_LANG , /**< /usr/share/prog/l */
+ DK4_FS_DATA_SHARE_APP_SITE_LANG , /**< /usr/share/prog-site/l */
+ DK4_FS_DATA_SHARE_LIB_REG , /**< /usr/share/dk4app */
+ DK4_FS_DATA_SHARE_LIB_SITE_REG , /**< /usr/share/dk4app-site */
+ DK4_FS_DATA_SHARE_GROUP_REG , /**< /usr/share/group */
+ DK4_FS_DATA_SHARE_GROUP_SITE_REG , /**< /usr/share/group-site */
+ DK4_FS_DATA_SHARE_APP_REG , /**< /usr/share/prog/no-language/r */
+ DK4_FS_DATA_SHARE_APP_SITE_REG , /**< /usr/share/prog-site/no-language/r */
+ DK4_FS_DATA_SHARE_LIB_LANG_REG , /**< /usr/share/dk4app/l/r */
+ DK4_FS_DATA_SHARE_LIB_SITE_LANG_REG , /**< /usr/share/dk4app-site/l/r */
+ DK4_FS_DATA_SHARE_GROUP_LANG_REG , /**< /usr/share/group/l/r */
+ DK4_FS_DATA_SHARE_GROUP_SITE_LANG_REG , /**< /usr/share/group-site/l/r */
+ DK4_FS_DATA_SHARE_APP_LANG_REG , /**< /usr/share/prog/l/r */
+ DK4_FS_DATA_SHARE_APP_SITE_LANG_REG , /**< /usr/share/prog-site/l/r */
+ DK4_FS_DATA_HOME_LIB , /**< HOME/.dk4app */
+ DK4_FS_DATA_HOME_GROUP , /**< HOME/.dk4app/group */
+ DK4_FS_DATA_HOME_APP , /**< HOME/.dk4app/prog */
+ DK4_FS_DATA_CURRENT_DIR , /**< Current directory */
+
+ /** Maximum system data file.
+ */
+ DK4_FS_DATA_MAX_SYS = DK4_FS_DATA_SHARE_APP_SITE_LANG_REG,
+
+ /** Maximum data file.
+ */
+ DK4_FS_DATA_MAX = DK4_FS_DATA_CURRENT_DIR
+};
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Check presence of one file, optionally with compression suffixes.
+ CRT on Windows: Optional.
+ @param dptr Buffer containing file name.
+ @param szdptr Buffer size.
+ @param compressed Flag: Search for compressed files too.
+ @param erp Error report, may be NULL.
+ @return 1 if file or optionally compressed file found, 0 otherwise.
+
+ Error codes:
+ - DK4_E_INVALID_ARGUMENTS<br>
+ if dptr is NULL or szdptr is 0,
+ - DK4_E_NOT_SUPPORTED<br>
+ if wchar_t are used as dkChar on non-Windows systems,
+ - DK4_E_NOT_FOUND<br>
+ if the file was not found.
+*/
+int
+dk4fs_attempt_file_name(
+ dkChar *dptr,
+ size_t szdptr,
+ int compressed,
+ dk4_er_t *erp
+);
+
+/** Attempt to construct one file name from multiple parts.
+ CRT on Windows: Optional.
+ @param dptr Destination buffer address.
+ @param szdptr Destination buffer size (number of dkChar).
+ @param comp Components array.
+ @param ncomp Number of components.
+ @param site Flag: Add -site after second component.
+ @param erp Error report, may be NULL.
+ @return 1 on success (path constructed and file exists), 0 otherwise.
+
+ Error codes:
+ - DK4_E_INVALID_ARGUMENTS<br>
+ if dptr or comp is NULL or szdptr or ncomp is 0,
+ - DK4_E_BUFFER_TOO_SMALL<br>
+ if the dptr buffer is too small,
+ - DK4_E_MATH_OVERFLOW<br>
+ if a mathematical overflow happened during
+ a size calculation.
+*/
+int
+dk4fs_construct_from_parts(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar **comp,
+ size_t ncomp,
+ int site,
+ dk4_er_t *erp
+);
+
+/** Attempt to construct one path name for a configuration file.
+ CRT on Windows: Optional.
+ @param dptr Buffer for result file name.
+ @param szdptr Size of buffer (number of dkChar).
+ @param shortname Short configuration file name.
+ @param dir_share The data directory.
+ @param dir_etc The system configuration directory.
+ @param dir_home Users home directory.
+ @param name_prog Application name.
+ @param name_group Application group name.
+ @param passno Number of current pass.
+ @param co3 Flag: Compatible to DK tools 3.
+ @param erp Error report, may be NULL.
+ @return 1 on success, 0 on error.
+
+ Error codes:
+ - DK4_E_INVALID_ARGUMENTS<br>
+ if dptr or shortname is NULL or szdptr is 0 or passno is an invalid
+ number or one of the used strings (dir_share, dir_etc, dir_home,
+ name_prog, or name_group) is NULL,
+ - DK4_E_BUFFER_TOO_SMALL<br>
+ if the dptr buffer is too small,
+ - DK4_E_MATH_OVERFLOW<br>
+ if a mathematical overflow happened during a size calculation.
+*/
+int
+dk4fs_config_construct_compat_one(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar *shortname,
+ const dkChar *dir_share,
+ const dkChar *dir_etc,
+ const dkChar *dir_home,
+ const dkChar *name_prog,
+ const dkChar *name_group,
+ int passno,
+ int co3,
+ dk4_er_t *erp
+);
+
+/** Attempt to construct one path name for a configuration file.
+ CRT on Windows: Optional.
+ @param dptr Buffer for result file name.
+ @param szdptr Size of buffer (number of dkChar).
+ @param shortname Short configuration file name.
+ @param dir_share The data directory.
+ @param dir_etc The system configuration directory.
+ @param dir_home Users home directory.
+ @param name_prog Application name.
+ @param name_group Application group name.
+ @param passno Number of current pass.
+ @param erp Error report, may be NULL.
+ @return 1 on success, 0 on error.
+
+ Error codes:
+ - DK4_E_INVALID_ARGUMENTS<br>
+ if dptr or shortname is NULL or szdptr is 0 or passno is an invalid
+ number or one of the used strings (dir_share, dir_etc, dir_home,
+ name_prog, or name_group) is NULL,
+ - DK4_E_BUFFER_TOO_SMALL<br>
+ if the dptr buffer is too small,
+ - DK4_E_MATH_OVERFLOW<br>
+ if a mathematical overflow happened during a size calculation.
+*/
+int
+dk4fs_config_construct_one(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar *shortname,
+ const dkChar *dir_share,
+ const dkChar *dir_etc,
+ const dkChar *dir_home,
+ const dkChar *name_prog,
+ const dkChar *name_group,
+ int passno,
+ dk4_er_t *erp
+);
+
+/** Check one path candidate for configuration file name
+ (construct name and check presence of file).
+
+ To search for a file matching your needs run this function
+ multiple times with differenct passno values.
+ - To search for one file best matching:
+ - Start with pass number DK4_FS_CONF_MAX or DK4_FS_CONF_SYS_MAX
+ and decrease the number down to DK4_FS_CONF_SHARE_LIB,
+ use the first file found.
+ - Start with pass number DK4_FS_CONF_MAX to allow both user
+ and system configuration files.
+ - Start with pass number DK4_FS_CONF_SYS_MAX to process system
+ configuration files only.
+ - To process multiple files, each file may overwrite settings
+ made by previous files:
+ - Start with pass number DK4_FS_CONF_SHARE_LIB (0) and increase
+ the pass number up to DK4_FS_CONF_SYS_MAX or DK4_FS_CONF_MAX.
+ - Stopping after DK4_FS_CONF_SYS_MAX will process system
+ configuration files only, stopping after DK4_FS_CONF_MAX
+ processes both system and user configuration files.
+
+ CRT on Windows: Optional.
+ @param dptr Buffer for result file name.
+ @param szdptr Size of buffer (number of dkChar).
+ @param shortname Short configuration file name.
+ @param dir_share The data directory.
+ @param dir_etc The system configuration directory.
+ @param dir_home Users home directory.
+ @param name_prog Application name.
+ @param name_group Application group name.
+ @param passno Number of current pass.
+ @param co3 Flag: Compatible mode to DK tools 3.
+ @param compressed Flag: Allow gzip and bzip2 compressed files
+ too, if the library was build with gzip
+ and/or bzip2 support.
+ @param erp Error report, may be NULL.
+ @return 1 on success, 0 on error.
+
+ Error codes:
+ - DK4_E_INVALID_ARGUMENTS<br>
+ if dptr or shortname is NULL or szdptr is 0 or passno is an invalid
+ number or one of the used strings (dir_share, dir_etc, dir_home,
+ name_prog, or name_group) is NULL,
+ - DK4_E_BUFFER_TOO_SMALL<br>
+ if the dptr buffer is too small,
+ - DK4_E_MATH_OVERFLOW<br>
+ if a mathematical overflow happened during a size calculation,
+ - DK4_E_NOT_FOUND<br>
+ if no file was found,
+ - DK4_E_NOT_SUPPORTED<br>
+ if wchar_t are used as dkChar on non-Windows systems.
+*/
+int
+dk4fs_config_compat_one(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar *shortname,
+ const dkChar *dir_share,
+ const dkChar *dir_etc,
+ const dkChar *dir_home,
+ const dkChar *name_prog,
+ const dkChar *name_group,
+ int passno,
+ int co3,
+ int compressed,
+ dk4_er_t *erp
+);
+
+/** Check one path candidate for configuration file name
+ (construct name and check presence of file).
+
+ To search for a file matching your needs run this function
+ multiple times with differenct passno values.
+ - To search for one file best matching:
+ - Start with pass number DK4_FS_CONF_MAX or DK4_FS_CONF_SYS_MAX
+ and decrease the number down to DK4_FS_CONF_SHARE_LIB,
+ use the first file found.
+ - Start with pass number DK4_FS_CONF_MAX to allow both user
+ and system configuration files.
+ - Start with pass number DK4_FS_CONF_SYS_MAX to process system
+ configuration files only.
+ - To process multiple files, each file may overwrite settings
+ made by previous files:
+ - Start with pass number DK4_FS_CONF_SHARE_LIB (0) and increase
+ the pass number up to DK4_FS_CONF_SYS_MAX or DK4_FS_CONF_MAX.
+ - Stopping after DK4_FS_CONF_SYS_MAX will process system
+ configuration files only, stopping after DK4_FS_CONF_MAX
+ processes both system and user configuration files.
+
+ CRT on Windows: Optional.
+ @param dptr Buffer for result file name.
+ @param szdptr Size of buffer (number of dkChar).
+ @param shortname Short configuration file name.
+ @param dir_share The data directory.
+ @param dir_etc The system configuration directory.
+ @param dir_home Users home directory.
+ @param name_prog Application name.
+ @param name_group Application group name.
+ @param passno Number of current pass.
+ @param compressed Flag: Allow gzip and bzip2 compressed files
+ too, if the library was build with gzip
+ and/or bzip2 support.
+ @param erp Error report, may be NULL.
+ @return 1 on success, 0 on error.
+
+ Error codes:
+ - DK4_E_INVALID_ARGUMENTS<br>
+ if dptr or shortname is NULL or szdptr is 0 or passno is an invalid
+ number or one of the used strings (dir_share, dir_etc, dir_home,
+ name_prog, or name_group) is NULL,
+ - DK4_E_BUFFER_TOO_SMALL<br>
+ if the dptr buffer is too small,
+ - DK4_E_MATH_OVERFLOW<br>
+ if a mathematical overflow happened during a size calculation,
+ - DK4_E_NOT_FOUND<br>
+ if no file was found,
+ - DK4_E_NOT_SUPPORTED<br>
+ if wchar_t are used as dkChar on non-Windows systems.
+*/
+int
+dk4fs_config_one(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar *shortname,
+ const dkChar *dir_share,
+ const dkChar *dir_etc,
+ const dkChar *dir_home,
+ const dkChar *name_prog,
+ const dkChar *name_group,
+ int passno,
+ int compressed,
+ dk4_er_t *erp
+);
+
+/** Attempt to construct one path name for a data file.
+ CRT on Windows: Optional.
+ @param dptr Buffer for result file name.
+ @param szdptr Size of buffer (number of dkChar).
+ @param shortname Short configuration file name.
+ @param dir_share The data directory.
+ @param language Users language.
+ @param region Users region.
+ @param dir_home Users home directory.
+ @param name_prog Application name.
+ @param name_group Application group name.
+ @param passno Number of current pass.
+ @param erp Error report, may be NULL.
+ @return 1 on success, 0 on error.
+
+ Error codes:
+ - DK4_E_INVALID_ARGUMENTS<br>
+ if dptr or shortname is NULL or szdptr is 0 or passno is an invalid
+ number or one of the used strings (dir_share, dir_home, language,
+ region, name_prog, or name_group) is NULL,
+ - DK4_E_BUFFER_TOO_SMALL<br>
+ if the dptr buffer is too small,
+ - DK4_E_MATH_OVERFLOW<br>
+ if a mathematical overflow happened during a size calculation.
+*/
+int
+dk4fs_data_construct_one(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar *shortname,
+ const dkChar *dir_share,
+ const dkChar *language,
+ const dkChar *region,
+ const dkChar *dir_home,
+ const dkChar *name_prog,
+ const dkChar *name_group,
+ int passno,
+ dk4_er_t *erp
+);
+
+/** Check one path candidate for data file name
+ (construct file name and check presence).
+
+ To search for a file, use this function multiple times with different
+ passno values:
+ - Start with DK4_F_DATA_MAX, DK4_FS_DATA_CURRENT_DIR,
+ DK4_FS_DATA_HOME_APP or DK4_FS_DATA_MAX_SYS.
+ - Decrease the pass number down to DK4_FS_DATA_SHARE_LIB.
+ - Use the first file found.
+
+ CRT on Windows: Optional.
+ @param dptr Buffer for result file name.
+ @param szdptr Size of buffer (number of dkChar).
+ @param shortname Short configuration file name.
+ @param dir_share The data directory.
+ @param dir_home Users home directory.
+ @param name_prog Application name.
+ @param name_group Application group name.
+ @param language Users preferred language.
+ @param region Users region (country code).
+ @param passno Number of current pass.
+ @param compressed Flag: Allow compressed files too.
+ @param erp Error report, may be NULL.
+ @return 1 on success, 0 on error.
+
+ Error codes:
+ - DK4_E_INVALID_ARGUMENTS<br>
+ if dptr or shortname is NULL or szdptr is 0 or passno is an invalid
+ number or one of the used strings (dir_share, dir_home, language,
+ region, name_prog, or name_group) is NULL,
+ - DK4_E_BUFFER_TOO_SMALL<br>
+ if the dptr buffer is too small,
+ - DK4_E_MATH_OVERFLOW<br>
+ if a mathematical overflow happened during a size calculation,
+ - DK4_E_NOT_FOUND<br>
+ if no file was found,
+ - DK4_E_NOT_SUPPORTED<br>
+ if wchar_t are used as dkChar on non-Windows systems.
+*/
+int
+dk4fs_data_one(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar *shortname,
+ const dkChar *dir_share,
+ const dkChar *dir_home,
+ const dkChar *name_prog,
+ const dkChar *name_group,
+ const dkChar *language,
+ const dkChar *region,
+ int passno,
+ int compressed,
+ dk4_er_t *erp
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+%% module
+
+#include "dk4fs.h"
+
+#if 0
+
+#ifndef DK4STAT_H_INCLUDED
+#include "dk4stat.h"
+#endif
+
+#ifndef DK4STATD_H_INCLUDED
+#include "dk4statd.h"
+#endif
+
+#endif
+
+#ifndef DK4FILED_H_INCLUDED
+#include "dk4filed.h"
+#endif
+
+#ifndef DK4STRD_H_INCLUDED
+#include "dk4strd.h"
+#endif
+
+
+
+
+$!trace-include
+
+
+
+/** Constant strings used by this module.
+*/
+static const dkChar * const dk4fs_kw[] = {
+$!string-table macro=dkT
+#
+# 0 ... 1 Directory names
+#
+dk4app
+.dk4app
+#
+# 2 Directory name appendix for site-specific directories
+#
+-site
+#
+# 3 ... 4 Compression suffixes
+#
+.gz
+.bz2
+#
+# 5 Language: No language
+#
+no-language
+#
+# 6 ... 7 Directory names for compatibility mode.
+#
+dk3app
+.dk3app
+$!end
+};
+
+
+
+#if DK4_HAVE_BACKSLASH_AS_SEP
+/** Path name separator.
+*/
+static const dkChar dk4fs_sep[] = { dkT("\\") };
+#else
+/** Path name separator.
+*/
+static const dkChar dk4fs_sep[] = { dkT("/") };
+#endif
+
+
+
+#if 0
+/** Check presence of regular file.
+ CRT on Windows: Optional.
+ @param fn File name.
+ @param erp Error report, may be NULL.
+ @return 1 on success (file exists and is a regular file), 0 otherwise.
+*/
+static
+int
+dk4fs_check_regular_file(
+ const dkChar *fn,
+ dk4_er_t *erp
+)
+{
+#if DK4_ON_WINDOWS && (DK4_WIN_AVOID_CRT || DK4_WIN_DENY_CRT)
+#if DK4_CHAR_SIZE > 1
+ WIN32_FIND_DATAW ffdata;
+#els
+ WIN32_FIND_DATAA ffdata;
+#endif
+ HANDLE ha;
+ DWORD dwattr;
+ int back = 0;
+#if DK4_CHAR_SIZE > 1
+ dwattr = GetFileAttributesW(fn);
+#else
+ dwattr = GetFileAttributesA(fn);
+#endif
+ if (INVALID_FILE_ATTRIBUTES == dwattr) {
+#if DK4_CHAR_SIZE > 1
+ ha = FindFirstFileW(fn, &ffdata);
+#else
+ ha = FindFirstFileA(fn, &ffdata);
+#endif
+ if (INVALID_HANDLE_VALUE != ha) {
+ dwattr = ffdata.dwFileAttributes;
+ FindClose(ha);
+ }
+ }
+ if (INVALID_FILE_ATTRIBUTES != dwattr) {
+ if ((DWORD)0UL == (FILE_ATTRIBUTE_DIRECTORY & dwattr)) {
+ if ((DWORD)0UL == (FILE_ATTRIBUTE_DEVICE & dwattr)) {
+ back = 1;
+ }
+ }
+ }
+ return back;
+#else
+ dk4_stat_t stb;
+ int back = 0;
+ if (0 != dk4stat(&stb, fn, erp)) {
+ if (0 != dk4stat_is_regular(&stb, erp)) {
+ back = 1;
+ }
+ }
+ return back;
+#endif
+}
+#endif
+
+
+
+int
+dk4fs_attempt_file_name(
+ dkChar *dptr,
+ size_t szdptr,
+ int compressed,
+ dk4_er_t *erp
+)
+{
+ dkChar *eptr; /* End of name */
+ int back = 0;
+ $? "+ dk4fs_attempt_file_name"
+ if ((NULL != dptr) && (0 < szdptr)) {
+#if DK4_ON_WINDOWS && DK4_WIN_DENY_CRT
+ /* Compression/decompression libraries depend on CRT.
+ */
+ compressed = 0;
+#endif
+ $? ". checking \"%!ds\"", dptr
+ back = dk4file_is_regular(dptr, erp);
+ $? ". result %d", back
+ if ((0 == back) && (0 != compressed)) {
+ eptr = dptr;
+ while (dkT('\0') != *eptr) { eptr++; }
+#if DK4_HAVE_ZLIB_H
+ if (0 != dk4str_cat_s(dptr, szdptr, dk4fs_kw[3], erp)) {
+ $? ". checking \"%!ds\"", dptr
+ back = dk4file_is_regular(dptr, erp);
+ $? ". result %d", back
+ }
+#endif
+#if DK4_HAVE_BZLIB_H
+ if (0 == back) {
+ *eptr = dkT('\0');
+ if (0 != dk4str_cat_s(dptr, szdptr, dk4fs_kw[4], erp)) {
+ $? ". checking \"%!ds\"", dptr
+ back = dk4file_is_regular(dptr, erp);
+ $? ". result %d", back
+ }
+ if (0 == back) {
+ *eptr = dkT('\0');
+ }
+ }
+#endif
+ }
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ } $? "- dk4fs_attempt_file_name %d", back
+ return back;
+}
+
+
+
+int
+dk4fs_construct_from_parts(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar **comp,
+ size_t ncomp,
+ int site,
+ dk4_er_t *erp
+)
+{
+ size_t i; /* Traverse comp */
+ int back = 0; /* Function result */
+ $? "+ dk4fs_construct_from_parts"
+ if ((NULL != dptr) && (0 < szdptr) && (NULL != comp) && (0 < ncomp)) {
+ for (i = 0; i < ncomp; i++) {
+ if (0 == i) {
+ if (0 == dk4str_cpy_s(dptr, szdptr, comp[0], erp)) {
+ goto finished;
+ }
+ } else {
+ if (0 != dk4str_cat_s(dptr, szdptr, dk4fs_sep, erp)) {
+ if (0 != dk4str_cat_s(dptr, szdptr, comp[i], erp)) {
+ if ((1 == i) && (0 != site)) {
+ if (0 == dk4str_cat_s(dptr, szdptr, dk4fs_kw[2], erp)) {
+ goto finished;
+ }
+ }
+ } else {
+ goto finished;
+ }
+ } else {
+ goto finished;
+ }
+ }
+ }
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ back = 1;
+ finished:
+ if (0 == back) { *dptr = dkT('\0'); }
+ $? "- dk4fs_construct_from_parts %d", back
+ return back;
+}
+
+
+
+int
+dk4fs_config_construct_compat_one(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar *shortname,
+ const dkChar *dir_share,
+ const dkChar *dir_etc,
+ const dkChar *dir_home,
+ const dkChar *name_prog,
+ const dkChar *name_group,
+ int passno,
+ int co3,
+ dk4_er_t *erp
+)
+{
+ const dkChar *ptrs[8];
+ int back = 0;
+ $? "+ dk4fs_config_construct_compact_one"
+ if ((NULL != dptr) && (0 < szdptr) && (NULL != shortname)) {
+ switch (passno) {
+ case DK4_FS_CONF_SHARE_LIB: {
+ if (NULL != dir_share) {
+ ptrs[0] = dir_share;
+ ptrs[1] = dk4fs_kw[(co3) ? (6) : (0)];
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_ETC_LIB: {
+ if (NULL != dir_etc) {
+ ptrs[0] = dir_etc;
+ ptrs[1] = dk4fs_kw[(co3) ? (6) : (0)];
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_SHARE_LIB_SITE: {
+ if (NULL != dir_share) {
+ ptrs[0] = dir_share;
+ ptrs[1] = dk4fs_kw[(co3) ? (6) : (0)];
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_ETC_LIB_SITE: {
+ if (NULL != dir_etc) {
+ ptrs[0] = dir_etc;
+ ptrs[1] = dk4fs_kw[(co3) ? (6) : (0)];
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_SHARE_GROUP: {
+ if ((NULL != dir_share) && (NULL != name_group)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_group;
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_ETC_GROUP: {
+ if ((NULL != dir_etc) && (NULL != name_group)) {
+ ptrs[0] = dir_etc;
+ ptrs[1] = name_group;
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_SHARE_GROUP_SITE: {
+ if ((NULL != dir_share) && (NULL != name_group)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_group;
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_ETC_GROUP_SITE: {
+ if ((NULL != dir_etc) && (NULL != name_group)) {
+ ptrs[0] = dir_etc;
+ ptrs[1] = name_group;
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_SHARE_APP: {
+ if ((NULL != dir_share) && (NULL != name_prog)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_prog;
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_ETC_APP: {
+ if ((NULL != dir_etc) && (NULL != name_prog)) {
+ ptrs[0] = dir_etc;
+ ptrs[1] = name_prog;
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_SHARE_APP_SITE: {
+ if ((NULL != dir_share) && (NULL != name_prog)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_prog;
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_ETC_APP_SITE: {
+ if ((NULL != dir_etc) && (NULL != name_prog)) {
+ ptrs[0] = dir_etc;
+ ptrs[1] = name_prog;
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_HOME_LIB: {
+ if (NULL != dir_home) {
+ ptrs[0] = dir_home;
+ ptrs[1] = dk4fs_kw[(co3) ? (7) : (1)];
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_HOME_GROUP: {
+ if ((NULL != dir_home) && (NULL != name_group)) {
+ ptrs[0] = dir_home;
+ ptrs[1] = dk4fs_kw[(co3) ? (7) : (1)];
+ ptrs[2] = name_group;
+ ptrs[3] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,4,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_HOME_APP: {
+ if ((NULL != dir_home) && (NULL != name_prog)) {
+ ptrs[0] = dir_home;
+ ptrs[1] = dk4fs_kw[(co3) ? (7) : (1)];
+ ptrs[2] = name_prog;
+ ptrs[3] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,4,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_CONF_CURRENT_DIR: {
+ ptrs[0] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,1,0,erp);
+ } break;
+ default: {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ } break;
+ }
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ $? "- dk4fs_config_construct_compact_one %d", back
+ return back;
+}
+
+
+
+int
+dk4fs_config_construct_one(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar *shortname,
+ const dkChar *dir_share,
+ const dkChar *dir_etc,
+ const dkChar *dir_home,
+ const dkChar *name_prog,
+ const dkChar *name_group,
+ int passno,
+ dk4_er_t *erp
+)
+{
+ return(
+ dk4fs_config_construct_compat_one(
+ dptr, szdptr, shortname, dir_share, dir_etc, dir_home,
+ name_prog, name_group, passno, 0, erp
+ )
+ );
+}
+
+
+
+int
+dk4fs_config_compat_one(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar *shortname,
+ const dkChar *dir_share,
+ const dkChar *dir_etc,
+ const dkChar *dir_home,
+ const dkChar *name_prog,
+ const dkChar *name_group,
+ int passno,
+ int co3,
+ int compressed,
+ dk4_er_t *erp
+)
+{
+ int back;
+ $? "+ dk4fs_config_compat_one \"%!ds\" %d", shortname, passno
+ back = dk4fs_config_construct_compat_one(
+ dptr, szdptr, shortname,
+ dir_share, dir_etc, dir_home,
+ name_prog, name_group, passno, co3, erp
+ );
+ if (0 != back) {
+ $? ". file name = \"%!ds\"", TR_DKSTR(dptr)
+ back = dk4fs_attempt_file_name(dptr, szdptr, compressed, erp);
+ if (0 != back) { $? ". file found = \"%!ds\"", TR_DKSTR(dptr)
+ }
+ } $? "- dk4fs_config_compat_one %d", back
+ return back;
+}
+
+
+
+int
+dk4fs_config_one(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar *shortname,
+ const dkChar *dir_share,
+ const dkChar *dir_etc,
+ const dkChar *dir_home,
+ const dkChar *name_prog,
+ const dkChar *name_group,
+ int passno,
+ int compressed,
+ dk4_er_t *erp
+)
+{
+ return (
+ dk4fs_config_compat_one(
+ dptr, szdptr, shortname,
+ dir_share, dir_etc, dir_home, name_prog, name_group,
+ passno, 0, compressed, erp
+ )
+ );
+}
+
+
+
+int
+dk4fs_data_construct_one(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar *shortname,
+ const dkChar *dir_share,
+ const dkChar *language,
+ const dkChar *region,
+ const dkChar *dir_home,
+ const dkChar *name_prog,
+ const dkChar *name_group,
+ int passno,
+ dk4_er_t *erp
+)
+{
+ const dkChar *ptrs[8];
+ int back = 0;
+ $? "+ dk4fs_data_construct_one"
+ $? ". short name = \"%!ds\"", TR_DKSTR(shortname)
+ $? ". /.../share = \"%!ds\"", TR_DKSTR(dir_share)
+ $? ". language = \"%!ds\"", TR_DKSTR(language)
+ $? ". region = \"%!ds\"", TR_DKSTR(region)
+ $? ". HOME = \"%!ds\"", TR_DKSTR(dir_home)
+ $? ". prog name = \"%!ds\"", TR_DKSTR(name_prog)
+ $? ". prog group = \"%!ds\"", TR_DKSTR(name_group)
+ $? ". pass no = %d", passno
+ if ((NULL != dptr) && (0 < szdptr) && (NULL != shortname)) {
+ switch (passno) {
+
+ case DK4_FS_DATA_SHARE_LIB: {
+ back = dk4fs_config_construct_one(
+ dptr, szdptr, shortname,
+ dir_share, NULL, dir_home,
+ name_prog, name_group, DK4_FS_CONF_SHARE_LIB, erp
+ );
+ } break;
+ case DK4_FS_DATA_SHARE_LIB_SITE: {
+ back = dk4fs_config_construct_one(
+ dptr, szdptr, shortname,
+ dir_share, NULL, dir_home,
+ name_prog, name_group, DK4_FS_CONF_SHARE_LIB_SITE, erp
+ );
+ } break;
+ case DK4_FS_DATA_SHARE_GROUP: {
+ back = dk4fs_config_construct_one(
+ dptr, szdptr, shortname,
+ dir_share, NULL, dir_home,
+ name_prog, name_group, DK4_FS_CONF_SHARE_GROUP, erp
+ );
+ } break;
+ case DK4_FS_DATA_SHARE_GROUP_SITE: {
+ back = dk4fs_config_construct_one(
+ dptr, szdptr, shortname,
+ dir_share, NULL, dir_home,
+ name_prog, name_group, DK4_FS_CONF_SHARE_GROUP_SITE, erp
+ );
+ } break;
+ case DK4_FS_DATA_SHARE_APP: {
+ back = dk4fs_config_construct_one(
+ dptr, szdptr, shortname,
+ dir_share, NULL, dir_home,
+ name_prog, name_group, DK4_FS_CONF_SHARE_APP, erp
+ );
+ } break;
+ case DK4_FS_DATA_SHARE_APP_SITE: {
+ back = dk4fs_config_construct_one(
+ dptr, szdptr, shortname,
+ dir_share, NULL, dir_home,
+ name_prog, name_group, DK4_FS_CONF_SHARE_APP_SITE, erp
+ );
+ } break;
+ case DK4_FS_DATA_SHARE_LIB_LANG: {
+ if ((NULL != dir_share) && (NULL != language)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = dk4fs_kw[0];
+ ptrs[2] = language;
+ ptrs[3] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,4,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_LIB_SITE_LANG: {
+ if ((NULL != dir_share) && (NULL != language)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = dk4fs_kw[0];
+ ptrs[2] = language;
+ ptrs[3] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,4,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_GROUP_LANG: {
+ if ((NULL != dir_share) && (NULL != language) && (NULL != name_group)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_group;
+ ptrs[2] = language;
+ ptrs[3] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,4,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_GROUP_SITE_LANG: {
+ if ((NULL != dir_share) && (NULL != language) && (NULL != name_group)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_group;
+ ptrs[2] = language;
+ ptrs[3] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,4,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_APP_LANG: {
+ if ((NULL != dir_share) && (NULL != language) && (NULL != name_prog)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_prog;
+ ptrs[2] = language;
+ ptrs[3] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,4,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_APP_SITE_LANG: {
+ if ((NULL != dir_share) && (NULL != language) && (NULL != name_prog)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_prog;
+ ptrs[2] = language;
+ ptrs[3] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,4,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_LIB_REG: {
+ if ((NULL != dir_share) && (NULL != region)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = dk4fs_kw[0];
+ ptrs[2] = dk4fs_kw[5];
+ ptrs[3] = region;
+ ptrs[4] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,5,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_LIB_SITE_REG: {
+ if ((NULL != dir_share) && (NULL != region)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = dk4fs_kw[0];
+ ptrs[2] = dk4fs_kw[5];
+ ptrs[3] = region;
+ ptrs[4] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,5,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_GROUP_REG: {
+ if ((NULL != dir_share) && (NULL != name_group) && (NULL != region)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_group;
+ ptrs[2] = dk4fs_kw[5];
+ ptrs[3] = region;
+ ptrs[4] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,5,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_GROUP_SITE_REG: {
+ if ((NULL != dir_share) && (NULL != name_group) && (NULL != region)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_group;
+ ptrs[2] = dk4fs_kw[5];
+ ptrs[3] = region;
+ ptrs[4] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,5,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_APP_REG: {
+ if ((NULL != dir_share) && (NULL != name_prog) && (NULL != region)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_prog;
+ ptrs[2] = dk4fs_kw[5];
+ ptrs[3] = region;
+ ptrs[4] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,5,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_APP_SITE_REG: {
+ if ((NULL != dir_share) && (NULL != name_prog) && (NULL != region)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_prog;
+ ptrs[2] = dk4fs_kw[5];
+ ptrs[3] = region;
+ ptrs[4] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,5,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_LIB_LANG_REG: {
+ if ((NULL != dir_share) && (NULL != language) && (NULL != region)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = dk4fs_kw[0];
+ ptrs[2] = language;
+ ptrs[3] = region;
+ ptrs[4] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,5,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_LIB_SITE_LANG_REG: {
+ if ((NULL != dir_share) && (NULL != language) && (NULL != region)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = dk4fs_kw[0];
+ ptrs[2] = language;
+ ptrs[3] = region;
+ ptrs[4] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,5,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_GROUP_LANG_REG: {
+ if ((NULL != dir_share) && (NULL != language)) {
+ if ((NULL != region) && (NULL != name_group)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_group;
+ ptrs[2] = language;
+ ptrs[3] = region;
+ ptrs[4] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,5,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_GROUP_SITE_LANG_REG: {
+ if ((NULL != dir_share) && (NULL != language)) {
+ if ((NULL != region) && (NULL != name_group)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_group;
+ ptrs[2] = language;
+ ptrs[3] = region;
+ ptrs[4] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,5,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_APP_LANG_REG: {
+ if ((NULL != dir_share) && (NULL != language)) {
+ if ((NULL != region) && (NULL != name_prog)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_prog;
+ ptrs[2] = language;
+ ptrs[3] = region;
+ ptrs[4] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,5,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_SHARE_APP_SITE_LANG_REG: {
+ if ((NULL != dir_share) && (NULL != language)) {
+ if ((NULL != region) && (NULL != name_prog)) {
+ ptrs[0] = dir_share;
+ ptrs[1] = name_prog;
+ ptrs[2] = language;
+ ptrs[3] = region;
+ ptrs[4] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,5,1,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_HOME_LIB: {
+ if (NULL != dir_home) {
+ ptrs[0] = dir_home;
+ ptrs[1] = dk4fs_kw[1];
+ ptrs[2] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,3,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_HOME_GROUP: {
+ if ((NULL != dir_home) && (NULL != name_group)) {
+ ptrs[0] = dir_home;
+ ptrs[1] = dk4fs_kw[1];
+ ptrs[2] = name_group;
+ ptrs[3] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,4,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_HOME_APP: {
+ if ((NULL != dir_home) && (NULL != name_prog)) {
+ ptrs[0] = dir_home;
+ ptrs[1] = dk4fs_kw[1];
+ ptrs[2] = name_prog;
+ ptrs[3] = shortname;
+ back = dk4fs_construct_from_parts(dptr,szdptr,ptrs,4,0,erp);
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ } break;
+ case DK4_FS_DATA_CURRENT_DIR: {
+ back = dk4str_cpy_s(dptr, szdptr, shortname, erp);
+ } break;
+ }
+ } else {
+ dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
+ }
+ $? "- dk4fs_data_construct_one %d", back
+ return back;
+}
+
+
+
+int
+dk4fs_data_one(
+ dkChar *dptr,
+ size_t szdptr,
+ const dkChar *shortname,
+ const dkChar *dir_share,
+ const dkChar *dir_home,
+ const dkChar *name_prog,
+ const dkChar *name_group,
+ const dkChar *language,
+ const dkChar *region,
+ int passno,
+ int compressed,
+ dk4_er_t *erp
+)
+{
+ int back;
+ $? "+ dk4fs_data_one %!ds %d", shortname, passno
+ back = dk4fs_data_construct_one(
+ dptr, szdptr, shortname,
+ dir_share, language, region, dir_home,
+ name_prog, name_group, passno, erp
+ );
+ if (0 != back) { $? ". test \"%!ds\"", TR_DKSTR(dptr)
+ back = dk4fs_attempt_file_name(dptr, szdptr, compressed, erp);
+ } $? "- dk4fs_data_one %d", back
+ return back;
+}
+