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

📄 8bit_tab_to_h.c

📁 libiconv是一个很不错的字符集转换库。程序接口也很简单
💻 C
📖 第 1 页 / 共 2 页
字号:
            }          }          if (!(i1 == 0 && i2 == 16))            fprintf(f, "  }\n");          i1 = i2;        }        if (final_ret_reached)          fprintf(f, "  return RET_ILSEQ;\n");      } else {        for (i1 = 0; i1 < 16;) {          int t = line[i1];          for (i2 = i1; i2 < 16 && line[i2] == t; i2++);          if (i1 == 0) {            if (i2 == 16) {              fprintf(f, "  ");            } else {              fprintf(f, "  if (c < 0x%02x)\n    ", 16*i2);            }          } else {            if (i2 == 16) {              fprintf(f, "  else\n    ");            } else {              fprintf(f, "  else if (c < 0x%02x)\n    ", 16*i2);            }          }          if (t == -1)            fprintf(f, "*pwc = (ucs4_t) c;\n");          else {            fprintf(f, "*pwc = (ucs4_t) %s_2uni", c_charsetname);            if (tableno > 1)              fprintf(f, "_%d", t+1);            fprintf(f, "[c");            if (tables[t].minline > 0)              fprintf(f, "-0x%02x", 16*tables[t].minline);            fprintf(f, "];\n");          }          i1 = i2;        }        fprintf(f, "  return 1;\n");      }      fprintf(f, "}\n");    }    fprintf(f, "\n");    {      int uni2charset[0x10000];      bool pages[0x100];      int line[0x2000];      int tableno;      struct { int minline; int maxline; int usecount; const char* suffix; } tables[0x2000];      bool need_c;      bool fix_0000;      int i, j, p, j1, j2, t;      for (j = 0; j < 0x10000; j++)        uni2charset[j] = 0;      for (p = 0; p < 0x100; p++)        pages[p] = false;      for (i = 0; i < 0x100; i++) {        j = charset2uni[i];        if (j != 0xfffd) {          uni2charset[j] = i;          pages[j>>8] = true;        }      }      for (j1 = 0; j1 < 0x2000; j1++) {        bool all_invalid = true;        bool all_identity = true;        for (j2 = 0; j2 < 8; j2++) {          j = 8*j1+j2;          if (uni2charset[j] != 0)            all_invalid = false;          if (uni2charset[j] != j)            all_identity = false;        }        if (all_invalid)          line[j1] = -2;        else if (all_identity)          line[j1] = -1;        else          line[j1] = 0;      }      tableno = 0;      for (j1 = 0; j1 < 0x2000; j1++) {        if (line[j1] >= 0) {          if (tableno > 0              && ((j1 > 0 && line[j1-1] == tableno-1)                  || ((tables[tableno-1].maxline >> 5) == (j1 >> 5)                      && j1 - tables[tableno-1].maxline <= 8))) {            line[j1] = tableno-1;            tables[tableno-1].maxline = j1;          } else {            tableno++;            line[j1] = tableno-1;            tables[tableno-1].minline = tables[tableno-1].maxline = j1;          }        }      }      for (t = 0; t < tableno; t++) {        tables[t].usecount = 0;        j1 = 8*tables[t].minline;        j2 = 8*(tables[t].maxline+1);        for (j = j1; j < j2; j++)          if (uni2charset[j] != 0)            tables[t].usecount++;      }      for (t = 0, p = -1, i = 0; t < tableno; t++) {        if (tables[t].usecount > 1) {          char* s;          if (p == tables[t].minline >> 5) {            s = (char*) malloc(5+1);            sprintf(s, "%02x_%d", p, ++i);          } else {            p = tables[t].minline >> 5;            s = (char*) malloc(2+1);            sprintf(s, "%02x", p);          }          tables[t].suffix = s;        } else          tables[t].suffix = NULL;      }      {        p = -1;        for (t = 0; t < tableno; t++)          if (tables[t].usecount > 1) {            p = 0;            fprintf(f, "static const unsigned char %s_page%s[%d] = {\n", c_charsetname, tables[t].suffix, 8*(tables[t].maxline-tables[t].minline+1));            for (j1 = tables[t].minline; j1 <= tables[t].maxline; j1++) {              if ((j1 % 0x20) == 0 && j1 > tables[t].minline)                fprintf(f, "  /* 0x%04x */\n", 8*j1);              fprintf(f, " ");              for (j2 = 0; j2 < 8; j2++) {                j = 8*j1+j2;                fprintf(f, " 0x%02x,", uni2charset[j]);              }              fprintf(f, " /* 0x%02x-0x%02x */\n", 8*(j1 % 0x20), 8*(j1 % 0x20)+7);            }            fprintf(f, "};\n");          }        if (p >= 0)          fprintf(f, "\n");      }      need_c = false;      for (j1 = 0; j1 < 0x2000;) {        t = line[j1];        for (j2 = j1; j2 < 0x2000 && line[j2] == t; j2++);        if (t >= 0)          j2 = tables[t].maxline+1;        if (!(t == -2 || (t == -1 && j1 == 0)))          need_c = true;        j1 = j2;      }      fix_0000 = false;      fprintf(f, "static int\n%s_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)\n", c_charsetname);      fprintf(f, "{\n");      if (need_c)        fprintf(f, "  unsigned char c = 0;\n");      for (j1 = 0; j1 < 0x2000;) {        t = line[j1];        for (j2 = j1; j2 < 0x2000 && line[j2] == t; j2++);        if (t >= 0) {          if (j1 != tables[t].minline) abort();          if (j2 > tables[t].maxline+1) abort();          j2 = tables[t].maxline+1;        }        if (t == -2) {        } else {          if (j1 == 0)            fprintf(f, "  ");          else            fprintf(f, "  else ");          if (t >= 0 && tables[t].usecount == 0) abort();          if (t >= 0 && tables[t].usecount == 1) {            if (j2 != j1+1) abort();            for (j = 8*j1; j < 8*j2; j++)              if (uni2charset[j] != 0) {                fprintf(f, "if (wc == 0x%04x)\n    c = 0x%02x;\n", j, uni2charset[j]);                break;              }          } else {            if (j1 == 0) {              fprintf(f, "if (wc < 0x%04x)", 8*j2);            } else {              fprintf(f, "if (wc >= 0x%04x && wc < 0x%04x)", 8*j1, 8*j2);            }            if (t == -1) {              if (j1 == 0)                /* If wc == 0, the function must return 1, not -1. */                fprintf(f, " {\n    *r = wc;\n    return 1;\n  }\n");              else                fprintf(f, "\n    c = wc;\n");            } else {              fprintf(f, "\n    c = %s_page%s[wc", c_charsetname, tables[t].suffix);              if (tables[t].minline > 0)                fprintf(f, "-0x%04x", 8*j1);              fprintf(f, "];\n");              if (j1 == 0 && uni2charset[0] == 0)                /* If wc == 0, the function must return 1, not -1. */                fix_0000 = true;            }          }        }        j1 = j2;      }      if (need_c) {        if (fix_0000)          fprintf(f, "  if (c != 0 || wc == 0) {\n");        else          fprintf(f, "  if (c != 0) {\n");        fprintf(f, "    *r = c;\n");        fprintf(f, "    return 1;\n");        fprintf(f, "  }\n");      }      fprintf(f, "  return RET_ILUNI;\n");      fprintf(f, "}\n");    }    if (ferror(f) || fclose(f))      exit(1);  }#if 0    int i1, i2, i3, i1_min, i1_max, j1, j2;  i1_min = 16;  i1_max = -1;  for (i1 = 0; i1 < 16; i1++)    for (i2 = 0; i2 < 16; i2++)      if (charset2uni[16*i1+i2] != 0xfffd) {        if (i1_min > i1) i1_min = i1;        if (i1_max < i1) i1_max = i1;      }  printf("static const unsigned short %s_2uni[%d] = {\n",         name, 16*(i1_max-i1_min+1));  for (i1 = i1_min; i1 <= i1_max; i1++) {    printf("  /""* 0x%02x *""/\n", 16*i1);    for (i2 = 0; i2 < 2; i2++) {      printf("  ");      for (i3 = 0; i3 < 8; i3++) {        if (i3 > 0) printf(" ");        printf("0x%04x,", charset2uni[16*i1+8*i2+i3]);      }      printf("\n");    }  }  printf("};\n");  printf("\n");  for (p = 0; p < 0x100; p++)    pages[p] = 0;  for (i = 0; i < 0x100; i++)    if (charset2uni[i] != 0xfffd)      pages[charset2uni[i]>>8] = 1;  for (p = 0; p < 0x100; p++)    if (pages[p]) {      int j1_min = 32;      int j1_max = -1;      for (j1 = 0; j1 < 32; j1++)        for (j2 = 0; j2 < 8; j2++)          if (uni2charset[256*p+8*j1+j2] != 0) {            if (j1_min > j1) j1_min = j1;            if (j1_max < j1) j1_max = j1;          }      printf("static const unsigned char %s_page%02x[%d] = {\n",             name, p, 8*(j1_max-j1_min+1));      for (j1 = j1_min; j1 <= j1_max; j1++) {        printf("  ");        for (j2 = 0; j2 < 8; j2++)          printf("0x%02x, ", uni2charset[256*p+8*j1+j2]);        printf("/""* 0x%02x-0x%02x *""/\n", 8*j1, 8*j1+7);      }      printf("};\n");    }  printf("\n");}#endif  exit(0);}

⌨️ 快捷键说明

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