/* * BSD 3-Clause License * * Copyright (c) 2017-2018, plures * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "string.h" #include "ndtypes.h" /******************************************************************************/ /* Encodings */ /******************************************************************************/ enum ndt_encoding ndt_encoding_from_string(const char *s, ndt_context_t *ctx) { if (strcmp(s, "A") == 0 || strcmp(s, "ascii") == 0 || strcmp(s, "us-ascii") == 0) { return Ascii; } else if (strcmp(s, "U8") == 0 || strcmp(s, "utf8") == 0 || strcmp(s, "utf-8") == 0) { return Utf8; } else if (strcmp(s, "U16") == 0 || strcmp(s, "utf16") == 0 || strcmp(s, "utf-16") == 0) { return Utf16; } else if (strcmp(s, "U32") == 0 || strcmp(s, "utf32") == 0 || strcmp(s, "utf-32") == 0) { return Utf32; } else if (strcmp(s, "ucs2") == 0 || strcmp(s, "ucs-2") == 0 || strcmp(s, "ucs_2") == 0) { return Ucs2; } else { ndt_err_format(ctx, NDT_ValueError, "invalid encoding: '%s'", s); return Ascii; } } const char * ndt_encoding_as_string(enum ndt_encoding encoding) { switch (encoding) { case Ascii: return "'ascii'"; case Utf8: return "'utf8'"; case Utf16: return "'utf16'"; case Utf32: return "'utf32'"; case Ucs2: return "'ucs2'"; } /* NOT REACHED: tags should be exhaustive. */ ndt_internal_error("invalid encoding"); } size_t ndt_sizeof_encoding(enum ndt_encoding encoding) { switch (encoding) { case Ascii: case Utf8: return 1; case Utf16: case Ucs2: return 2; case Utf32: return 4; } /* NOT REACHED: tags should be exhaustive. */ ndt_internal_error("invalid encoding"); } uint16_t ndt_alignof_encoding(enum ndt_encoding encoding) { return (uint16_t)ndt_sizeof_encoding(encoding); }