⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 charset.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -