Index: base/third_party/xdg_mime/xdgmimeint.c |
=================================================================== |
--- base/third_party/xdg_mime/xdgmimeint.c (revision 0) |
+++ base/third_party/xdg_mime/xdgmimeint.c (revision 0) |
@@ -0,0 +1,191 @@ |
+/* -*- mode: C; c-file-style: "gnu" -*- */ |
+/* xdgmimeint.c: Internal defines and functions. |
+ * |
+ * More info can be found at http://www.freedesktop.org/standards/ |
+ * |
+ * Copyright (C) 2003 Red Hat, Inc. |
+ * Copyright (C) 2003 Jonathan Blandford <jrb@alum.mit.edu> |
+ * |
+ * Licensed under the Academic Free License version 2.0 |
+ * Or under the following terms: |
+ * |
+ * This library is free software; you can redistribute it and/or |
+ * modify it under the terms of the GNU Lesser General Public |
+ * License as published by the Free Software Foundation; either |
+ * version 2 of the License, or (at your option) any later version. |
+ * |
+ * This library is distributed in the hope that it will be useful, |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
+ * Lesser General Public License for more details. |
+ * |
+ * You should have received a copy of the GNU Lesser General Public |
+ * License along with this library; if not, write to the |
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
+ * Boston, MA 02111-1307, USA. |
+ */ |
+ |
+#ifdef HAVE_CONFIG_H |
+#include "config.h" |
+#endif |
+ |
+#include "xdgmimeint.h" |
+#include <ctype.h> |
+#include <string.h> |
+ |
+#ifndef FALSE |
+#define FALSE (0) |
+#endif |
+ |
+#ifndef TRUE |
+#define TRUE (!FALSE) |
+#endif |
+ |
+static const char _xdg_utf8_skip_data[256] = { |
+ 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, |
+ 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, |
+ 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, |
+ 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, |
+ 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, |
+ 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, |
+ 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, |
+ 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 |
+}; |
+ |
+const char * const _xdg_utf8_skip = _xdg_utf8_skip_data; |
+ |
+ |
+ |
+/* Returns the number of unprocessed characters. */ |
+xdg_unichar_t |
+_xdg_utf8_to_ucs4(const char *source) |
+{ |
+ xdg_unichar_t ucs32; |
+ if( ! ( *source & 0x80 ) ) |
+ { |
+ ucs32 = *source; |
+ } |
+ else |
+ { |
+ int bytelength = 0; |
+ xdg_unichar_t result; |
+ if ( ! (*source & 0x40) ) |
+ { |
+ ucs32 = *source; |
+ } |
+ else |
+ { |
+ if ( ! (*source & 0x20) ) |
+ { |
+ result = *source++ & 0x1F; |
+ bytelength = 2; |
+ } |
+ else if ( ! (*source & 0x10) ) |
+ { |
+ result = *source++ & 0x0F; |
+ bytelength = 3; |
+ } |
+ else if ( ! (*source & 0x08) ) |
+ { |
+ result = *source++ & 0x07; |
+ bytelength = 4; |
+ } |
+ else if ( ! (*source & 0x04) ) |
+ { |
+ result = *source++ & 0x03; |
+ bytelength = 5; |
+ } |
+ else if ( ! (*source & 0x02) ) |
+ { |
+ result = *source++ & 0x01; |
+ bytelength = 6; |
+ } |
+ else |
+ { |
+ result = *source++; |
+ bytelength = 1; |
+ } |
+ |
+ for ( bytelength --; bytelength > 0; bytelength -- ) |
+ { |
+ result <<= 6; |
+ result |= *source++ & 0x3F; |
+ } |
+ ucs32 = result; |
+ } |
+ } |
+ return ucs32; |
+} |
+ |
+ |
+/* hullo. this is great code. don't rewrite it */ |
+ |
+xdg_unichar_t |
+_xdg_ucs4_to_lower (xdg_unichar_t source) |
+{ |
+ /* FIXME: Do a real to_upper sometime */ |
+ /* CaseFolding-3.2.0.txt has a table of rules. */ |
+ if ((source & 0xFF) == source) |
+ return (xdg_unichar_t) tolower ((unsigned char) source); |
+ return source; |
+} |
+ |
+int |
+_xdg_utf8_validate (const char *source) |
+{ |
+ /* FIXME: actually write */ |
+ return TRUE; |
+} |
+ |
+const char * |
+_xdg_get_base_name (const char *file_name) |
+{ |
+ const char *base_name; |
+ |
+ if (file_name == NULL) |
+ return NULL; |
+ |
+ base_name = strrchr (file_name, '/'); |
+ |
+ if (base_name == NULL) |
+ return file_name; |
+ else |
+ return base_name + 1; |
+} |
+ |
+xdg_unichar_t * |
+_xdg_convert_to_ucs4 (const char *source, int *len) |
+{ |
+ xdg_unichar_t *out; |
+ int i; |
+ const char *p; |
+ |
+ out = malloc (sizeof (xdg_unichar_t) * (strlen (source) + 1)); |
+ |
+ p = source; |
+ i = 0; |
+ while (*p) |
+ { |
+ out[i++] = _xdg_utf8_to_ucs4 (p); |
+ p = _xdg_utf8_next_char (p); |
+ } |
+ out[i] = 0; |
+ *len = i; |
+ |
+ return out; |
+} |
+ |
+void |
+_xdg_reverse_ucs4 (xdg_unichar_t *source, int len) |
+{ |
+ xdg_unichar_t c; |
+ int i; |
+ |
+ for (i = 0; i < len - i - 1; i++) |
+ { |
+ c = source[i]; |
+ source[i] = source[len - i - 1]; |
+ source[len - i - 1] = c; |
+ } |
+} |
+ |