diff options
| author | Wiimm <wiimm@wiimm.de> | 2022-12-25 08:25:56 +0100 |
|---|---|---|
| committer | Wiimm <wiimm@wiimm.de> | 2022-12-25 08:25:56 +0100 |
| commit | 7d8344f3637d59b982c2ca0b1d8fd2889ec5d4a6 (patch) | |
| tree | 19b070a98ba1d659b64c19e3402038bc76e11b47 /project/dclib | |
| parent | 0e143e393d99ebb00cb14ffaa4c50efeec3729f1 (diff) | |
SZS v2.32a
Diffstat (limited to 'project/dclib')
| -rw-r--r-- | project/dclib/dclib-basics.c | 260 | ||||
| -rw-r--r-- | project/dclib/dclib-basics.h | 69 | ||||
| -rw-r--r-- | project/dclib/dclib-color.c | 9 | ||||
| -rw-r--r-- | project/dclib/dclib-file.c | 77 | ||||
| -rw-r--r-- | project/dclib/dclib-file.h | 3 | ||||
| -rw-r--r-- | project/dclib/lib-mkw-def.h | 25 | ||||
| -rw-r--r-- | project/dclib/lib-mkw.c | 70 | ||||
| -rw-r--r-- | project/dclib/lib-mkw.h | 11 |
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 /////////////// |
