%% 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
if dptr is NULL or szdptr is 0,
- DK4_E_NOT_SUPPORTED
if wchar_t are used as dkChar on non-Windows systems,
- DK4_E_NOT_FOUND
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
if dptr or comp is NULL or szdptr or ncomp is 0,
- DK4_E_BUFFER_TOO_SMALL
if the dptr buffer is too small,
- DK4_E_MATH_OVERFLOW
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
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
if the dptr buffer is too small,
- DK4_E_MATH_OVERFLOW
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
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
if the dptr buffer is too small,
- DK4_E_MATH_OVERFLOW
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
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
if the dptr buffer is too small,
- DK4_E_MATH_OVERFLOW
if a mathematical overflow happened during a size calculation,
- DK4_E_NOT_FOUND
if no file was found,
- DK4_E_NOT_SUPPORTED
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
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
if the dptr buffer is too small,
- DK4_E_MATH_OVERFLOW
if a mathematical overflow happened during a size calculation,
- DK4_E_NOT_FOUND
if no file was found,
- DK4_E_NOT_SUPPORTED
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
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
if the dptr buffer is too small,
- DK4_E_MATH_OVERFLOW
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
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
if the dptr buffer is too small,
- DK4_E_MATH_OVERFLOW
if a mathematical overflow happened during a size calculation,
- DK4_E_NOT_FOUND
if no file was found,
- DK4_E_NOT_SUPPORTED
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;
}