/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Some of the source code in this file came from fs/cifs/cifs_unicode.c * and then via server/unicode.c * cifs_unicode: Unicode kernel case support * * Function: * Convert a unicode character to upper or lower case using * compressed tables. * * Copyright (c) International Business Machines Corp., 2000,2009 * * * Notes: * These APIs are based on the C library functions. The semantics * should match the C functions but with expanded size operands. * * The upper/lower functions are based on a table created by mkupr. * This is a compressed table of upper and lower case conversion. *
*/ #ifndef _NLS_UCS2_UTILS_H #define _NLS_UCS2_UTILS_H
/* * Windows maps these to the user defined 16 bit Unicode range since they are * reserved symbols (along with \ and /), otherwise illegal to store * in filenames in NTFS
*/ #define UNI_ASTERISK ((__u16)('*' + 0xF000)) #define UNI_QUESTION ((__u16)('?' + 0xF000)) #define UNI_COLON ((__u16)(':' + 0xF000)) #define UNI_GRTRTHAN ((__u16)('>' + 0xF000)) #define UNI_LESSTHAN ((__u16)('<' + 0xF000)) #define UNI_PIPE ((__u16)('|' + 0xF000)) #define UNI_SLASH ((__u16)('\\' + 0xF000))
/* * UniStrcat: Concatenate the second string to the first * * Returns: * Address of the first string
*/ staticinlinewchar_t *UniStrcat(wchar_t *ucs1, constwchar_t *ucs2)
{ wchar_t *anchor = ucs1; /* save a pointer to start of ucs1 */
while (*ucs1++) /*NULL*/; /* To end of first string */
ucs1--; /* Return to the null */ while ((*ucs1++ = *ucs2++)) /*NULL*/; /* copy string 2 over */ return anchor;
}
/* * UniStrchr: Find a character in a string * * Returns: * Address of first occurrence of character in string * or NULL if the character is not in the string
*/ staticinlinewchar_t *UniStrchr(constwchar_t *ucs, wchar_t uc)
{ while ((*ucs != uc) && *ucs)
ucs++;
if (*ucs == uc) return (wchar_t *)ucs; return NULL;
}
/* * UniStrcmp: Compare two strings * * Returns: * < 0: First string is less than second * = 0: Strings are equal * > 0: First string is greater than second
*/ staticinlineint UniStrcmp(constwchar_t *ucs1, constwchar_t *ucs2)
{ while ((*ucs1 == *ucs2) && *ucs1) {
ucs1++;
ucs2++;
} return (int)*ucs1 - (int)*ucs2;
}
/* * UniStrcpy: Copy a string
*/ staticinlinewchar_t *UniStrcpy(wchar_t *ucs1, constwchar_t *ucs2)
{ wchar_t *anchor = ucs1; /* save the start of result string */
while ((*ucs1++ = *ucs2++)) /*NULL*/; return anchor;
}
/* * UniStrlen: Return the length of a string (in 16 bit Unicode chars not bytes)
*/ staticinline size_t UniStrlen(constwchar_t *ucs1)
{ int i = 0;
while (*ucs1++)
i++; return i;
}
/* * UniStrnlen: Return the length (in 16 bit Unicode chars not bytes) of a * string (length limited)
*/ staticinline size_t UniStrnlen(constwchar_t *ucs1, int maxlen)
{ int i = 0;
while (*ucs1++) {
i++; if (i >= maxlen) break;
} return i;
}
while (*ucs1++) /*NULL*/;
ucs1--; /* point to null terminator of s1 */ while (n-- && (*ucs1 = *ucs2)) { /* copy s2 after s1 */
ucs1++;
ucs2++;
}
*ucs1 = 0; /* Null terminate the result */ return anchor;
}
while (n-- && *ucs2) /* Copy the strings */
*ucs1++ = *ucs2++;
n++; while (n--) /* Pad with nulls */
*ucs1++ = 0; return anchor;
}
/* * UniStrncpy_le: Copy length limited string with pad to little-endian
*/ staticinlinewchar_t *UniStrncpy_le(wchar_t *ucs1, constwchar_t *ucs2, size_t n)
{ wchar_t *anchor = ucs1;
while (n-- && *ucs2) /* Copy the strings */
*ucs1++ = __le16_to_cpu(*ucs2++);
n++; while (n--) /* Pad with nulls */
*ucs1++ = 0; return anchor;
}
/* * UniStrstr: Find a string in a string * * Returns: * Address of first match found * NULL if no matching string is found
*/ staticinlinewchar_t *UniStrstr(constwchar_t *ucs1, constwchar_t *ucs2)
{ constwchar_t *anchor1 = ucs1; constwchar_t *anchor2 = ucs2;
while (*ucs1) { if (*ucs1 == *ucs2) { /* Partial match found */
ucs1++;
ucs2++;
} else { if (!*ucs2) /* Match found */ return (wchar_t *)anchor1;
ucs1 = ++anchor1; /* No match */
ucs2 = anchor2;
}
}
if (!*ucs2) /* Both end together */ return (wchar_t *)anchor1; /* Match found */ return NULL; /* No match */
}
#ifndef UNIUPR_NOUPPER /* * UniToupper: Convert a unicode character to upper case
*/ staticinlinewchar_t UniToupper(registerwchar_t uc)
{ registerconststruct UniCaseRange *rp;
if (uc < sizeof(NlsUniUpperTable)) { /* Latin characters */ return uc + NlsUniUpperTable[uc]; /* Use base tables */
}
rp = NlsUniUpperRange; /* Use range tables */ while (rp->start) { if (uc < rp->start) /* Before start of range */ return uc; /* Uppercase = input */ if (uc <= rp->end) /* In range */ return uc + rp->table[uc - rp->start];
rp++; /* Try next range */
} return uc; /* Past last range */
}
/* * UniStrupr: Upper case a unicode string
*/ staticinline __le16 *UniStrupr(register __le16 *upin)
{ register __le16 *up;
up = upin; while (*up) { /* For all characters */
*up = cpu_to_le16(UniToupper(le16_to_cpu(*up)));
up++;
} return upin; /* Return input pointer */
} #endif/* UNIUPR_NOUPPER */
#endif/* _NLS_UCS2_UTILS_H */
Messung V0.5
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.