📄 charset.c
字号:
break;
case 'O':
switch ( *s ) {
case 'D': c = 0xA4; break; /* <dollar-sign> */
case 'N': c = 0xD6; break; /* <not-sign> */
}
break;
case 'o':
switch ( *s ) {
case 'C': c = 0xD3; break; /* <copyright-sign> */
case '-': c = 0xEB; break; /* <masculine-ordinal-o> */
}
break;
case 'S':
switch ( *s ) {
case '1': c = 0xD1; break; /* <superscript-1> */
case '2': c = 0xB2; break; /* <superscript-2> */
case '3': c = 0xB3; break; /* <superscript-3> */
case 'N': c = 0xA0; break; /* <no-break-space> */
}
break;
case 's':
if ( *s == 's' ) c = 0xFB; /* <sharp-s> */
break;
case 't':
if ( *s == 'C' ) c = 0xA2; /* <cent-sign> */
break;
case 'u':
if ( *s == 'C' ) c = 0xA8; /* <currency-sign> */
break;
case 'v':
if ( *s == '-' ) c = 0xAF; /* <downwards-arrow> */
break;
case 'X':
if ( *s == '*' ) c = 0xB4; /* <multiplication-sign> */
break;
case 'y':
if ( *s == 'M' ) c = 0xB5; /* <micro-sign> */
break;
}
if ( c > 0 ) {
*o++ = c;
return o;
} else if ( !c )
return NULL;
/* else: c < 0 */
n = -c;
switch ( *s ) {
case 'A': c = letter_w_diacritic[n][0]; break;
case 'C': c = letter_w_diacritic[n][1]; break;
case 'D': c = letter_w_diacritic[n][2]; break;
case 'E': c = letter_w_diacritic[n][3]; break;
case 'G': c = letter_w_diacritic[n][4]; break;
case 'H': c = letter_w_diacritic[n][5]; break;
case 'I': c = letter_w_diacritic[n][6]; break;
case 'J': c = letter_w_diacritic[n][7]; break;
case 'K': c = letter_w_diacritic[n][8]; break;
case 'L': c = letter_w_diacritic[n][9]; break;
case 'N': c = letter_w_diacritic[n][10]; break;
case 'O': c = letter_w_diacritic[n][11]; break;
case 'R': c = letter_w_diacritic[n][12]; break;
case 'S': c = letter_w_diacritic[n][13]; break;
case 'T': c = letter_w_diacritic[n][14]; break;
case 'U': c = letter_w_diacritic[n][15]; break;
case 'W': c = letter_w_diacritic[n][16]; break;
case 'Y': c = letter_w_diacritic[n][17]; break;
case 'Z': c = letter_w_diacritic[n][18]; break;
case 'a': c = letter_w_diacritic[n][19]; break;
case 'c': c = letter_w_diacritic[n][20]; break;
case 'd': c = letter_w_diacritic[n][21]; break;
case 'e': c = letter_w_diacritic[n][22]; break;
case 'g': c = letter_w_diacritic[n][23]; break;
case 'h': c = letter_w_diacritic[n][24]; break;
case 'i': c = letter_w_diacritic[n][25]; break;
case 'j': c = letter_w_diacritic[n][26]; break;
case 'k': c = letter_w_diacritic[n][27]; break;
case 'l': c = letter_w_diacritic[n][28]; break;
case 'n': c = letter_w_diacritic[n][29]; break;
case 'o': c = letter_w_diacritic[n][30]; break;
case 'r': c = letter_w_diacritic[n][31]; break;
case 's': c = letter_w_diacritic[n][32]; break;
case 't': c = letter_w_diacritic[n][33]; break;
case 'u': c = letter_w_diacritic[n][34]; break;
case 'w': c = letter_w_diacritic[n][35]; break;
case 'y': c = letter_w_diacritic[n][36]; break;
case 'z': c = letter_w_diacritic[n][37]; break;
case '\'':
case ' ': c = -1; break;
default: c = 0;
}
if ( !c )
return NULL;
*o++ = n + 0xC0;
*o++ = ( ( (*s == ' ') || (*s == '\'') ) ? ALONE : *s );
return o;
}
/* --- routine to convert from ISO 8859-n to T.61 --- */
int
ldap_8859_to_t61( char **bufp, unsigned long *buflenp, int free_input )
{
Byte *s, *oo, *o, *aux;
int c;
unsigned long len;
Couple *cc;
Debug( LDAP_DEBUG_TRACE, "ldap_8859_to_t61 input length: %ld\n",
*buflenp, 0, 0 );
len = *buflenp;
s = (Byte *) *bufp;
if ( (o = oo = (Byte *)malloc( 2 * len + 64 )) == NULL ) {
return( 1 );
}
while ( (char *)s - *(char **)bufp < len ) {
switch( *s >> 5 ) {
case 2:
switch ( *s ) {
case '^': *o++ = 0xC3; *o++ = ALONE; s++; break;
case '\\':
s++;
if ( (c = hh_to_c( s )) != -1 ) {
*o++ = c;
s += 2;
} else
*o++ = '\\';
break;
default: *o++ = *s++;
}
break;
case 3:
switch ( *s ) {
case '`': *o++ = 0xC1; *o++ = ALONE; s++; break;
case '~': *o++ = 0xC4; *o++ = ALONE; s++; break;
case '{':
s++;
if ( *(s + 2) == '}' ) {
if ( (aux = cc_to_t61( o, s )) != NULL ) {
o = aux;
s += 3;
} else {
*o++ = '{';
}
} else if ( (*(s + 3) == '}') && ( (*s == 'x') || (*s == 'X') ) &&
( (c = hh_to_c( s + 1 )) != -1 ) ) {
*o++ = c;
s += 4;
} else {
*o++ = '{';
}
break;
default:
*o++ = *s++;
}
break;
#if (ISO_8859 == 0)
case 4: case 5: case 6: case 7:
s++;
break;
#else
case 5: case 6: case 7:
# if (ISO_8859 == 1) || (ISO_8859 == 2) || (ISO_8859 == 3) || \
(ISO_8859 == 4) || (ISO_8859 == 9) || (ISO_8859 == 10)
if ( (*(cc = &trans_iso8859_t61[ *s - 0xA0 ])).a ) {
*o++ = (*cc).a;
if ( (*cc).b ) *o++ = (*cc).b;
}
# endif
s++;
break;
#endif
default:
*o++ = *s++;
}
}
len = o - oo;
o = oo;
if ( (oo = (Byte *)realloc( o, len )) == NULL ) {
free( o );
return( 1 );
}
if ( free_input ) {
free( *bufp );
}
*bufp = (char *) oo;
*buflenp = len;
return( 0 );
}
#ifdef NOT_NEEDED_IN_LIBLDAP /* mcs@umich.edu 12 Oct 1995 */
/* --- routine to convert "escaped" (\hh) characters to 8bits --- */
void convert_escaped_to_8bit( s )
char *s;
{
char *o = s;
int c;
while ( *s ) {
if ( *s == '\\' ) {
if ( (c = hh_to_c( ++s )) != -1 ) {
*o++ = c;
s += 2;
} else
*o++ = '\\';
} else
*o++ = *s++;
}
*o = '\0';
}
/* --- routine to convert 8bits characters to the "escaped" (\hh) form --- */
char *convert_8bit_to_escaped( s )
Byte *s;
{
Byte *o, *oo;
Byte n;
if ( (o = oo = (Byte *)malloc( 2 * strlen( s ) + 64 )) == NULL ) {
return( NULL );
}
while ( *s ) {
if ( *s < 0x80 )
*o++ = *s++;
else {
*o++ = '\\';
n = *s >> 4;
*o++ = ((n < 0xA) ? '0' : 'A' - 0xA) + n;
n = *s++ & 0x0F;
*o++ = ((n < 0xA) ? '0' : 'A' - 0xA) + n;
}
}
*o = '\0';
o = oo;
if ( (oo = (Byte *)realloc( o, strlen( o ) + 1 )) == NULL ) {
free( o );
return( NULL );
}
return( (char *)oo );
}
/* --- routine to convert from T.61 to printable characters --- */
/*
printable characters [RFC 1488]: 'A'..'Z', 'a'..'z', '0'..'9',
'\'', '(', ')', '+', ',', '-', '.', '/', ':', '?, ' '.
that conversion is language dependent.
*/
static Couple last_t61_printabled[32] = {
{0,0}, {'A','E'}, {'D',0}, {0,0},
{'H',0}, {0,0}, {'I','J'}, {'L',0},
{'L',0}, {'O',0}, {'O','E'}, {0,0},
{'T','H'}, {'T',0}, {'N','G'}, {'n',0},
{'k',0}, {'a','e'}, {'d',0}, {'d',0},
{'h',0}, {'i',0}, {'i','j'}, {'l',0},
{'l',0}, {'o',0}, {'o','e'}, {'s','s'},
{'t','h'}, {'t',0}, {'n','g'}, {0,0}
};
char *t61_printable( s )
Byte *s;
{
Byte *o, *oo;
Byte n;
Couple *cc;
if ( (o = oo = (Byte *)malloc( 2 * strlen( s ) + 64 )) == NULL ) {
return( NULL );
}
while ( *s ) {
if ( ( (*s >= 'A') && (*s <= 'Z') ) ||
( (*s >= 'a') && (*s <= 'z') ) ||
( (*s >= '0') && (*s <= '9') ) ||
( (*s >= '\'') && (*s <= ')') ) ||
( (*s >= '+') && (*s <= '/') ) ||
( *s == '?' ) || ( *s == ' ' ) )
*o++ = *s++;
else {
if ( *s >= 0xE0 ) {
if ( (*(cc = &last_t61_printabled[ *s - 0xE0 ])).a ) {
*o++ = (*cc).a;
if ( (*cc).b ) *o++ = (*cc).b;
}
}
else if ( (*s >> 4) == 0xC ) {
switch ( *s ) {
case 0xCA: /* ring */
switch ( *(s + 1) ) {
case 'A': *o++ = 'A'; *o++ = 'A'; s++; break; /* Swedish */
case 'a': *o++ = 'a'; *o++ = 'a'; s++; break; /* Swedish */
}
break;
case 0xC8: /* diaeresis */
switch ( *(s + 1) ) {
case 'Y': *o++ = 'I'; *o++ = 'J'; s++; break; /* Dutch */
case 'y': *o++ = 'i'; *o++ = 'j'; s++; break; /* Dutch */
}
break;
}
}
s++;
}
}
*o = '\0';
o = oo;
if ( (oo = (Byte *)realloc( o, strlen( o ) + 1 )) == NULL ) {
free( o );
return( NULL );
}
return( (char *)oo );
}
#endif /* NOT_NEEDED_IN_LIBLDAP */ /* mcs@umich.edu 12 Oct 1995 */
#endif /* LDAP_CHARSET_8859 */
#endif /* STR_TRANSLATION */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -