utf8.c

来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 2,062 行 · 第 1/5 页

C
2,062
字号
    }    result = sec_port_ucs4_utf8_conversion_function(PR_TRUE,      utf8, len, (unsigned char *)&back32, sizeof(back32), &len);    if( 4 != len ) {      fprintf(stdout, "Failed to convert UTF-16 0x%04.4x 0x%04.4x to UTF-8: "              "unexpected len %d\n", e->w[0], e->w[1], len);      rv = PR_FALSE;      continue;    }    utf8[len] = '\0'; /* null-terminate for printing */    if( !result ) {      dump_utf8("Failed to convert UTF-8", utf8, "to UCS-4 (utf-16 test)\n");      rv = PR_FALSE;      continue;    }    if( (sizeof(back32) != len) || (e->c != back32) ) {      fprintf(stdout, "Wrong conversion of UTF-16 0x%04.4x 0x%04.4x ",               e->w[0], e->w[1]);      dump_utf8("to UTF-8", utf8, "and then to UCS-4: ");      if( sizeof(back32) != len ) {        fprintf(stdout, "len is %d\n", len);      } else {        fprintf(stdout, "expected 0x%08.8x, received 0x%08.8x\n", e->c, back32);      }      rv = PR_FALSE;      continue;    }    (void)memset(utf8, 0, sizeof(utf8));    back[0] = back[1] = 0;    result = sec_port_ucs4_utf8_conversion_function(PR_FALSE,      (unsigned char *)&e->c, sizeof(e->c), utf8, sizeof(utf8), &len);    if( !result ) {      fprintf(stdout, "Failed to convert UCS-4 0x%08.8x to UTF-8 (utf-16 test)\n",              e->c);      rv = PR_FALSE;      continue;    }    result = sec_port_ucs2_utf8_conversion_function(PR_TRUE,      utf8, len, (unsigned char *)&back[0], sizeof(back), &len);    if( 4 != len ) {      fprintf(stdout, "Failed to convert UCS-4 0x%08.8x to UTF-8: "              "unexpected len %d\n", e->c, len);      rv = PR_FALSE;      continue;    }    utf8[len] = '\0'; /* null-terminate for printing */    if( !result ) {      dump_utf8("Failed to convert UTF-8", utf8, "to UTF-16\n");      rv = PR_FALSE;      continue;    }    if( (sizeof(back) != len) || (e->w[0] != back[0]) || (e->w[1] != back[1]) ) {      fprintf(stdout, "Wrong conversion of UCS-4 0x%08.8x to UTF-8", e->c);      dump_utf8("", utf8, "and then to UTF-16:");      if( sizeof(back) != len ) {        fprintf(stdout, "len is %d\n", len);      } else {        fprintf(stdout, "expected 0x%04.4x 0x%04.4x, received 0x%04.4x 0x%04.4xx\n",                e->w[0], e->w[1], back[0], back[1]);      }      rv = PR_FALSE;      continue;    }  }  return rv;}#endif /* UTF16 */static PRBooltest_zeroes(  void){  PRBool rv = PR_TRUE;  PRBool result;  PRUint32 lzero = 0;  PRUint16 szero = 0;  unsigned char utf8[8];  unsigned int len = 0;  PRUint32 lback = 1;  PRUint16 sback = 1;  (void)memset(utf8, 1, sizeof(utf8));  result = sec_port_ucs4_utf8_conversion_function(PR_FALSE,     (unsigned char *)&lzero, sizeof(lzero), utf8, sizeof(utf8), &len);  if( !result ) {    fprintf(stdout, "Failed to convert UCS-4 0x00000000 to UTF-8\n");    rv = PR_FALSE;  } else if( 1 != len ) {    fprintf(stdout, "Wrong conversion of UCS-4 0x00000000: len = %d\n", len);    rv = PR_FALSE;  } else if( '\0' != *utf8 ) {    fprintf(stdout, "Wrong conversion of UCS-4 0x00000000: expected 00 ,"            "received %02.2x\n", (unsigned int)*utf8);    rv = PR_FALSE;  }  result = sec_port_ucs4_utf8_conversion_function(PR_TRUE,    "", 1, (unsigned char *)&lback, sizeof(lback), &len);  if( !result ) {    fprintf(stdout, "Failed to convert UTF-8 00 to UCS-4\n");    rv = PR_FALSE;  } else if( 4 != len ) {    fprintf(stdout, "Wrong conversion of UTF-8 00 to UCS-4: len = %d\n", len);    rv = PR_FALSE;  } else if( 0 != lback ) {    fprintf(stdout, "Wrong conversion of UTF-8 00 to UCS-4: "            "expected 0x00000000, received 0x%08.8x\n", lback);    rv = PR_FALSE;  }  (void)memset(utf8, 1, sizeof(utf8));  result = sec_port_ucs2_utf8_conversion_function(PR_FALSE,     (unsigned char *)&szero, sizeof(szero), utf8, sizeof(utf8), &len);  if( !result ) {    fprintf(stdout, "Failed to convert UCS-2 0x0000 to UTF-8\n");    rv = PR_FALSE;  } else if( 1 != len ) {    fprintf(stdout, "Wrong conversion of UCS-2 0x0000: len = %d\n", len);    rv = PR_FALSE;  } else if( '\0' != *utf8 ) {    fprintf(stdout, "Wrong conversion of UCS-2 0x0000: expected 00 ,"            "received %02.2x\n", (unsigned int)*utf8);    rv = PR_FALSE;  }  result = sec_port_ucs2_utf8_conversion_function(PR_TRUE,    "", 1, (unsigned char *)&sback, sizeof(sback), &len);  if( !result ) {    fprintf(stdout, "Failed to convert UTF-8 00 to UCS-2\n");    rv = PR_FALSE;  } else if( 2 != len ) {    fprintf(stdout, "Wrong conversion of UTF-8 00 to UCS-2: len = %d\n", len);    rv = PR_FALSE;  } else if( 0 != sback ) {    fprintf(stdout, "Wrong conversion of UTF-8 00 to UCS-2: "            "expected 0x0000, received 0x%04.4x\n", sback);    rv = PR_FALSE;  }  return rv;}static PRBooltest_multichars(  void){  int i;  unsigned int len, lenout;  PRUint32 *ucs4s;  char *ucs4_utf8;  PRUint16 *ucs2s;  char *ucs2_utf8;  void *tmp;  PRBool result;  ucs4s = (PRUint32 *)calloc(sizeof(ucs4)/sizeof(ucs4[0]), sizeof(PRUint32));  ucs2s = (PRUint16 *)calloc(sizeof(ucs2)/sizeof(ucs2[0]), sizeof(PRUint16));  if( ((PRUint32 *)NULL == ucs4s) || ((PRUint16 *)NULL == ucs2s) ) {    fprintf(stderr, "out of memory\n");    exit(1);  }  len = 0;  for( i = 0; i < sizeof(ucs4)/sizeof(ucs4[0]); i++ ) {    ucs4s[i] = ucs4[i].c;    len += strlen(ucs4[i].utf8);  }  ucs4_utf8 = (char *)malloc(len);  len = 0;  for( i = 0; i < sizeof(ucs2)/sizeof(ucs2[0]); i++ ) {    ucs2s[i] = ucs2[i].c;    len += strlen(ucs2[i].utf8);  }  ucs2_utf8 = (char *)malloc(len);  if( ((char *)NULL == ucs4_utf8) || ((char *)NULL == ucs2_utf8) ) {    fprintf(stderr, "out of memory\n");    exit(1);  }  *ucs4_utf8 = '\0';  for( i = 0; i < sizeof(ucs4)/sizeof(ucs4[0]); i++ ) {    strcat(ucs4_utf8, ucs4[i].utf8);  }  *ucs2_utf8 = '\0';  for( i = 0; i < sizeof(ucs2)/sizeof(ucs2[0]); i++ ) {    strcat(ucs2_utf8, ucs2[i].utf8);  }  /* UTF-8 -> UCS-4 */  len = sizeof(ucs4)/sizeof(ucs4[0]) * sizeof(PRUint32);  tmp = calloc(len, 1);  if( (void *)NULL == tmp ) {    fprintf(stderr, "out of memory\n");    exit(1);  }  result = sec_port_ucs4_utf8_conversion_function(PR_TRUE,    ucs4_utf8, strlen(ucs4_utf8), tmp, len, &lenout);  if( !result ) {    fprintf(stdout, "Failed to convert much UTF-8 to UCS-4\n");    goto done;  }  if( lenout != len ) {    fprintf(stdout, "Unexpected length converting much UTF-8 to UCS-4\n");    goto loser;  }  if( 0 != memcmp(ucs4s, tmp, len) ) {    fprintf(stdout, "Wrong conversion of much UTF-8 to UCS-4\n");    goto loser;  }  free(tmp); tmp = (void *)NULL;  /* UCS-4 -> UTF-8 */  len = strlen(ucs4_utf8);  tmp = calloc(len, 1);  if( (void *)NULL == tmp ) {    fprintf(stderr, "out of memory\n");    exit(1);  }  result = sec_port_ucs4_utf8_conversion_function(PR_FALSE,    (unsigned char *)ucs4s, sizeof(ucs4)/sizeof(ucs4[0]) * sizeof(PRUint32),     tmp, len, &lenout);  if( !result ) {    fprintf(stdout, "Failed to convert much UCS-4 to UTF-8\n");    goto done;  }  if( lenout != len ) {    fprintf(stdout, "Unexpected length converting much UCS-4 to UTF-8\n");    goto loser;  }  if( 0 != strncmp(ucs4_utf8, tmp, len) ) {    fprintf(stdout, "Wrong conversion of much UCS-4 to UTF-8\n");    goto loser;  }  free(tmp); tmp = (void *)NULL;  /* UTF-8 -> UCS-2 */  len = sizeof(ucs2)/sizeof(ucs2[0]) * sizeof(PRUint16);  tmp = calloc(len, 1);  if( (void *)NULL == tmp ) {    fprintf(stderr, "out of memory\n");    exit(1);  }  result = sec_port_ucs2_utf8_conversion_function(PR_TRUE,    ucs2_utf8, strlen(ucs2_utf8), tmp, len, &lenout);  if( !result ) {    fprintf(stdout, "Failed to convert much UTF-8 to UCS-2\n");    goto done;  }  if( lenout != len ) {    fprintf(stdout, "Unexpected length converting much UTF-8 to UCS-2\n");    goto loser;  }  if( 0 != memcmp(ucs2s, tmp, len) ) {    fprintf(stdout, "Wrong conversion of much UTF-8 to UCS-2\n");    goto loser;  }  free(tmp); tmp = (void *)NULL;  /* UCS-2 -> UTF-8 */  len = strlen(ucs2_utf8);  tmp = calloc(len, 1);  if( (void *)NULL == tmp ) {    fprintf(stderr, "out of memory\n");    exit(1);  }  result = sec_port_ucs2_utf8_conversion_function(PR_FALSE,    (unsigned char *)ucs2s, sizeof(ucs2)/sizeof(ucs2[0]) * sizeof(PRUint16),     tmp, len, &lenout);  if( !result ) {    fprintf(stdout, "Failed to convert much UCS-2 to UTF-8\n");    goto done;  }  if( lenout != len ) {    fprintf(stdout, "Unexpected length converting much UCS-2 to UTF-8\n");    goto loser;  }  if( 0 != strncmp(ucs2_utf8, tmp, len) ) {    fprintf(stdout, "Wrong conversion of much UCS-2 to UTF-8\n");    goto loser;  }#ifdef UTF16  /* implement me */#endif /* UTF16 */  result = PR_TRUE;  goto done; loser:  result = PR_FALSE; done:  free(ucs4s);  free(ucs4_utf8);  free(ucs2s);  free(ucs2_utf8);  if( (void *)NULL != tmp ) free(tmp);  return result;}voidbyte_order(  void){  /*   * The implementation (now) expects the 16- and 32-bit characters   * to be in network byte order, not host byte order.  Therefore I   * have to byteswap all those test vectors above.  hton[ls] may be   * functions, so I have to do this dynamically.  If you want to    * use this code to do host byte order conversions, just remove   * the call in main() to this function.   */  int i;  for( i = 0; i < sizeof(ucs4)/sizeof(ucs4[0]); i++ ) {    struct ucs4 *e = &ucs4[i];    e->c = htonl(e->c);  }  for( i = 0; i < sizeof(ucs2)/sizeof(ucs2[0]); i++ ) {    struct ucs2 *e = &ucs2[i];    e->c = htons(e->c);  }#ifdef UTF16  for( i = 0; i < sizeof(utf16)/sizeof(utf16[0]); i++ ) {    struct utf16 *e = &utf16[i];    e->c = htonl(e->c);    e->w[0] = htons(e->w[0]);    e->w[1] = htons(e->w[1]);  }#endif /* UTF16 */  return;}intmain(  int argc,  char *argv[]){  byte_order();  if( test_ucs4_chars() &&      test_ucs2_chars() &&#ifdef UTF16      test_utf16_chars() &&#endif /* UTF16 */      test_zeroes() &&      test_multichars() &&      PR_TRUE ) {    fprintf(stderr, "PASS\n");    return 1;  } else {    fprintf(stderr, "FAIL\n");    return 0;  }}#endif /* TEST_UTF8 */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?