diff options
Diffstat (limited to '')
| -rw-r--r-- | project/dclib/dclib-basics.c | 260 |
1 files changed, 260 insertions, 0 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 ( |
