* add xdgmime from freedesktop.org
[citadel.git] / libcitadel / lib / xdgmime / xdgmimeint.c
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
44 static 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
55 const char * const _xdg_utf8_skip = _xdg_utf8_skip_data;
56
57
58
59 /* Returns the number of unprocessed characters. */
60 xdg_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
123 xdg_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
133 int
134 _xdg_utf8_validate (const char *source)
135 {
136   /* FIXME: actually write */
137   return TRUE;
138 }
139
140 const 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 }