13781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* -*- mode: C; c-file-style: "gnu" -*- */ 23781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* xdgmimeint.c: Internal defines and functions. 33781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * 43781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * More info can be found at http://www.freedesktop.org/standards/ 53781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * 63781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Copyright (C) 2003 Red Hat, Inc. 73781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Copyright (C) 2003 Jonathan Blandford <jrb@alum.mit.edu> 83781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * 93781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Licensed under the Academic Free License version 2.0 103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Or under the following terms: 113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * 123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * This library is free software; you can redistribute it and/or 133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * modify it under the terms of the GNU Lesser General Public 143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * License as published by the Free Software Foundation; either 153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * version 2 of the License, or (at your option) any later version. 163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * 173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * This library is distributed in the hope that it will be useful, 183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * but WITHOUT ANY WARRANTY; without even the implied warranty of 193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Lesser General Public License for more details. 213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * 223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * You should have received a copy of the GNU Lesser General Public 233781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * License along with this library; if not, write to the 243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson * Boston, MA 02111-1307, USA. 263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson */ 273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifdef HAVE_CONFIG_H 29761424465aaad736916b029383483b6ac419d831Johan Dahlin#include "config.h" 303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif 313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include "xdgmimeint.h" 333781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <ctype.h> 343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#include <string.h> 353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifndef FALSE 373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#define FALSE (0) 383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif 393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 403781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#ifndef TRUE 413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#define TRUE (!FALSE) 423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson#endif 433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 443781343738de4abddf56982325a77bd70a98cd26Alexander Larssonstatic const char _xdg_utf8_skip_data[256] = { 453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 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, 463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 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, 473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 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, 483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 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, 493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 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, 503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 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, 513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 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, 523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 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 533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson}; 543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 553781343738de4abddf56982325a77bd70a98cd26Alexander Larssonconst char * const _xdg_utf8_skip = _xdg_utf8_skip_data; 563781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 573781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 583781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 593781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* Returns the number of unprocessed characters. */ 603781343738de4abddf56982325a77bd70a98cd26Alexander Larssonxdg_unichar_t 613781343738de4abddf56982325a77bd70a98cd26Alexander Larsson_xdg_utf8_to_ucs4(const char *source) 623781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 633781343738de4abddf56982325a77bd70a98cd26Alexander Larsson xdg_unichar_t ucs32; 643781343738de4abddf56982325a77bd70a98cd26Alexander Larsson if( ! ( *source & 0x80 ) ) 653781343738de4abddf56982325a77bd70a98cd26Alexander Larsson { 663781343738de4abddf56982325a77bd70a98cd26Alexander Larsson ucs32 = *source; 673781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 683781343738de4abddf56982325a77bd70a98cd26Alexander Larsson else 693781343738de4abddf56982325a77bd70a98cd26Alexander Larsson { 703781343738de4abddf56982325a77bd70a98cd26Alexander Larsson int bytelength = 0; 713781343738de4abddf56982325a77bd70a98cd26Alexander Larsson xdg_unichar_t result; 723781343738de4abddf56982325a77bd70a98cd26Alexander Larsson if ( ! (*source & 0x40) ) 733781343738de4abddf56982325a77bd70a98cd26Alexander Larsson { 743781343738de4abddf56982325a77bd70a98cd26Alexander Larsson ucs32 = *source; 753781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 763781343738de4abddf56982325a77bd70a98cd26Alexander Larsson else 773781343738de4abddf56982325a77bd70a98cd26Alexander Larsson { 783781343738de4abddf56982325a77bd70a98cd26Alexander Larsson if ( ! (*source & 0x20) ) 793781343738de4abddf56982325a77bd70a98cd26Alexander Larsson { 803781343738de4abddf56982325a77bd70a98cd26Alexander Larsson result = *source++ & 0x1F; 813781343738de4abddf56982325a77bd70a98cd26Alexander Larsson bytelength = 2; 823781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 833781343738de4abddf56982325a77bd70a98cd26Alexander Larsson else if ( ! (*source & 0x10) ) 843781343738de4abddf56982325a77bd70a98cd26Alexander Larsson { 853781343738de4abddf56982325a77bd70a98cd26Alexander Larsson result = *source++ & 0x0F; 863781343738de4abddf56982325a77bd70a98cd26Alexander Larsson bytelength = 3; 873781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 883781343738de4abddf56982325a77bd70a98cd26Alexander Larsson else if ( ! (*source & 0x08) ) 893781343738de4abddf56982325a77bd70a98cd26Alexander Larsson { 903781343738de4abddf56982325a77bd70a98cd26Alexander Larsson result = *source++ & 0x07; 913781343738de4abddf56982325a77bd70a98cd26Alexander Larsson bytelength = 4; 923781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 933781343738de4abddf56982325a77bd70a98cd26Alexander Larsson else if ( ! (*source & 0x04) ) 943781343738de4abddf56982325a77bd70a98cd26Alexander Larsson { 953781343738de4abddf56982325a77bd70a98cd26Alexander Larsson result = *source++ & 0x03; 963781343738de4abddf56982325a77bd70a98cd26Alexander Larsson bytelength = 5; 973781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 983781343738de4abddf56982325a77bd70a98cd26Alexander Larsson else if ( ! (*source & 0x02) ) 993781343738de4abddf56982325a77bd70a98cd26Alexander Larsson { 1003781343738de4abddf56982325a77bd70a98cd26Alexander Larsson result = *source++ & 0x01; 1013781343738de4abddf56982325a77bd70a98cd26Alexander Larsson bytelength = 6; 1023781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 1033781343738de4abddf56982325a77bd70a98cd26Alexander Larsson else 1043781343738de4abddf56982325a77bd70a98cd26Alexander Larsson { 1053781343738de4abddf56982325a77bd70a98cd26Alexander Larsson result = *source++; 1063781343738de4abddf56982325a77bd70a98cd26Alexander Larsson bytelength = 1; 1073781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 1083781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1093781343738de4abddf56982325a77bd70a98cd26Alexander Larsson for ( bytelength --; bytelength > 0; bytelength -- ) 1103781343738de4abddf56982325a77bd70a98cd26Alexander Larsson { 1113781343738de4abddf56982325a77bd70a98cd26Alexander Larsson result <<= 6; 1123781343738de4abddf56982325a77bd70a98cd26Alexander Larsson result |= *source++ & 0x3F; 1133781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 1143781343738de4abddf56982325a77bd70a98cd26Alexander Larsson ucs32 = result; 1153781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 1163781343738de4abddf56982325a77bd70a98cd26Alexander Larsson } 1173781343738de4abddf56982325a77bd70a98cd26Alexander Larsson return ucs32; 1183781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} 1193781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1203781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1213781343738de4abddf56982325a77bd70a98cd26Alexander Larsson/* hullo. this is great code. don't rewrite it */ 1223781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1233781343738de4abddf56982325a77bd70a98cd26Alexander Larssonxdg_unichar_t 1243781343738de4abddf56982325a77bd70a98cd26Alexander Larsson_xdg_ucs4_to_lower (xdg_unichar_t source) 1253781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 1263781343738de4abddf56982325a77bd70a98cd26Alexander Larsson /* FIXME: Do a real to_upper sometime */ 1273781343738de4abddf56982325a77bd70a98cd26Alexander Larsson /* CaseFolding-3.2.0.txt has a table of rules. */ 1283781343738de4abddf56982325a77bd70a98cd26Alexander Larsson if ((source & 0xFF) == source) 1293781343738de4abddf56982325a77bd70a98cd26Alexander Larsson return (xdg_unichar_t) tolower ((unsigned char) source); 1303781343738de4abddf56982325a77bd70a98cd26Alexander Larsson return source; 1313781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} 1323781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1333781343738de4abddf56982325a77bd70a98cd26Alexander Larssonint 1343781343738de4abddf56982325a77bd70a98cd26Alexander Larsson_xdg_utf8_validate (const char *source) 1353781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 1363781343738de4abddf56982325a77bd70a98cd26Alexander Larsson /* FIXME: actually write */ 1373781343738de4abddf56982325a77bd70a98cd26Alexander Larsson return TRUE; 1383781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} 1393781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1403781343738de4abddf56982325a77bd70a98cd26Alexander Larssonconst char * 1413781343738de4abddf56982325a77bd70a98cd26Alexander Larsson_xdg_get_base_name (const char *file_name) 1423781343738de4abddf56982325a77bd70a98cd26Alexander Larsson{ 1433781343738de4abddf56982325a77bd70a98cd26Alexander Larsson const char *base_name; 1443781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1453781343738de4abddf56982325a77bd70a98cd26Alexander Larsson if (file_name == NULL) 1463781343738de4abddf56982325a77bd70a98cd26Alexander Larsson return NULL; 1473781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1483781343738de4abddf56982325a77bd70a98cd26Alexander Larsson base_name = strrchr (file_name, '/'); 1493781343738de4abddf56982325a77bd70a98cd26Alexander Larsson 1503781343738de4abddf56982325a77bd70a98cd26Alexander Larsson if (base_name == NULL) 1513781343738de4abddf56982325a77bd70a98cd26Alexander Larsson return file_name; 1523781343738de4abddf56982325a77bd70a98cd26Alexander Larsson else 1533781343738de4abddf56982325a77bd70a98cd26Alexander Larsson return base_name + 1; 1543781343738de4abddf56982325a77bd70a98cd26Alexander Larsson} 1552bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen 1562bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasenxdg_unichar_t * 1572bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen_xdg_convert_to_ucs4 (const char *source, int *len) 1582bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen{ 1592bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen xdg_unichar_t *out; 1602bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen int i; 1612bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen const char *p; 1622bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen 1632bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen out = malloc (sizeof (xdg_unichar_t) * (strlen (source) + 1)); 1642bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen 1652bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen p = source; 1662bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen i = 0; 1672bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen while (*p) 1682bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen { 1692bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen out[i++] = _xdg_utf8_to_ucs4 (p); 1702bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen p = _xdg_utf8_next_char (p); 1712bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen } 1722bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen out[i] = 0; 1732bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen *len = i; 1742bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen 1752bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen return out; 1762bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen} 1772bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen 1782bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasenvoid 1792bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen_xdg_reverse_ucs4 (xdg_unichar_t *source, int len) 1802bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen{ 1812bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen xdg_unichar_t c; 1822bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen int i; 1832bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen 1842bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen for (i = 0; i < len - i - 1; i++) 1852bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen { 1862bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen c = source[i]; 1872bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen source[i] = source[len - i - 1]; 1882bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen source[len - i - 1] = c; 1892bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen } 1902bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen} 1912bd31c9e6c6159a5ef0a92ea567b48649256ab43Matthias Clasen 192