aboutsummaryrefslogtreecommitdiff
path: root/project/dclib/dclib-basics.c
diff options
context:
space:
mode:
authorWiimm <wiimm@wiimm.de>2021-02-03 16:42:38 +0100
committerWiimm <wiimm@wiimm.de>2021-02-03 16:42:38 +0100
commit69894f75254cd630e2e4fe1422044c6b7d6adb5f (patch)
tree139b93491a16987905c53c4e10bc8b44034de278 /project/dclib/dclib-basics.c
parenta3d605bc52ba3e53720d0dee29a470661b35a1c2 (diff)
SZS 2.23a
Diffstat (limited to '')
-rw-r--r--project/dclib/dclib-basics.c134
1 files changed, 133 insertions, 1 deletions
diff --git a/project/dclib/dclib-basics.c b/project/dclib/dclib-basics.c
index 2622765..7504951 100644
--- a/project/dclib/dclib-basics.c
+++ b/project/dclib/dclib-basics.c
@@ -14,7 +14,7 @@
* *
***************************************************************************
* *
- * Copyright (c) 2012-2020 by Dirk Clemens <wiimm@wiimm.de> *
+ * Copyright (c) 2012-2021 by Dirk Clemens <wiimm@wiimm.de> *
* *
***************************************************************************
* *
@@ -551,6 +551,38 @@ char * StringLowerS ( char * buf, size_t buf_size, ccp src )
return StringLowerE(buf,buf+buf_size,src);
}
+//-----------------------------------------------------------------------------
+
+char * MemLowerE ( char * buf, ccp buf_end, mem_t src )
+{
+ // RESULT: end of copied string pointing to NULL
+ // 'src.ptr' may be a NULL pointer.
+
+ if ( buf >= buf_end )
+ return (char*)buf_end - 1;
+
+ DASSERT(buf);
+ DASSERT(buf<buf_end);
+ buf_end--;
+
+ if ( src.ptr )
+ {
+ ccp src_end = src.ptr + src.len;
+ while( buf < buf_end && src.ptr < src_end )
+ *buf++ = tolower((int)*src.ptr++);
+ }
+
+ *buf = 0;
+ return buf;
+}
+
+//-----------------------------------------------------------------------------
+
+char * MemLowerS ( char * buf, size_t buf_size, mem_t src )
+{
+ return MemLowerE(buf,buf+buf_size,src);
+}
+
///////////////////////////////////////////////////////////////////////////////
char * StringUpperE ( char * buf, ccp buf_end, ccp src )
@@ -580,6 +612,38 @@ char * StringUpperS ( char * buf, size_t buf_size, ccp src )
return StringUpperE(buf,buf+buf_size,src);
}
+//-----------------------------------------------------------------------------
+
+char * MemUpperE ( char * buf, ccp buf_end, mem_t src )
+{
+ // RESULT: end of copied string pointing to NULL
+ // 'src.ptr' may be a NULL pointer.
+
+ if ( buf >= buf_end )
+ return (char*)buf_end - 1;
+
+ DASSERT(buf);
+ DASSERT(buf<buf_end);
+ buf_end--;
+
+ if ( src.ptr )
+ {
+ ccp src_end = src.ptr + src.len;
+ while( buf < buf_end && src.ptr < src_end )
+ *buf++ = toupper((int)*src.ptr++);
+ }
+
+ *buf = 0;
+ return buf;
+}
+
+//-----------------------------------------------------------------------------
+
+char * MemUpperS ( char * buf, size_t buf_size, mem_t src )
+{
+ return MemUpperE(buf,buf+buf_size,src);
+}
+
//
///////////////////////////////////////////////////////////////////////////////
/////////////// PathCat*() ///////////////
@@ -4775,6 +4839,63 @@ ccp GetKeywordOffAutoOn ( OffOn_t value )
//
///////////////////////////////////////////////////////////////////////////////
+/////////////// LOWER/AUTO/UPPER ///////////////
+///////////////////////////////////////////////////////////////////////////////
+
+const KeywordTab_t KeyTab_LOWER_AUTO_UPPER[] =
+{
+ { LOUP_LOWER, "LOWER", "LOWERCASE", 0 },
+ { LOUP_LOWER, "LOCASE", "-1", 0 },
+ { LOUP_AUTO, "AUTO", "0", 0 },
+ { LOUP_UPPER, "UPPER", "UPPERCASE", 0 },
+ { LOUP_UPPER, "UPCASE", "1", 0 },
+ { 0,0,0,0 }
+};
+
+//-----------------------------------------------------------------------------
+
+int ScanKeywordLowerAutoUpper
+(
+ // returns one of LOUP_*
+
+ ccp arg, // argument to scan
+ int on_empty, // return this value on empty
+ uint max_num, // >0: additionally accept+return number <= max_num
+ ccp object // NULL (silent) or object for error messages
+)
+{
+ if ( !arg || !*arg )
+ return on_empty;
+
+ int status;
+ const KeywordTab_t *key = ScanKeyword(&status,arg,KeyTab_LOWER_AUTO_UPPER);
+ if (key)
+ return key->id;
+
+ if ( max_num > 0 )
+ {
+ char *end;
+ const int num = str2l(arg,&end,10);
+ if ( !*end && num >= LOUP_LOWER && num <= max_num )
+ return num;
+ }
+
+ if (object)
+ PrintKeywordError(KeyTab_LOWER_AUTO_UPPER,arg,status,0,object);
+
+ return LOUP_ERROR;
+}
+
+//-----------------------------------------------------------------------------
+
+ccp GetKeywordLowerAutoUpper ( LowerUpper_t value )
+{
+ const KeywordTab_t *key = GetKewordById(KeyTab_OFF_AUTO_ON,value);
+ return key ? key->name1 : "?";
+}
+
+//
+///////////////////////////////////////////////////////////////////////////////
/////////////// scan command lists ///////////////
///////////////////////////////////////////////////////////////////////////////
@@ -7777,6 +7898,17 @@ void * dc_memrchr ( cvp src, int ch, size_t size )
return 0;
}
+///////////////////////////////////////////////////////////////////////////////
+
+bool IsMemConst ( cvp mem, uint size, u8 val )
+{
+ if (!size)
+ return true;
+
+ const u8 *src = (u8*)mem;
+ return *src == val && !memcmp(src,src+1,size-1);
+}
+
//
///////////////////////////////////////////////////////////////////////////////
/////////////// END ///////////////