~ubuntu-branches/ubuntu/hardy/php5/hardy-updates

« back to all changes in this revision

Viewing changes to ext/mbstring/libmbfl/filters/mbfilter_iso8859_14.c

  • Committer: Bazaar Package Importer
  • Author(s): Adam Conrad
  • Date: 2005-10-09 03:14:32 UTC
  • Revision ID: james.westby@ubuntu.com-20051009031432-kspik3lobxstafv9
Tags: upstream-5.0.5
ImportĀ upstreamĀ versionĀ 5.0.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * "streamable kanji code filter and converter"
 
3
 * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
 
4
 *
 
5
 * LICENSE NOTICES
 
6
 *
 
7
 * This file is part of "streamable kanji code filter and converter",
 
8
 * which is distributed under the terms of GNU Lesser General Public 
 
9
 * License (version 2) as published by the Free Software Foundation.
 
10
 *
 
11
 * This software is distributed in the hope that it will be useful,
 
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
 * GNU Lesser General Public License for more details.
 
15
 *
 
16
 * You should have received a copy of the GNU Lesser General Public
 
17
 * License along with "streamable kanji code filter and converter";
 
18
 * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
 
19
 * Suite 330, Boston, MA  02111-1307  USA
 
20
 *
 
21
 * The author of this file:
 
22
 *
 
23
 */
 
24
/*
 
25
 * The source code included in this files was separated from mbfilter.c
 
26
 * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002.
 
27
 * 
 
28
 */
 
29
 
 
30
#ifdef HAVE_CONFIG_H
 
31
#include "config.h"
 
32
#endif
 
33
 
 
34
#include "mbfilter.h"
 
35
#include "mbfilter_iso8859_14.h"
 
36
#include "unicode_table_iso8859_14.h"
 
37
 
 
38
static const char *mbfl_encoding_8859_14_aliases[] = {"ISO_8859-14", "latin8", NULL};
 
39
 
 
40
const mbfl_encoding mbfl_encoding_8859_14 = {
 
41
        mbfl_no_encoding_8859_14,
 
42
        "ISO-8859-14",
 
43
        "ISO-8859-14",
 
44
        (const char *(*)[])&mbfl_encoding_8859_14_aliases,
 
45
        NULL,
 
46
        MBFL_ENCTYPE_SBCS
 
47
};
 
48
 
 
49
const struct mbfl_identify_vtbl vtbl_identify_8859_14 = {
 
50
        mbfl_no_encoding_8859_14,
 
51
        mbfl_filt_ident_common_ctor,
 
52
        mbfl_filt_ident_common_dtor,
 
53
        mbfl_filt_ident_true
 
54
};
 
55
 
 
56
const struct mbfl_convert_vtbl vtbl_8859_14_wchar = {
 
57
        mbfl_no_encoding_8859_14,
 
58
        mbfl_no_encoding_wchar,
 
59
        mbfl_filt_conv_common_ctor,
 
60
        mbfl_filt_conv_common_dtor,
 
61
        mbfl_filt_conv_8859_14_wchar,
 
62
        mbfl_filt_conv_common_flush
 
63
};
 
64
 
 
65
const struct mbfl_convert_vtbl vtbl_wchar_8859_14 = {
 
66
        mbfl_no_encoding_wchar,
 
67
        mbfl_no_encoding_8859_14,
 
68
        mbfl_filt_conv_common_ctor,
 
69
        mbfl_filt_conv_common_dtor,
 
70
        mbfl_filt_conv_wchar_8859_14,
 
71
        mbfl_filt_conv_common_flush
 
72
};
 
73
 
 
74
#define CK(statement)   do { if ((statement) < 0) return (-1); } while (0)
 
75
 
 
76
/*
 
77
 * ISO-8859-14 => wchar
 
78
 */
 
79
int mbfl_filt_conv_8859_14_wchar(int c, mbfl_convert_filter *filter)
 
80
{
 
81
        int s;
 
82
 
 
83
        if (c >= 0 && c < 0xa0) {
 
84
                s = c;
 
85
        } else if (c >= 0xa0 && c < 0x100) {
 
86
                s = iso8859_14_ucs_table[c - 0xa0];
 
87
                if (s <= 0) {
 
88
                        s = c;
 
89
                        s &= MBFL_WCSPLANE_MASK;
 
90
                        s |= MBFL_WCSPLANE_8859_14;
 
91
                }
 
92
        } else {
 
93
                s = c;
 
94
                s &= MBFL_WCSGROUP_MASK;
 
95
                s |= MBFL_WCSGROUP_THROUGH;
 
96
        }
 
97
 
 
98
        CK((*filter->output_function)(s, filter->data));
 
99
 
 
100
        return c;
 
101
}
 
102
 
 
103
/*
 
104
 * wchar => ISO-8859-14
 
105
 */
 
106
int mbfl_filt_conv_wchar_8859_14(int c, mbfl_convert_filter *filter)
 
107
{
 
108
        int s, n;
 
109
 
 
110
        if (c >= 0 && c < 0xa0) {
 
111
                s = c;
 
112
        } else {
 
113
                s = -1;
 
114
                n = 95;
 
115
                while (n >= 0) {
 
116
                        if (c == iso8859_14_ucs_table[n]) {
 
117
                                s = 0xa0 + n;
 
118
                                break;
 
119
                        }
 
120
                        n--;
 
121
                }
 
122
                if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_8859_14) {
 
123
                        s = c & MBFL_WCSPLANE_MASK;
 
124
                }
 
125
        }
 
126
 
 
127
        if (s >= 0) {
 
128
                CK((*filter->output_function)(s, filter->data));
 
129
        } else {
 
130
                if (filter->illegal_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
 
131
                        CK(mbfl_filt_conv_illegal_output(c, filter));
 
132
                }
 
133
        }
 
134
 
 
135
        return c;
 
136
}
 
137
 
 
138