X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fcstrdup.h;h=59227cbe56ecea58ec160a500bc4e82a4a6a3d1c;hp=fabac81338a2f3c3a9d356129b1910a4cc80933c;hb=c279e21fc2394a7908bbd1ba8c79b116fe9fb14a;hpb=21c2e6b36d6a96c2f662a89459d607b5a387f4eb diff --git a/cinelerra-5.1/guicast/cstrdup.h b/cinelerra-5.1/guicast/cstrdup.h index fabac813..59227cbe 100644 --- a/cinelerra-5.1/guicast/cstrdup.h +++ b/cinelerra-5.1/guicast/cstrdup.h @@ -2,7 +2,9 @@ #define __CSTRDUP_H__ #include +#include #include +#include static inline char *cstrcat(int n, ...) { int len = 0; va_list va; va_start(va,n); @@ -20,4 +22,62 @@ static inline char *cstrdup(const char *cp) { #define lengthof(ary) ((int)(sizeof(ary)/sizeof(ary[0]))) #endif +static inline int butf8(const char *&cp) +{ + const unsigned char *bp = (const unsigned char *)cp; + int ret = *bp++; + if( ret >= 0x80 ) { + int v = ret - 0xc0; + static const int64_t sz = 0x5433222211111111; + int n = v < 0 ? 0 : (sz >> (v&0x3c)) & 0x0f; + for( int i=n; --i>=0; ret+=*bp++ ) ret <<= 6; + static const uint32_t ofs[6] = { + 0x00000000U, 0x00003080U, 0x000E2080U, + 0x03C82080U, 0xFA082080U, 0x82082080U + }; + ret -= ofs[n]; + } + cp = (const char *)bp; + return ret; +} +static inline int butf8(unsigned int v, char *&cp) +{ + unsigned char *bp = (unsigned char *)cp; + if( v >= 0x00000080 ) { + int i = v < 0x00000800 ? 2 : v < 0x00010000 ? 3 : + v < 0x00200000 ? 4 : v < 0x04000000 ? 5 : 6; + int m = 0xff00 >> i; + *bp++ = (v>>(6*--i)) | m; + while( --i >= 0 ) *bp++ = ((v>>(6*i)) & 0x3f) | 0x80; + } + else + *bp++ = v; + int ret = bp - (unsigned char *)cp; + cp = (char *)bp; + return ret; +} + +static inline int bstrcasecmp(const char *ap, const char *bp) +{ + int a, b, ret; + do { + a = towlower(butf8(ap)); b = towlower(butf8(bp)); + } while( !(ret=a-b) && a && b ); + return ret; +} + +static inline const char *bstrcasestr(const char *src, const char *tgt) +{ + int ssz = strlen(src), tsz = strlen(tgt), ret = 0; + const char *cp = tgt; + wchar_t wtgt[tsz + 1], *tp = wtgt; + while( *cp ) *tp++ = towlower(butf8(cp)); + for( tsz=tp-wtgt; ssz>=tsz; ++src,--ssz ) { + cp = src; tp = wtgt; + for( int i=tsz; --i>=0 && !(ret=towlower(butf8(cp))-*tp); ++tp ); + if( !ret ) return src; + } + return 0; +} + #endif