162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) International Business Machines Corp., 2000-2002 462306a36Sopenharmony_ci * Portions Copyright (C) Christoph Hellwig, 2001-2002 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#ifndef _H_JFS_UNICODE 762306a36Sopenharmony_ci#define _H_JFS_UNICODE 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/slab.h> 1062306a36Sopenharmony_ci#include <asm/byteorder.h> 1162306a36Sopenharmony_ci#include "../nls/nls_ucs2_data.h" 1262306a36Sopenharmony_ci#include "jfs_types.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ciextern int get_UCSname(struct component_name *, struct dentry *); 1562306a36Sopenharmony_ciextern int jfs_strfromUCS_le(char *, const __le16 *, int, struct nls_table *); 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define free_UCSname(COMP) kfree((COMP)->name) 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* 2062306a36Sopenharmony_ci * UniStrcpy: Copy a string 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_cistatic inline wchar_t *UniStrcpy(wchar_t * ucs1, const wchar_t * ucs2) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci wchar_t *anchor = ucs1; /* save the start of result string */ 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci while ((*ucs1++ = *ucs2++)); 2762306a36Sopenharmony_ci return anchor; 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* 3362306a36Sopenharmony_ci * UniStrncpy: Copy length limited string with pad 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_cistatic inline __le16 *UniStrncpy_le(__le16 * ucs1, const __le16 * ucs2, 3662306a36Sopenharmony_ci size_t n) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci __le16 *anchor = ucs1; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci while (n-- && *ucs2) /* Copy the strings */ 4162306a36Sopenharmony_ci *ucs1++ = *ucs2++; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci n++; 4462306a36Sopenharmony_ci while (n--) /* Pad with nulls */ 4562306a36Sopenharmony_ci *ucs1++ = 0; 4662306a36Sopenharmony_ci return anchor; 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* 5062306a36Sopenharmony_ci * UniStrncmp_le: Compare length limited string - native to little-endian 5162306a36Sopenharmony_ci */ 5262306a36Sopenharmony_cistatic inline int UniStrncmp_le(const wchar_t * ucs1, const __le16 * ucs2, 5362306a36Sopenharmony_ci size_t n) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci if (!n) 5662306a36Sopenharmony_ci return 0; /* Null strings are equal */ 5762306a36Sopenharmony_ci while ((*ucs1 == __le16_to_cpu(*ucs2)) && *ucs1 && --n) { 5862306a36Sopenharmony_ci ucs1++; 5962306a36Sopenharmony_ci ucs2++; 6062306a36Sopenharmony_ci } 6162306a36Sopenharmony_ci return (int) *ucs1 - (int) __le16_to_cpu(*ucs2); 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* 6562306a36Sopenharmony_ci * UniStrncpy_to_le: Copy length limited string with pad to little-endian 6662306a36Sopenharmony_ci */ 6762306a36Sopenharmony_cistatic inline __le16 *UniStrncpy_to_le(__le16 * ucs1, const wchar_t * ucs2, 6862306a36Sopenharmony_ci size_t n) 6962306a36Sopenharmony_ci{ 7062306a36Sopenharmony_ci __le16 *anchor = ucs1; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci while (n-- && *ucs2) /* Copy the strings */ 7362306a36Sopenharmony_ci *ucs1++ = cpu_to_le16(*ucs2++); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci n++; 7662306a36Sopenharmony_ci while (n--) /* Pad with nulls */ 7762306a36Sopenharmony_ci *ucs1++ = 0; 7862306a36Sopenharmony_ci return anchor; 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci/* 8262306a36Sopenharmony_ci * UniStrncpy_from_le: Copy length limited string with pad from little-endian 8362306a36Sopenharmony_ci */ 8462306a36Sopenharmony_cistatic inline wchar_t *UniStrncpy_from_le(wchar_t * ucs1, const __le16 * ucs2, 8562306a36Sopenharmony_ci size_t n) 8662306a36Sopenharmony_ci{ 8762306a36Sopenharmony_ci wchar_t *anchor = ucs1; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci while (n-- && *ucs2) /* Copy the strings */ 9062306a36Sopenharmony_ci *ucs1++ = __le16_to_cpu(*ucs2++); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci n++; 9362306a36Sopenharmony_ci while (n--) /* Pad with nulls */ 9462306a36Sopenharmony_ci *ucs1++ = 0; 9562306a36Sopenharmony_ci return anchor; 9662306a36Sopenharmony_ci} 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci/* 9962306a36Sopenharmony_ci * UniToupper: Convert a unicode character to upper case 10062306a36Sopenharmony_ci */ 10162306a36Sopenharmony_cistatic inline wchar_t UniToupper(wchar_t uc) 10262306a36Sopenharmony_ci{ 10362306a36Sopenharmony_ci const struct UniCaseRange *rp; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci if (uc < sizeof(NlsUniUpperTable)) { /* Latin characters */ 10662306a36Sopenharmony_ci return uc + NlsUniUpperTable[uc]; /* Use base tables */ 10762306a36Sopenharmony_ci } else { 10862306a36Sopenharmony_ci rp = NlsUniUpperRange; /* Use range tables */ 10962306a36Sopenharmony_ci while (rp->start) { 11062306a36Sopenharmony_ci if (uc < rp->start) /* Before start of range */ 11162306a36Sopenharmony_ci return uc; /* Uppercase = input */ 11262306a36Sopenharmony_ci if (uc <= rp->end) /* In range */ 11362306a36Sopenharmony_ci return uc + rp->table[uc - rp->start]; 11462306a36Sopenharmony_ci rp++; /* Try next range */ 11562306a36Sopenharmony_ci } 11662306a36Sopenharmony_ci } 11762306a36Sopenharmony_ci return uc; /* Past last range */ 11862306a36Sopenharmony_ci} 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci/* 12262306a36Sopenharmony_ci * UniStrupr: Upper case a unicode string 12362306a36Sopenharmony_ci */ 12462306a36Sopenharmony_cistatic inline wchar_t *UniStrupr(wchar_t * upin) 12562306a36Sopenharmony_ci{ 12662306a36Sopenharmony_ci wchar_t *up; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci up = upin; 12962306a36Sopenharmony_ci while (*up) { /* For all characters */ 13062306a36Sopenharmony_ci *up = UniToupper(*up); 13162306a36Sopenharmony_ci up++; 13262306a36Sopenharmony_ci } 13362306a36Sopenharmony_ci return upin; /* Return input pointer */ 13462306a36Sopenharmony_ci} 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci#endif /* !_H_JFS_UNICODE */ 137