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

« back to all changes in this revision

Viewing changes to ext/mbstring/libmbfl/filters/mbfilter_koi8r.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 part: Den V. Tsopa <tdv@edisoft.ru>
 
22
 *
 
23
 */
 
24
/*
 
25
 * The source code included in this files was separated from mbfilter_ru.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_koi8r.h"
 
36
#include "unicode_table_koi8r.h"
 
37
 
 
38
static int mbfl_filt_ident_koi8r(int c, mbfl_identify_filter *filter);
 
39
 
 
40
static const char *mbfl_encoding_koi8r_aliases[] = {"KOI8-R", "KOI8R", NULL};
 
41
 
 
42
const mbfl_encoding mbfl_encoding_koi8r = {
 
43
        mbfl_no_encoding_koi8r,
 
44
        "KOI8-R",
 
45
        "KOI8-R",
 
46
        (const char *(*)[])&mbfl_encoding_koi8r_aliases,
 
47
        NULL,
 
48
        MBFL_ENCTYPE_SBCS
 
49
};
 
50
 
 
51
const struct mbfl_identify_vtbl vtbl_identify_koi8r = {
 
52
        mbfl_no_encoding_koi8r,
 
53
        mbfl_filt_ident_common_ctor,
 
54
        mbfl_filt_ident_common_dtor,
 
55
        mbfl_filt_ident_koi8r
 
56
};
 
57
 
 
58
const struct mbfl_convert_vtbl vtbl_wchar_koi8r = {
 
59
        mbfl_no_encoding_wchar,
 
60
        mbfl_no_encoding_koi8r,
 
61
        mbfl_filt_conv_common_ctor,
 
62
        mbfl_filt_conv_common_dtor,
 
63
        mbfl_filt_conv_wchar_koi8r,
 
64
        mbfl_filt_conv_common_flush
 
65
};
 
66
 
 
67
const struct mbfl_convert_vtbl vtbl_koi8r_wchar = {
 
68
        mbfl_no_encoding_koi8r,
 
69
        mbfl_no_encoding_wchar,
 
70
        mbfl_filt_conv_common_ctor,
 
71
        mbfl_filt_conv_common_dtor,
 
72
        mbfl_filt_conv_koi8r_wchar,
 
73
        mbfl_filt_conv_common_flush
 
74
};
 
75
 
 
76
#define CK(statement)   do { if ((statement) < 0) return (-1); } while (0)
 
77
 
 
78
/*
 
79
 * koi8r => wchar
 
80
 */
 
81
int
 
82
mbfl_filt_conv_koi8r_wchar(int c, mbfl_convert_filter *filter)
 
83
{
 
84
        int s;
 
85
 
 
86
        if (c >= 0 && c < koi8r_ucs_table_min) {
 
87
                s = c;
 
88
        } else if (c >= koi8r_ucs_table_min && c < 0x100) {
 
89
                s = koi8r_ucs_table[c - koi8r_ucs_table_min];
 
90
                if (s <= 0) {
 
91
                        s = c;
 
92
                        s &= MBFL_WCSPLANE_MASK;
 
93
                        s |= MBFL_WCSPLANE_KOI8R;
 
94
                }
 
95
        } else {
 
96
                s = c;
 
97
                s &= MBFL_WCSGROUP_MASK;
 
98
                s |= MBFL_WCSGROUP_THROUGH;
 
99
        }
 
100
 
 
101
        CK((*filter->output_function)(s, filter->data));
 
102
 
 
103
        return c;
 
104
}
 
105
 
 
106
/*
 
107
 * wchar => koi8r
 
108
 */
 
109
int
 
110
mbfl_filt_conv_wchar_koi8r(int c, mbfl_convert_filter *filter)
 
111
{
 
112
        int s, n;
 
113
 
 
114
        if (c < 0x80) {
 
115
                s = c;
 
116
        } else {
 
117
                s = -1;
 
118
                n = koi8r_ucs_table_len-1;
 
119
                while (n >= 0) {
 
120
                        if (c == koi8r_ucs_table[n]) {
 
121
                                s = koi8r_ucs_table_min + n;
 
122
                                break;
 
123
                        }
 
124
                        n--;
 
125
                }
 
126
                if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_KOI8R) {
 
127
                        s = c & MBFL_WCSPLANE_MASK;
 
128
                }
 
129
        }
 
130
 
 
131
        if (s >= 0) {
 
132
                CK((*filter->output_function)(s, filter->data));
 
133
        } else {
 
134
                if (filter->illegal_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
 
135
                        CK(mbfl_filt_conv_illegal_output(c, filter));
 
136
                }
 
137
        }
 
138
 
 
139
        return c;
 
140
}
 
141
 
 
142
static int mbfl_filt_ident_koi8r(int c, mbfl_identify_filter *filter)
 
143
{
 
144
        if (c >= 0x80 && c < 0xff)
 
145
                filter->flag = 0;
 
146
        else
 
147
                filter->flag = 1; /* not it */
 
148
        return c;       
 
149
}