2N/A/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */ 2N/A * Copyright 2008 by the Massachusetts Institute of Technology. 2N/A * All Rights Reserved. 2N/A * Export of this software from the United States of America may 2N/A * require a specific license from the United States Government. 2N/A * It is the responsibility of any person or organization contemplating 2N/A * export to obtain such a license before exporting. 2N/A * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and 2N/A * distribute this software and its documentation for any purpose and 2N/A * without fee is hereby granted, provided that the above copyright 2N/A * notice appear in all copies and that both that copyright notice and 2N/A * this permission notice appear in supporting documentation, and that 2N/A * the name of M.I.T. not be used in advertising or publicity pertaining 2N/A * to distribution of the software without specific, written prior 2N/A * permission. Furthermore if you modify this software you must label 2N/A * your software as modified software and not distribute it in such a 2N/A * fashion that it might be confused with the original M.I.T. software. 2N/A * M.I.T. makes no representations about the suitability of 2N/A * this software for any purpose. It is provided "as is" without express 2N/A * or implied warranty. 2N/A * Copyright 1998-2008 The OpenLDAP Foundation. 2N/A * All rights reserved. 2N/A * Redistribution and use in source and binary forms, with or without 2N/A * modification, are permitted only as authorized by the OpenLDAP 2N/A * A copy of this license is available in the file LICENSE in the 2N/A * top-level directory of the distribution or, alternatively, at 2N/A/* Portions Copyright (C) 1999, 2000 Novell, Inc. All Rights Reserved. 2N/A * THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND 2N/A * TREATIES. USE, MODIFICATION, AND REDISTRIBUTION OF THIS WORK IS SUBJECT 2N/A * TO VERSION 2.0.1 OF THE OPENLDAP PUBLIC LICENSE, A COPY OF WHICH IS 2N/A * IN THE TOP-LEVEL DIRECTORY OF THE DISTRIBUTION. ANY USE OR EXPLOITATION 2N/A * OF THIS WORK OTHER THAN AS AUTHORIZED IN VERSION 2.0.1 OF THE OPENLDAP 2N/A * PUBLIC LICENSE, OR OTHER PRIOR WRITTEN CONSENT FROM NOVELL, COULD SUBJECT 2N/A * THE PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY. 2N/A * UTF-8 Conversion Routines 2N/A * These routines convert between Wide Character and UTF-8, 2N/A * or between MultiByte and UTF-8 encodings. 2N/A * Both single character and string versions of the functions are provided. 2N/A * All functions return -1 if the character or string cannot be converted. 2N/Astatic unsigned char mask[] = { 0,
0x7f,
0x1f,
0x0f,
0x07,
0x03,
0x01 };
2N/A /* If input ptr is NULL or empty... */ 2N/A /* Examine next UTF-8 character. */ 2N/A /* Get UTF-8 sequence length from 1st byte */ 2N/A /* First byte minus length tag */ 2N/A /* Subsequent bytes must start with 10 */ 2N/A ch <<=
6;
/* 6 bits of data in each subsequent byte */ 2N/A#
define SWAP16(X) ((((X) <<
8) | ((X) >>
8)) &
0xFFFF)
2N/A /* Add null terminator if there's room in the buffer. */ 2N/A/*----------------------------------------------------------------------------- 2N/A Convert a wide char string to a UTF-8 string. 2N/A No more than 'count' bytes will be written to the output buffer. 2N/A Return the # of bytes written to the output buffer, excl null terminator. 2N/A ucs2len is -1 if the UCS-2 string is NUL terminated, otherwise it is the 2N/A length of the UCS-2 string in characters 2N/A /* Get UTF-8 size of next wide char */ 2N/A return -
1;
/* overflow */ 2N/A /* Do the actual conversion. */ 2N/A n =
1;
/* In case of empty ucs2str */ 2N/A count -= n;
/* Space left in output buffer */ 2N/A /* If not enough room for last character, pad remainder with null 2N/A so that return value = original count, indicating buffer full. */ 2N/A /* Add a null terminator if there's room. */ 2N/A if (n == -
1)
/* Conversion encountered invalid wide char. */ 2N/A /* Return the number of bytes written to output buffer, excl null. */