patch-2.4.0-test5 linux/fs/ntfs/support.c
Next file: linux/fs/openpromfs/inode.c
Previous file: linux/fs/ntfs/fs.c
Back to the patch index
Back to the overall index
- Lines: 95
- Date:
Tue Jul 18 22:48:33 2000
- Orig file:
v2.4.0-test4/linux/fs/ntfs/support.c
- Orig date:
Mon Apr 12 10:05:58 1999
diff -u --recursive --new-file v2.4.0-test4/linux/fs/ntfs/support.c linux/fs/ntfs/support.c
@@ -217,8 +217,8 @@
int ntfs_dupuni2map(ntfs_volume *vol, ntfs_u16 *in, int in_len, char **out,
int *out_len)
{
- int i,o,val;
- char *result,*buf;
+ int i,o,val,chl, chi;
+ char *result,*buf,charbuf[NLS_MAX_CHARSET_SIZE];
struct nls_table* nls=vol->nls_map;
result=ntfs_malloc(in_len+1);
@@ -227,8 +227,7 @@
result[in_len]='\0';
for(i=o=0;i<in_len;i++){
int cl,ch;
- unsigned char* uni_page;
- /* FIXME: byte order */
+ /* FIXME: byte order? */
cl=in[i] & 0xFF;
ch=(in[i] >> 8) & 0xFF;
if(!nls){
@@ -237,11 +236,23 @@
continue;
}
}else{
- uni_page=nls->page_uni2charset[ch];
- if(uni_page && uni_page[cl]){
- result[o++]=uni_page[cl];
- continue;
- }
+ /* FIXME: byte order? */
+ wchar_t uni = in[i];
+ if ( (chl = nls->uni2char(uni, charbuf, NLS_MAX_CHARSET_SIZE)) > 0){
+ /* adjust result buffer */
+ if (chl > 1){
+ buf=ntfs_malloc(*out_len + chl - 1);
+ memcpy(buf, result, o);
+ ntfs_free(result);
+ result=buf;
+ *out_len+=(chl-1);
+ }
+ for (chi=0;chi<chl;chi++)
+ result[o++] = charbuf[chi];
+ } else
+ result[o++] = '?';
+ continue;
+
}
if(!(vol->nct & nct_uni_xlate))goto inval;
/* realloc */
@@ -291,10 +302,15 @@
if(!result)return ENOMEM;
*out_len=in_len;
for(i=o=0;i<in_len;i++,o++){
- unsigned short cl,ch;
+ wchar_t uni;
if(in[i]!=':' || (vol->nct & nct_uni_xlate)==0){
- cl=nls->charset2uni[(unsigned char)in[i]].uni1;
- ch=nls->charset2uni[(unsigned char)in[i]].uni2;
+ int charlen;
+ /* FIXME: is this error handling ok? */
+ charlen = nls->char2uni(&in[i], in_len-i, &uni);
+ if (charlen < 0)
+ return charlen;
+ *out_len -= (charlen-1);
+ i += (charlen-1);
}else{
unsigned char c1,c2,c3;
*out_len-=3;
@@ -302,17 +318,17 @@
c2=esc2uni(in[++i]);
c3=esc2uni(in[++i]);
if(c1==255 || c2==255 || c3==255)
- cl=ch=0;
+ uni = 0;
else if(vol->nct & nct_uni_xlate_vfat){
- cl = (c1 << 4) + (c2 >> 2);
- ch = ((c2 & 0x3) << 6) + c3;
+ uni = (((c2 & 0x3) << 6) + c3) << 8 |
+ ((c1 << 4) + (c2 >> 2));
}else{
- ch=(c3 << 4) + (c2 >> 2);
- cl=((c2 & 0x3) << 6) + c1;
+ uni = ((c3 << 4) + (c2 >> 2)) << 8 |
+ (((c2 & 0x3) << 6) + c1);
}
- }
- /* FIXME: byte order */
- result[o] = (ch<<8) | cl;
+ }
+ /* FIXME: byte order? */
+ result[o] = uni;
if(!result[o]){
ntfs_free(result);
return EILSEQ;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)