]> arthur.barton.de Git - netatalk.git/blob - bin/uniconv/iso8859_1_adapted.c
7cdd43c3995d31ee455910d872f9071d589085b6
[netatalk.git] / bin / uniconv / iso8859_1_adapted.c
1 /* 
2    iso-8859-1.adapted conversion routines
3    Copyright (C) Bjoern Fernhomberg 2002,2003
4    
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2 of the License, or
8    (at your option) any later version.
9    
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14    
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif /* HAVE_CONFIG_H */
23 #include <stdlib.h>
24 #include <string.h>
25 #include <errno.h>
26 #include <arpa/inet.h>
27
28 #include <atalk/unicode.h>
29 #include <atalk/logger.h>
30
31 #include "../../libatalk/unicode/byteorder.h"
32
33 static size_t   iso8859_adapted_pull(void *,char **, size_t *, char **, size_t *);
34 static size_t   iso8859_adapted_push(void *,char **, size_t *, char **, size_t *);
35
36 struct charset_functions charset_iso8859_adapted =
37 {
38         "ISO-8859-ADAPTED",
39         0,
40         iso8859_adapted_pull,
41         iso8859_adapted_push,
42         CHARSET_MULTIBYTE | CHARSET_PRECOMPOSED,
43         NULL,
44         NULL, NULL
45 };
46
47
48 /* ------------------------ 
49  * from unicode to iso8859_adapted code page
50 */
51
52 static size_t iso8859_adapted_push( void *cd _U_, char **inbuf, size_t *inbytesleft,
53                          char **outbuf, size_t *outbytesleft)
54 {
55     int len = 0;
56
57     while (*inbytesleft >= 2 && *outbytesleft >= 1) {
58         ucs2_t inptr = SVAL((*inbuf),0);
59         if ( inptr == 0x2122) {
60                 SSVAL((*outbuf),0,0xAA);
61         }
62         else if ( inptr == 0x0192) {
63                 SSVAL((*outbuf),0,0xC5);
64         }
65         else if ( inptr == 0x2014) {
66                 SSVAL((*outbuf),0,0xD1);
67         }
68         else if ( inptr == 0x201C) {
69                 SSVAL((*outbuf),0,0xD2);
70         }
71         else if ( inptr == 0x201D) {
72                 SSVAL((*outbuf),0,0xD3);
73         }
74         else if ( inptr == 0x2018) {
75                 SSVAL((*outbuf),0,0xD4);
76         }
77         else if ( inptr == 0x2019) {
78                 SSVAL((*outbuf),0,0xD5);
79         }
80         else if ( inptr == 0x25CA) {
81                 SSVAL((*outbuf),0,0xD7);
82         }
83         else if ( inptr > 0x0100) {
84                 errno = EILSEQ;
85                 return -1;
86         }
87         else {
88                 SSVAL((*outbuf), 0, inptr);
89         }
90         (*inbuf)        +=2;
91         (*outbuf)       +=1;
92         (*inbytesleft) -=2;
93         (*outbytesleft)-=1;
94         len++;
95     }
96
97     if (*inbytesleft > 0) {
98         errno = E2BIG;
99         return -1;
100     }
101
102     return len;
103 }
104
105 /* ------------------------ */
106 static size_t iso8859_adapted_pull ( void *cd _U_, char **inbuf, size_t *inbytesleft,
107                          char **outbuf, size_t *outbytesleft)
108 {
109     unsigned char  *inptr;
110     size_t         len = 0;
111
112     while (*inbytesleft >= 1 && *outbytesleft >= 2) {
113         inptr = (unsigned char *) *inbuf;
114
115         if ( *inptr == 0xAA) {
116                 SSVAL((*outbuf),0,0x2122);
117         }
118         else if ( *inptr == 0xC5) {
119                 SSVAL((*outbuf),0,0x0192);
120         }
121         else if ( *inptr == 0xD1) {
122                 SSVAL((*outbuf),0,0x2014);
123         }
124         else if ( *inptr == 0xD2) {
125                 SSVAL((*outbuf),0,0x201C);
126         }
127         else if ( *inptr == 0xD3) {
128                 SSVAL((*outbuf),0,0x201D);
129         }
130         else if ( *inptr == 0xD4) {
131                 SSVAL((*outbuf),0,0x2018);
132         }
133         else if ( *inptr == 0xD5) {
134                 SSVAL((*outbuf),0,0x2019);
135         }
136         else if ( *inptr == 0xD7) {
137                 SSVAL((*outbuf),0,0x25CA);
138         }
139         else {
140                 SSVAL((*outbuf),0,(*inptr));
141         }
142         (*outbuf)      +=2;
143         (*outbytesleft)-=2;
144         (*inbuf)        +=1;
145         (*inbytesleft) -=1;
146         len++;
147     }
148
149     if (*inbytesleft > 0) {
150         errno = E2BIG;
151         return (size_t) -1;
152     }
153     return len;
154 }
155