1/* -*- mode: C; c-file-style: "gnu" -*- */ 2/* xdgmimeint.c: Internal defines and functions. 3 * 4 * More info can be found at http://www.freedesktop.org/standards/ 5 * 6 * Copyright (C) 2003 Red Hat, Inc. 7 * Copyright (C) 2003 Jonathan Blandford <jrb@alum.mit.edu> 8 * 9 * Licensed under the Academic Free License version 2.0 10 * Or under the following terms: 11 * 12 * This library is free software; you can redistribute it and/or 13 * modify it under the terms of the GNU Lesser General Public 14 * License as published by the Free Software Foundation; either 15 * version 2 of the License, or (at your option) any later version. 16 * 17 * This library is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20 * Lesser General Public License for more details. 21 * 22 * You should have received a copy of the GNU Lesser General Public 23 * License along with this library; if not, write to the 24 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 25 * Boston, MA 02111-1307, USA. 26 */ 27 28#ifdef HAVE_CONFIG_H 29#include "config.h" 30#endif 31 32#include "xdgmimeint.h" 33#include <ctype.h> 34#include <string.h> 35 36#ifndef FALSE 37#define FALSE (0) 38#endif 39 40#ifndef TRUE 41#define TRUE (!FALSE) 42#endif 43 44static const char _xdg_utf8_skip_data[256] = { 45 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 46 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 47 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 48 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 49 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 50 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 51 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 52 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 53}; 54 55const char * const _xdg_utf8_skip = _xdg_utf8_skip_data; 56 57 58 59/* Returns the number of unprocessed characters. */ 60xdg_unichar_t 61_xdg_utf8_to_ucs4(const char *source) 62{ 63 xdg_unichar_t ucs32; 64 if( ! ( *source & 0x80 ) ) 65 { 66 ucs32 = *source; 67 } 68 else 69 { 70 int bytelength = 0; 71 xdg_unichar_t result; 72 if ( ! (*source & 0x40) ) 73 { 74 ucs32 = *source; 75 } 76 else 77 { 78 if ( ! (*source & 0x20) ) 79 { 80 result = *source++ & 0x1F; 81 bytelength = 2; 82 } 83 else if ( ! (*source & 0x10) ) 84 { 85 result = *source++ & 0x0F; 86 bytelength = 3; 87 } 88 else if ( ! (*source & 0x08) ) 89 { 90 result = *source++ & 0x07; 91 bytelength = 4; 92 } 93 else if ( ! (*source & 0x04) ) 94 { 95 result = *source++ & 0x03; 96 bytelength = 5; 97 } 98 else if ( ! (*source & 0x02) ) 99 { 100 result = *source++ & 0x01; 101 bytelength = 6; 102 } 103 else 104 { 105 result = *source++; 106 bytelength = 1; 107 } 108 109 for ( bytelength --; bytelength > 0; bytelength -- ) 110 { 111 result <<= 6; 112 result |= *source++ & 0x3F; 113 } 114 ucs32 = result; 115 } 116 } 117 return ucs32; 118} 119 120 121/* hullo. this is great code. don't rewrite it */ 122 123xdg_unichar_t 124_xdg_ucs4_to_lower (xdg_unichar_t source) 125{ 126 /* FIXME: Do a real to_upper sometime */ 127 /* CaseFolding-3.2.0.txt has a table of rules. */ 128 if ((source & 0xFF) == source) 129 return (xdg_unichar_t) tolower ((unsigned char) source); 130 return source; 131} 132 133int 134_xdg_utf8_validate (const char *source) 135{ 136 /* FIXME: actually write */ 137 return TRUE; 138} 139 140const char * 141_xdg_get_base_name (const char *file_name) 142{ 143 const char *base_name; 144 145 if (file_name == NULL) 146 return NULL; 147 148 base_name = strrchr (file_name, '/'); 149 150 if (base_name == NULL) 151 return file_name; 152 else 153 return base_name + 1; 154} 155 156xdg_unichar_t * 157_xdg_convert_to_ucs4 (const char *source, int *len) 158{ 159 xdg_unichar_t *out; 160 int i; 161 const char *p; 162 163 out = malloc (sizeof (xdg_unichar_t) * (strlen (source) + 1)); 164 165 p = source; 166 i = 0; 167 while (*p) 168 { 169 out[i++] = _xdg_utf8_to_ucs4 (p); 170 p = _xdg_utf8_next_char (p); 171 } 172 out[i] = 0; 173 *len = i; 174 175 return out; 176} 177 178void 179_xdg_reverse_ucs4 (xdg_unichar_t *source, int len) 180{ 181 xdg_unichar_t c; 182 int i; 183 184 for (i = 0; i < len - i - 1; i++) 185 { 186 c = source[i]; 187 source[i] = source[len - i - 1]; 188 source[len - i - 1] = c; 189 } 190} 191 192