128 lines
2.7 KiB
Text
128 lines
2.7 KiB
Text
|
--- joliet.c.orig Fri Mar 3 15:33:48 2000
|
|||
|
+++ joliet.c Fri Mar 3 15:54:48 2000
|
|||
|
@@ -78,6 +78,9 @@
|
|||
|
#include <stdlib.h>
|
|||
|
#include <time.h>
|
|||
|
|
|||
|
+/* Big5 to Unicode mapping table */
|
|||
|
+#include "big52uni.h"
|
|||
|
+
|
|||
|
static int jpath_table_index;
|
|||
|
static struct directory ** jpathlist;
|
|||
|
static int next_jpath_index = 1;
|
|||
|
@@ -88,6 +91,9 @@
|
|||
|
static void DECL(assign_joliet_directory_addresses, (struct directory * node));
|
|||
|
static int jroot_gen __PR((void));
|
|||
|
|
|||
|
+static u_int16_t unicode_table[] = CHINESE_UNICODE;
|
|||
|
+static u_int16_t big5_table[] = CHINESE_BIG5;
|
|||
|
+
|
|||
|
/*
|
|||
|
* Function: convert_to_unicode
|
|||
|
*
|
|||
|
@@ -101,6 +107,8 @@
|
|||
|
unsigned char * tmpbuf;
|
|||
|
int i;
|
|||
|
int j;
|
|||
|
+ int p;
|
|||
|
+ u_int16_t code, unicode;
|
|||
|
|
|||
|
/*
|
|||
|
* If we get a NULL pointer for the source, it means we have an inplace
|
|||
|
@@ -156,6 +164,31 @@
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
+ /******//* big5 to unicode patch*/
|
|||
|
+
|
|||
|
+ if( tmpbuf[j] >= 0xA1 ){
|
|||
|
+
|
|||
|
+ /* **** 00 A4 00 A4 00 A4 00 E5 **** */
|
|||
|
+ /* **** <20><> <20><> **** */
|
|||
|
+ /* ***j=A4 A4 A4 E5 --> code=0xa4a4 ->find unicode **** */
|
|||
|
+ /* **** 4E 2D 65 87 <--- result **** */
|
|||
|
+
|
|||
|
+ code = tmpbuf[j];
|
|||
|
+ code = code << 8;
|
|||
|
+ code += tmpbuf[j+1];
|
|||
|
+ for (p=0;p<BIG5_TABLE_SIZE;p++) {
|
|||
|
+ if (big5_table[p] == code){
|
|||
|
+ unicode = unicode_table[p];
|
|||
|
+ buffer[i] = unicode >> 8;
|
|||
|
+ buffer[i+1] = unicode ;
|
|||
|
+ j++;
|
|||
|
+ break;
|
|||
|
+ }
|
|||
|
+ /*else {
|
|||
|
+ return (u_int16_t)'?';
|
|||
|
+ }*/
|
|||
|
+ }
|
|||
|
+ }
|
|||
|
}
|
|||
|
|
|||
|
if( source == NULL )
|
|||
|
@@ -176,8 +209,48 @@
|
|||
|
static int FDECL1(joliet_strlen, const char *, string)
|
|||
|
{
|
|||
|
int rtn;
|
|||
|
+ unsigned char * tmpbuf;
|
|||
|
+ int i;
|
|||
|
+ int j;
|
|||
|
+
|
|||
|
+ int p;
|
|||
|
+ u_int16_t code, unicode;
|
|||
|
+ int tmpsize ;
|
|||
|
|
|||
|
rtn = strlen(string) << 1;
|
|||
|
+ tmpsize = rtn;
|
|||
|
+
|
|||
|
+ tmpbuf = (u_char *)string;
|
|||
|
+ tmpsize = rtn;
|
|||
|
+ j=0;
|
|||
|
+ for(i=0; i < tmpsize ; i += 2, j++)
|
|||
|
+ {
|
|||
|
+ /******//* big5 to unicode patch*/
|
|||
|
+
|
|||
|
+ if( tmpbuf[j] >= 0xA1 ){
|
|||
|
+
|
|||
|
+ /* **** 00 A4 00 A4 00 A4 00 E5 **** */
|
|||
|
+ /* **** <20><> <20><> **** */
|
|||
|
+ /* ***j=A4 A4 A4 E5 --> code=0xa4a4 ->find unicode **** */
|
|||
|
+ /* **** 4E 2D 65 87 <--- result **** */
|
|||
|
+
|
|||
|
+ code = tmpbuf[j];
|
|||
|
+ code = code << 8;
|
|||
|
+ code += tmpbuf[j+1];
|
|||
|
+ for (p=0;p<BIG5_TABLE_SIZE;p++) {
|
|||
|
+ if (big5_table[p] == code){
|
|||
|
+ tmpsize -= 2;
|
|||
|
+ unicode = unicode_table[p];
|
|||
|
+ j++;
|
|||
|
+ break;
|
|||
|
+ }
|
|||
|
+ /*else {
|
|||
|
+ return (u_int16_t)'?';
|
|||
|
+ }
|
|||
|
+ */
|
|||
|
+ }
|
|||
|
+ }
|
|||
|
+ }
|
|||
|
|
|||
|
/*
|
|||
|
* We do clamp the maximum length of a Joliet string to be the
|
|||
|
@@ -185,11 +258,11 @@
|
|||
|
* bolix things up with very long paths. The Joliet specs say
|
|||
|
* that the maximum length is 128 bytes, or 64 unicode characters.
|
|||
|
*/
|
|||
|
- if( rtn > 0x80)
|
|||
|
+ if( tmpsize > 0x80)
|
|||
|
{
|
|||
|
- rtn = 0x80;
|
|||
|
+ tmpsize = 0x80;
|
|||
|
}
|
|||
|
- return rtn;
|
|||
|
+ return tmpsize;
|
|||
|
}
|
|||
|
|
|||
|
/*
|