aboutsummaryrefslogtreecommitdiff
path: root/project/dclib
diff options
context:
space:
mode:
authorWiimm <wiimm@wiimm.de>2022-12-25 08:25:56 +0100
committerWiimm <wiimm@wiimm.de>2022-12-25 08:25:56 +0100
commit7d8344f3637d59b982c2ca0b1d8fd2889ec5d4a6 (patch)
tree19b070a98ba1d659b64c19e3402038bc76e11b47 /project/dclib
parent0e143e393d99ebb00cb14ffaa4c50efeec3729f1 (diff)
SZS v2.32a
Diffstat (limited to '')
-rw-r--r--project/dclib/dclib-basics.c260
-rw-r--r--project/dclib/dclib-basics.h69
-rw-r--r--project/dclib/dclib-color.c9
-rw-r--r--project/dclib/dclib-file.c77
-rw-r--r--project/dclib/dclib-file.h3
-rw-r--r--project/dclib/lib-mkw-def.h25
-rw-r--r--project/dclib/lib-mkw.c70
-rw-r--r--project/dclib/lib-mkw.h11
8 files changed, 490 insertions, 34 deletions
diff --git a/project/dclib/dclib-basics.c b/project/dclib/dclib-basics.c
index c50f95a..c1eabd9 100644
--- a/project/dclib/dclib-basics.c
+++ b/project/dclib/dclib-basics.c
@@ -337,8 +337,16 @@ int GetProgramPath
ccp *ptr;
for ( ptr = tab; *ptr; ptr++ )
+ {
if ( realpath(*ptr,path) && *path )
+ {
+ #if __CYGWIN__
+ if (!memcmp(path,"/SZS/",5))
+ return StringCat2S(buf,buf_size,"/cygdrive/c/Program Files/Wiimm",path) - buf;
+ #endif
return StringCopyS(buf,buf_size,path) - buf;
+ }
+ }
}
#endif // !__APPLE__
@@ -504,6 +512,48 @@ char * StringCat2S ( char * buf, ssize_t buf_size, ccp src1, ccp src2 )
///////////////////////////////////////////////////////////////////////////////
+char * StringCat2LE ( char * buf, ccp buf_end, ccp src1, int len1, ccp src2, int len2 )
+{
+ // RESULT: end of copied string pointing to NULL
+ // 'src*' may be a NULL pointer.
+
+ DASSERT(buf);
+ DASSERT(buf<buf_end);
+ buf_end--;
+
+ if (src1)
+ {
+ if ( len1 < 0 )
+ len1 = strlen(src1);
+ if ( len1 > buf_end - buf )
+ len1 = buf_end - buf;
+ while( len1-- > 0 )
+ *buf++ = *src1++;
+ }
+
+ if (src2)
+ {
+ if ( len2 < 0 )
+ len2 = strlen(src2);
+ if ( len2 > buf_end - buf )
+ len2 = buf_end - buf;
+ while( len2-- > 0 )
+ *buf++ = *src2++;
+ }
+
+ *buf = 0;
+ return buf;
+}
+
+//-----------------------------------------------------------------------------
+
+char * StringCat2LS ( char * buf, ssize_t buf_size, ccp src1, int len1, ccp src2, int len2 )
+{
+ return StringCat2LE(buf,buf+buf_size,src1,len1,src2,len2);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
char * StringCatSep2E ( char * buf, ccp buf_end, ccp sep, ccp src1, ccp src2 )
{
// RESULT: end of copied string pointing to NULL
@@ -579,6 +629,60 @@ char * StringCat3S ( char * buf, ssize_t buf_size, ccp src1, ccp src2, ccp src3
///////////////////////////////////////////////////////////////////////////////
+char * StringCat3LE ( char * buf, ccp buf_end,
+ ccp src1, int len1, ccp src2, int len2, ccp src3, int len3 )
+{
+ // RESULT: end of copied string pointing to NULL
+ // 'src*' may be a NULL pointer.
+
+ DASSERT(buf);
+ DASSERT(buf<buf_end);
+ buf_end--;
+
+ if (src1)
+ {
+ if ( len1 < 0 )
+ len1 = strlen(src1);
+ if ( len1 > buf_end - buf )
+ len1 = buf_end - buf;
+ while( len1-- > 0 )
+ *buf++ = *src1++;
+ }
+
+ if (src2)
+ {
+ if ( len2 < 0 )
+ len2 = strlen(src2);
+ if ( len2 > buf_end - buf )
+ len2 = buf_end - buf;
+ while( len2-- > 0 )
+ *buf++ = *src2++;
+ }
+
+ if (src3)
+ {
+ if ( len3 < 0 )
+ len3 = strlen(src3);
+ if ( len3 > buf_end - buf )
+ len3 = buf_end - buf;
+ while( len3-- > 0 )
+ *buf++ = *src3++;
+ }
+
+ *buf = 0;
+ return buf;
+}
+
+//-----------------------------------------------------------------------------
+
+char * StringCat3LS ( char * buf, ssize_t buf_size,
+ ccp src1, int len1, ccp src2, int len2, ccp src3, int len3 )
+{
+ return StringCat3LE(buf,buf+buf_size,src1,len1,src2,len2,src3,len3);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
char * StringCatSep3E
( char * buf, ccp buf_end, ccp sep, ccp src1, ccp src2, ccp src3 )
{
@@ -651,6 +755,24 @@ char * StringCat3A ( ccp src1, ccp src2, ccp src3 )
///////////////////////////////////////////////////////////////////////////////
+char * StringCat2LA ( ccp src1, int len1, ccp src2, int len2 )
+{
+ mem_t mem = MemCat2A( MemByStringS(src1,len1), MemByStringS(src2,len2) );
+ return (char*)mem.ptr;
+}
+
+//-----------------------------------------------------------------------------
+
+char * StringCat3LA ( ccp src1, int len1, ccp src2, int len2, ccp src3, int len3 )
+{
+ mem_t mem = MemCat3A( MemByStringS(src1,len1),
+ MemByStringS(src2,len2),
+ MemByStringS(src3,len3) );
+ return (char*)mem.ptr;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
char * StringCatSep2A ( ccp sep, ccp src1, ccp src2 )
{
mem_t mem = MemCatSep2A( MemByString0(sep),
@@ -6207,6 +6329,144 @@ const KeywordTab_t * ScanKeywordEx
}
///////////////////////////////////////////////////////////////////////////////
+// new keyword list interface
+
+s64 ScanKeywordListP
+(
+ KeyListParam_t * par, // NULL or parameters and extended result
+ ccp arg, // NULL or argument to scan
+ int arg_len, // length of 'arg', if <0 then terminate at NULL or semicolon
+ u64 start_val, // start value for 'result'
+ const KeywordTab_t * key_tab // pointer to valid command table
+)
+{
+ KeyListParam_t localpar;
+ if (!par)
+ {
+ memset(&localpar,0,sizeof(localpar));
+ localpar.force_case = LOUP_UPPER;
+ localpar.allow_prefix = true;
+ localpar.err_code = ERR_SYNTAX;
+ par = &localpar;
+ }
+
+ par->valid = true;
+ par->result = start_val;
+ par->err_count = 0;
+
+ if (!arg)
+ {
+ arg = "";
+ arg_len = 0;
+ }
+ else if ( arg_len < 0 )
+ {
+ ccp semicolon = strchr(arg,';');
+ arg_len = semicolon ? semicolon - arg : strlen(arg);
+ }
+ ccp arg_end = arg + arg_len;
+
+
+ for(;;)
+ {
+ while ( arg < arg_end && (uchar)*arg <= ' ' || *arg == ',' || *arg == '.' )
+ arg++;
+
+ if ( arg >= arg_end )
+ break;
+
+ ccp key = arg;
+ while ( arg < arg_end && (uchar)*arg > ' ' && *arg != ',' && *arg != '.' && *arg != ';'
+ && ( *arg != '+' || arg == key ))
+ {
+ arg++;
+ }
+
+ int prefix = 0, abbrev_count;
+ const KeywordTab_t * cptr = ScanKeywordEx(&abbrev_count,key,arg-key,par->force_case,key_tab);
+ if ( !cptr && par->allow_prefix && key[1]
+ && ( *key == '+' || *key == '-' || *key == '/' || *key == '=' ))
+ {
+ prefix = *key == '/' ? '-' : *key;
+ cptr = ScanKeywordEx(&abbrev_count,key+1,arg-key-1,par->force_case,key_tab);
+ }
+
+ if (abbrev_count)
+ {
+ if ( par->min_number >= 0 && par->max_number < 0 && par->min_number <= (u64)par->max_number )
+ {
+ // scan unsigned number
+ char *end;
+ u64 num = str2ull(key,&end,10);
+ if ( end == arg && num >= par->min_number && num <= (u64)par->max_number )
+ {
+ par->number = num;
+ par->have_number = true;
+ continue;
+ }
+ }
+ else if ( par->min_number < par->max_number )
+ {
+ // scan signed number
+ char *end;
+ s64 num = str2ll(key,&end,10);
+ if ( end == arg && num >= par->min_number && num <= par->max_number )
+ {
+ par->number = num;
+ par->have_number = true;
+ continue;
+ }
+ }
+ }
+
+ if ( !cptr || cptr->opt && prefix && prefix != '+' )
+ {
+ if (par->err_msg)
+ {
+ if ( abbrev_count > 1 )
+ ERROR0(par->err_code,"%s: Ambiguous keyword: %s\n",par->err_msg,key);
+ else
+ ERROR0(par->err_code,"%s: Unknown keyword: %s\n",par->err_msg,key);
+ }
+ else if (par->err_code)
+ {
+ if ( abbrev_count > 1 )
+ ERROR0(par->err_code,"Ambiguous keyword: %s\n",key);
+ else
+ ERROR0(par->err_code,"Unknown keyword: %s\n",key);
+ }
+ par->err_count++;
+ if ( par->err_mode & 1 )
+ continue;
+ par->result = ~0ull;
+ par->valid = false;
+ break;
+ }
+
+ if (par->func)
+ {
+ const int stat = par->func(key,arg-key,par,key_tab,cptr,prefix);
+ if ( stat < 0 && !(par->err_mode & 1) )
+ break;
+ if (stat)
+ prefix = 0;
+ }
+
+ switch (prefix)
+ {
+ case 0:
+ case '+': par->result = par->result & ~cptr->opt | cptr->id; break;
+ case '-': par->result &= ~cptr->id; break;
+ case '=': par->result = cptr->id; break;
+ }
+ }
+
+ return par->result;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+// old keyword list interface
s64 ScanKeywordListEx
(
diff --git a/project/dclib/dclib-basics.h b/project/dclib/dclib-basics.h
index 99eb0c3..f7cda91 100644
--- a/project/dclib/dclib-basics.h
+++ b/project/dclib/dclib-basics.h
@@ -1514,6 +1514,14 @@ char * StringCat3E ( char *buf, ccp buf_end, ccp src1, ccp src2, ccp src3 );
char * StringCat2A ( ccp src1, ccp src2 );
char * StringCat3A ( ccp src1, ccp src2, ccp src3 );
+// like above, but with length(src). If <0: use strlen()
+char * StringCat2LS ( char * buf, ssize_t buf_size, ccp src1, int len1, ccp src2, int len2 );
+char * StringCat3LS ( char * buf, ssize_t buf_size, ccp src1, int len1, ccp src2, int len2, ccp src3, int len3 );
+char * StringCat2LE ( char * buf, ccp buf_end, ccp src1, int len1, ccp src2, int len2 );
+char * StringCat3LE ( char * buf, ccp buf_end, ccp src1, int len1, ccp src2, int len2, ccp src3, int len3 );
+char * StringCat2LA ( ccp src1, int len1, ccp src2, int len2 );
+char * StringCat3LA ( ccp src1, int len1, ccp src2, int len2, ccp src3, int len3 );
+
// like above, but cat with separators
char * StringCatSep2S ( char *buf, ssize_t bufsize, ccp sep, ccp src1, ccp src2 );
char * StringCatSep3S ( char *buf, ssize_t bufsize, ccp sep, ccp src1, ccp src2, ccp src3 );
@@ -3463,8 +3471,69 @@ static inline const KeywordTab_t * ScanKeyword
return ScanKeywordEx(res_abbrev,arg,-1,LOUP_UPPER,key_tab);
}
+///////////////////////////////////////////////////////////////////////////////
+// new keyword list interface
+
+typedef struct KeyListParam_t KeyListParam_t;
+
+typedef int (*KeywordListFunc)
+(
+ ccp name, // name of option as written
+ uint name_len, // length of 'name'
+ KeyListParam_t *par, // parameters and current result
+ const KeywordTab_t *key_tab, // valid pointer to command table
+ const KeywordTab_t *key, // valid pointer to found command
+ char prefix // 0 | '-' | '+' | '='
+);
+
//-----------------------------------------------------------------------------
+typedef struct KeyListParam_t
+{
+ // standard input settings
+ bool allow_prefix; // allow '-' | '+' | '=' as prefix
+ LowerUpper_t force_case; // change case of scanned arg if LOUP_LOWER|LOUP_UPPER
+
+ // call back funtion
+ KeywordListFunc func; // NULL or calculation function
+ void *user_param; // user defined parameter
+
+ // Scan for integer numbers, if min_number < max_number
+ // special case: if min_number >= 0 && max_number < 0 && min_number < (u64)max_number,
+ // then scan for unsigned number
+ s64 min_number; // input: minimal number
+ s64 max_number; // input: maximal number
+ s64 number; // output: scanned number if 'have_number'
+ bool have_number; // output: if TRUE: 'number' is valid
+
+ // error management
+ uint err_mode; // bit field:
+ // 1: continue on error
+ ccp err_msg; // not NULL: print a warning message:
+ // "<ERR_MSG>: Unknown keyword: <KEY>"
+ enumError err_code; // use 'err_code' for the 'err_msg'
+
+ // main result, will be set to 0
+ bool valid; // TRUE: returned value is valid
+ u64 result; // main result
+ uint err_count; // count errors here
+}
+KeyListParam_t;
+
+//-----------------------------------------------------------------------------
+
+s64 ScanKeywordListP
+(
+ KeyListParam_t * par, // NULL or parameters and extended result
+ ccp arg, // NULL or argument to scan
+ int arg_len, // length of 'arg', if <0 then terminate at NULL or semicolon
+ u64 start_val, // start value for 'result'
+ const KeywordTab_t * key_tab // pointer to valid command table
+);
+
+///////////////////////////////////////////////////////////////////////////////
+// old keyword list interface
+
s64 ScanKeywordListEx
(
ccp arg, // argument to scan
diff --git a/project/dclib/dclib-color.c b/project/dclib/dclib-color.c
index eaff47a..05e7b67 100644
--- a/project/dclib/dclib-color.c
+++ b/project/dclib/dclib-color.c
@@ -45,6 +45,7 @@
#include "dclib-color.h"
#include "dclib-basics.h"
+#include "dclib-file.h"
#include "dclib-utf8.h"
#ifdef DCLIB_TERMINAL
@@ -3925,7 +3926,7 @@ const ColorSet_t * GetColorSet ( ColorMode_t col_mode )
const ColorSet_t * GetFileColorSet ( FILE *f )
{
- return GetColorSet(GetFileColorized(f));
+ return GetColorSet(GetFileColorized(f));
}
///////////////////////////////////////////////////////////////////////////////
@@ -5080,6 +5081,10 @@ ColorMode_t GetFileColorized ( FILE *f )
if (!stdmsg)
SetupStdMsg();
+ // assume original stdout if 'f' is pager-input
+ if ( f && f == pager_file )
+ f = pager_stdout;
+
return !f ? COLMD_OFF
: f == stdlog && colorize_stdlog != COLMD_AUTO ? colorize_stdlog
: f == stdout && colorize_stdout != COLMD_AUTO ? colorize_stdout
@@ -5088,7 +5093,7 @@ ColorMode_t GetFileColorized ( FILE *f )
: f == stdwrn && colorize_stdwrn != COLMD_AUTO ? colorize_stdwrn
: opt_colorize >= COLMD_ON ? opt_colorize
: opt_colorize == COLMD_AUTO && isatty(fileno(f))
- ? COLMD_AUTO
+ ? COLMD_ON
: COLMD_OFF;
}
diff --git a/project/dclib/dclib-file.c b/project/dclib/dclib-file.c
index 08ba1cc..24975e3 100644
--- a/project/dclib/dclib-file.c
+++ b/project/dclib/dclib-file.c
@@ -57,6 +57,14 @@
#include "dclib-debug.h"
#include "dclib-network.h"
+///////////////////////////////////////////////////////////////////////////////
+
+#ifdef __CYGWIN__
+ #define ENABLE_CYGWIN_TEST 0
+#else
+ #define ENABLE_CYGWIN_TEST 0
+#endif
+
//
///////////////////////////////////////////////////////////////////////////////
/////////////// termios support ///////////////
@@ -252,6 +260,13 @@ int PrintLogFile ( LogFile_t *lf, ccp format, ... )
/////////////// search tool ///////////////
///////////////////////////////////////////////////////////////////////////////
+enum // search attrib
+{
+ SEATT_CMD_LINE = 0x01, // result is a complete command line
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
exmem_t SearchToolByPATH ( ccp tool )
{
exmem_t dest = {};
@@ -260,25 +275,27 @@ exmem_t SearchToolByPATH ( ccp tool )
char fname[PATH_MAX];
if (strchr(tool,'/'))
{
-//PRINT1("SEARCH ABS: %s\n",tool);
+PRINT0("SEARCH ABS: %s\n",tool);
struct stat st;
if ( !stat(tool,&st) && st.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH) )
{
-//PRINT1("FOUND ABS: %s\n",tool);
+PRINT0("FOUND ABS: %s\n",tool);
AssignExMemS(&dest,tool,-1,CPM_COPY);
}
}
else
{
- #ifdef __CYGWINxxx__
- if ( ProgInfo.progpath && *ProgInfo.progpath )
+ #ifdef __CYGWIN__
+ ccp progdir = ProgramDirectory();
+PRINT0("progdir=%s\n",progdir);
+ if ( progdir && *progdir )
{
- PathCatPP(fname,sizeof(fname),ProgInfo.progpath,tool);
-//PRINT1("SEARCH+: %s\n",fname);
+ PathCatPPE(fname,sizeof(fname),progdir,tool,".exe");
+PRINT0("SEARCH+: %s\n",fname);
struct stat st;
if ( !stat(fname,&st) && st.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH) )
{
-//PRINT1("FOUND+: %s\n",fname);
+PRINT0("FOUND+: %s\n",fname);
AssignExMemS(&dest,fname,-1,CPM_COPY);
return dest;
}
@@ -298,11 +315,11 @@ exmem_t SearchToolByPATH ( ccp tool )
break;
const int flen = snprintf(fname,sizeof(fname),"%.*s/%s",len,start,tool);
-//PRINT1("SEARCH: %s\n",fname);
+PRINT0("SEARCH: %s\n",fname);
struct stat st;
if ( !stat(fname,&st) && st.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH) )
{
-//PRINT1("FOUND: %s\n",fname);
+PRINT0("FOUND: %s\n",fname);
AssignExMemS(&dest,fname,flen,CPM_COPY);
break;
}
@@ -332,13 +349,13 @@ exmem_t SearchToolByList ( ccp * list, int max )
ccp arg = *list++;
if (arg)
{
-//PRINT1("SEARCH: %s\n",arg);
if ( *arg == '>' )
{
ccp env = getenv(arg+1);
if ( env && *env )
{
AssignExMemS(&dest,env,-1,CPM_LINK);
+ dest.attrib = SEATT_CMD_LINE;
break;
}
}
@@ -362,7 +379,8 @@ exmem_t SearchToolByList ( ccp * list, int max )
/////////////// pipe to pager ///////////////
///////////////////////////////////////////////////////////////////////////////
-static FILE *pager_file = 0;
+FILE *pager_file = 0; // NULL or pipe to pager
+FILE *pager_stdout = 0; // NULL output of pager
///////////////////////////////////////////////////////////////////////////////
@@ -390,30 +408,32 @@ FILE * OpenPipeToPager()
">DC_PAGER1",
">DC_PAGER2",
">PAGER",
- #ifdef __CYGWINxxx__
- "/usr/bin/less",
- "/cygdrive/c/Program Files/Wiimm/SZS/less",
- "/usr/bin/more",
- "/cygdrive/c/Program Files/Wiimm/SZS/more",
- #endif
"less",
"more",
+ #ifdef __CYGWIN__
+ "less.exe",
+ "/usr/bin/less.exe",
+ "more.exe",
+ "/usr/bin/more.exe",
+ #endif
0
};
exmem_t pager = SearchToolByList(search_tab,-1);
if (pager.data.ptr)
{
- #ifdef __CYGWINxxx__
-PRINT1("popen(%s)\n",pager.data.ptr);
- char buf[500];
- StringCat3S(buf,sizeof(buf),"'",pager.data.ptr,"'");
-PRINT1("popen(%s)\n",buf);
- pager_file = popen(buf,"we");
-PRINT_IF1(!pager_file,"popen(%s) FAILED\n",buf);
- #else
- pager_file = popen(pager.data.ptr,"we");
- #endif
+ if ( !(pager.attrib & SEATT_CMD_LINE) && strchr(pager.data.ptr,' '))
+ {
+ char buf[500];
+ StringCat3S(buf,sizeof(buf),"'",pager.data.ptr,"'");
+ pager_file = popen(buf,"we");
+PRINT0("popen(%s) = %p\n",buf,pager_file);
+ }
+ else
+ {
+ pager_file = popen(pager.data.ptr,"we");
+PRINT0("popen(%s) = %p\n",pager.data.ptr,pager_file);
+ }
}
FreeExMem(&pager);
}
@@ -427,7 +447,7 @@ void ClosePagerFile()
{
if (pager_file)
{
- if ( stdout == pager_file ) stdout = 0;
+ if ( stdout == pager_file ) stdout = pager_stdout;
if ( stderr == pager_file ) stderr = 0;
if ( stdwrn == pager_file ) stdwrn = 0;
if ( stdlog == pager_file ) stdlog = 0;
@@ -444,6 +464,7 @@ bool StdoutToPager()
if (f)
{
fflush(stdout);
+ pager_stdout = stdout;
stdout = f;
if ( stderr && isatty(fileno(stderr)) )
diff --git a/project/dclib/dclib-file.h b/project/dclib/dclib-file.h
index 010e6b0..9d37f0e 100644
--- a/project/dclib/dclib-file.h
+++ b/project/dclib/dclib-file.h
@@ -94,6 +94,9 @@ int PrintLogFile ( LogFile_t *lf, ccp format, ... )
exmem_t SearchToolByPATH ( ccp tool );
exmem_t SearchToolByList ( ccp * list, int max ); // max<0: NULL is list terminator
+extern FILE *pager_file; // NULL or pipe to pager
+extern FILE *pager_stdout; // NULL output of pager
+
FILE * OpenPipeToPager();
void ClosePagerFile();
bool StdoutToPager();
diff --git a/project/dclib/lib-mkw-def.h b/project/dclib/lib-mkw-def.h
index df5c85f..a699197 100644
--- a/project/dclib/lib-mkw-def.h
+++ b/project/dclib/lib-mkw-def.h
@@ -120,6 +120,31 @@ LecodeFlags_t;
//
///////////////////////////////////////////////////////////////////////////////
+///////////////////////// Distrib Track Attributes ////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+// [[DistribFlags_t]]
+typedef enum DistribFlags_t
+{
+ G_DTA_BOOST = 0x0001, // is a boost track
+ G_DTA_NEW = 0x0002, // new track
+ G_DTA_AGAIN = 0x0004, // track is back again
+ G_DTA_UPDATE = 0x0008, // updated track
+ G_DTA_FILL = 0x0010, // updated track
+ G_DTA_IS_D = 0x0100, // is a _d file
+ G_DTA_TITLE = 0x0200, // track marked as title-only
+ G_DTA_HIDDEN = 0x0400, // track marked as hidden
+ G_DTA_ORIGINAL = 0x0800, // track marked as original
+ G_DTA__STATUS = 0x001e, // relevant for status column
+ G_DTA__ALL = 0x0f1f,
+ G_DTA_F_CALCULATED = 0x1000, // flags already calculated
+}
+DistribFlags_t;
+
+#define DB_DTA_TYPE "smallint unsigned"
+
+//
+///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////// misc //////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
diff --git a/project/dclib/lib-mkw.c b/project/dclib/lib-mkw.c
index bdbf80b..610e0d1 100644
--- a/project/dclib/lib-mkw.c
+++ b/project/dclib/lib-mkw.c
@@ -1447,6 +1447,76 @@ ccp PrintLEFL16 ( le_flags_t flags, bool aligned )
//
///////////////////////////////////////////////////////////////////////////////
+/////////////// distribution flags ///////////////
+///////////////////////////////////////////////////////////////////////////////
+
+DistribFlags_t ScanDTA ( ccp text )
+{
+ // automatic flags are not scannend!
+
+ DistribFlags_t res = 0;
+ if (text)
+ {
+ while ( *text )
+ {
+ const int ch = tolower(*text++);
+ switch (ch)
+ {
+ case 'b': res |= G_DTA_BOOST; break;
+ case 'n': res |= G_DTA_NEW; break;
+ case 'a': res |= G_DTA_AGAIN; break;
+ case 'u': res |= G_DTA_UPDATE; break;
+ case 'f': res |= G_DTA_FILL; break;
+ case 'd': res |= G_DTA_IS_D; break;
+ case 't': res |= G_DTA_TITLE; break;
+ case 'h': res |= G_DTA_HIDDEN; break;
+ case 'o': res |= G_DTA_ORIGINAL; break;
+ }
+ }
+ }
+ return res;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+ccp PrintDTA ( DistribFlags_t flags, bool aligned )
+{
+ char *buf = GetCircBuf(10);
+
+ if (aligned)
+ {
+ buf[0] = flags & G_DTA_BOOST ? 'B' : '-';
+ buf[1] = flags & G_DTA_NEW ? 'N' : '-';
+ buf[2] = flags & G_DTA_AGAIN ? 'A' : '-';
+ buf[3] = flags & G_DTA_UPDATE ? 'U' : '-';
+ buf[4] = flags & G_DTA_FILL ? 'F' : '-';
+ buf[5] = flags & G_DTA_IS_D ? 'd' : '-';
+ buf[6] = flags & G_DTA_TITLE ? 't' : '-';
+ buf[7] = flags & G_DTA_HIDDEN ? 'h' : '-';
+ buf[8] = flags & G_DTA_ORIGINAL ? 'o' : '-';
+ buf[9] = 0;
+ }
+ else
+ {
+ char *d = buf;
+ if ( flags & G_DTA_BOOST ) *d++ = 'B';
+ if ( flags & G_DTA_NEW ) *d++ = 'N';
+ if ( flags & G_DTA_AGAIN ) *d++ = 'A';
+ if ( flags & G_DTA_UPDATE ) *d++ = 'U';
+ if ( flags & G_DTA_FILL ) *d++ = 'F';
+ if ( flags & G_DTA_IS_D ) *d++ = 'd';
+ if ( flags & G_DTA_TITLE ) *d++ = 't';
+ if ( flags & G_DTA_HIDDEN ) *d++ = 'a';
+ if ( flags & G_DTA_ORIGINAL ) *d++ = 'o';
+ if ( d == buf )
+ *d++ = '-';
+ *d = 0;
+ }
+ return buf;
+}
+
+//
+///////////////////////////////////////////////////////////////////////////////
/////////////// random slots ///////////////
///////////////////////////////////////////////////////////////////////////////
diff --git a/project/dclib/lib-mkw.h b/project/dclib/lib-mkw.h
index 2801ece..b3179df 100644
--- a/project/dclib/lib-mkw.h
+++ b/project/dclib/lib-mkw.h
@@ -470,13 +470,10 @@ static inline bool IsRandomLEFL ( le_flags_t flags )
{ return (flags&(G_LEFL_RND_HEAD|G_LEFL_RND_GROUP)) != 0; }
//-----------------------------------------------------------------------------
-// scan lecode flags
+// lecode flags (G_LEFL_*)
le_flags_t ScanLEFL ( ccp text );
-//-----------------------------------------------------------------------------
-// print lecode flags
-
ccp PrintLEFL8 ( le_flags_t flags, bool aligned );
ccp PrintLEFL16 ( le_flags_t flags, bool aligned );
@@ -487,6 +484,12 @@ typedef ccp (*PrintLEFL_func) ( le_flags_t flags, bool aligned );
static inline PrintLEFL_func GetPrintLEFL ( uint flags_bits )
{ return flags_bits == 16 ? PrintLEFL16 : PrintLEFL8; }
+//-----------------------------------------------------------------------------
+// distrib flags (G_DTA_*)
+
+DistribFlags_t ScanDTA ( ccp text );
+ccp PrintDTA ( DistribFlags_t flags, bool aligned );
+
//
///////////////////////////////////////////////////////////////////////////////
/////////////// END ///////////////