📄 makeuctb.c
字号:
if (un0 < 0) { fprintf(stderr, "Bad input line: %s\n", buffer); exit(EX_DATAERR); fprintf(stderr, "%s: Bad Unicode range corresponding to font position range 0x%x-0x%x\n", tblname, fp0, fp1); exit(EX_DATAERR); } un1 = un0; while (*p == ' ' || *p == '\t') { p++; } if (*p == '-') { p++; while (*p == ' ' || *p == '\t') { p++; } un1 = getunicode(&p); if (un1 < 0 || un1 < un0) { fprintf(stderr, "%s: Bad Unicode range U+%x-U+%x\n", tblname, un0, un1); fprintf(stderr, "Bad input line: %s\n", buffer); exit(EX_DATAERR); } while (*p == ' ' || *p == '\t') { p++; } } if (*p != ':' && *p != '"') { fprintf(stderr, "No ':' or '\"' where expected: %s\n", buffer); continue; } tbuf = (char *)malloc(4*strlen(p)); if (!(p1 = tbuf)) { fprintf(stderr, "%s: Out of memory\n", tblname); exit(EX_DATAERR); } if (*p == '"') { /* * Handle "<C replace>". * Copy chars verbatim until first '"' not \-escaped or * end of buffer. */ int escaped = 0; for (ch = *(++p); (ch = *p) != '\0'; p++) { if (escaped) { escaped = 0; } else if (ch == '"') { break; } else if (ch == '\\') { escaped = 1; } *p1++ = ch; } if (escaped || ch != '"') { fprintf(stderr, "Warning: String not terminated: %s\n", buffer); if (escaped) *p1++ = '\n'; } } else { /* * We had ':'. */ for (ch = *(++p); (ch = *p) != '\0'; p++, p1++) { if ((unsigned char)ch < 32 || ch == '\\' || ch == '\"' || (unsigned char)ch >= 127) { sprintf(p1, "\\%.3o", (unsigned char)ch); #ifdef NOTDEFINED fprintf(stderr, "%s\n", tbuf);#endif /* NOTDEFINED */ p1 += 3; } else { *p1 = ch; } } } *p1 = '\0'; for (i = un0; i <= un1; i++) {#ifdef NOTDEFINED printf("U+0x%x:%s\n", i, tbuf); */#endif /* NOTDEFINED */ addpair_str(tbuf,i); } continue; } /* * Input line (after skipping spaces) doesn't start with one * of the specially recognized characters, so try to interpret * it as starting with a fontpos. */ fp0 = strtol(p, &p1, 0); if (p1 == p) { fprintf(stderr, "Bad input line: %s\n", buffer); exit(EX_DATAERR); } p = p1; while (*p == ' ' || *p == '\t') { p++; } if (*p == '-') { p++; fp1 = strtol(p, &p1, 0); if (p1 == p) { fprintf(stderr, "Bad input line: %s\n", buffer); exit(EX_DATAERR); } p = p1; } else { fp1 = 0; } if (fp0 < 0 || fp0 >= fontlen) { fprintf(stderr, "%s: Glyph number (0x%x) larger than font length\n", tblname, fp0); exit(EX_DATAERR); } if (fp1 && (fp1 < fp0 || fp1 >= fontlen)) { fprintf(stderr, "%s: Bad end of range (0x%x)\n", tblname, fp1); exit(EX_DATAERR); } if (fp1) { /* * We have a range; expect the word "idem" * or a Unicode range of the same length. */ while (*p == ' ' || *p == '\t') { p++; } if (!strncmp(p, "idem", 4)) { for (i = fp0; i <= fp1; i++) { addpair(i,i); } p += 4; } else { un0 = getunicode(&p); while (*p == ' ' || *p == '\t') { p++; } if (*p != '-') { fprintf(stderr, "%s: Corresponding to a range of font positions,", tblname); fprintf(stderr, " there should be a Unicode range.\n"); exit(EX_DATAERR); } p++; un1 = getunicode(&p); if (un0 < 0 || un1 < 0) { fprintf(stderr, "%s: Bad Unicode range corresponding to font position range 0x%x-0x%x\n", tblname, fp0, fp1); exit(EX_DATAERR); } if (un1 - un0 != fp1 - fp0) { fprintf(stderr, "%s: Unicode range U+%x-U+%x not of the same length", tblname, un0, un1); fprintf(stderr, " as font position range 0x%x-0x%x\n", fp0, fp1); exit(EX_DATAERR); } for (i = fp0; i <= fp1; i++) { addpair(i,un0-fp0+i); } } } else { /* * No range; expect a list of unicode values * or unicode ranges for a single font position, * or the word "idem" */ while (*p == ' ' || *p == '\t') { p++; } if (!strncmp(p, "idem", 4)) { addpair(fp0,fp0); p += 4; } while ((un0 = getunicode(&p)) >= 0) { addpair(fp0, un0); while (*p == ' ' || *p == '\t') { p++; } if (*p == '-') { p++; un1 = getunicode(&p); if (un1 < un0) { fprintf(stderr, "%s: Bad Unicode range 0x%x-0x%x\n", tblname, un0, un1); exit(EX_DATAERR); } for (un0++; un0 <= un1; un0++) { addpair(fp0, un0); } } } } while (*p == ' ' || *p == '\t') { p++; } if (*p && *p != '#') { fprintf(stderr, "%s: trailing junk (%s) ignored\n", tblname, p); } } /* * Okay, we hit EOF, now output tables. */ fclose(ctbl); /* * Compute total size of Unicode list. */ nuni = 0; for (i = 0 ; i < fontlen ; i++) { nuni += unicount[i]; } if (argc >= 3) { strncpy(this_MIMEcharset,argv[2],UC_MAXLEN_MIMECSNAME); } else if (this_MIMEcharset[0] == '\0') { strncpy(this_MIMEcharset,tblname,UC_MAXLEN_MIMECSNAME); if ((p = strchr(this_MIMEcharset,'.')) != 0) { *p = '\0'; } } for (p = this_MIMEcharset; *p; p++) { *p = TOLOWER(*p); } if (argc >= 4) { strncpy(this_LYNXcharset,argv[3],UC_MAXLEN_LYNXCSNAME); } else if (this_LYNXcharset[0] == '\0') { strncpy(this_LYNXcharset,this_MIMEcharset,UC_MAXLEN_LYNXCSNAME); } if ((i = strlen(this_LYNXcharset)) < UC_LEN_LYNXCSNAME) { for (; i < UC_LEN_LYNXCSNAME; i++) { this_LYNXcharset[i] = ' '; } this_LYNXcharset[i] = '\0'; }#ifdef NOTDEFINED fprintf(stderr,"this_MIMEcharset: %s.\n",this_MIMEcharset); fprintf(stderr,"this_LYNXcharset: %s.\n",this_LYNXcharset);#endif /* NOTDEFINED */ if (this_isDefaultMap == -1) { this_isDefaultMap = !strncmp(this_MIMEcharset,"iso-8859-1", 10); } fprintf(stderr, "makeuctb: %s: %stranslation map", this_MIMEcharset, (this_isDefaultMap ? "default " : "")); if (this_isDefaultMap == 1) { *id_append = '\0'; } else { for (i = 0, p = this_MIMEcharset; *p && (i < UC_MAXLEN_ID_APPEND-1); p++, i++) { id_append[i+1] = isalnum(*p) ? *p : '_'; } } id_append[i+1] = '\0'; fprintf(stderr, " (%s).\n", id_append); printf("\/*\n\ * uni_hash.tbl\n\ *\n\ * Do not edit this file; it was automatically generated by\n\ *\n\ * %s %s\n\ *\n\ */\n\\n\static u8 dfont_unicount%s[%d] = \n\{\n\t", argv[0], argv[1], id_append, fontlen); for (i = 0; i < fontlen; i++) { if (i >= 128 && unicount[i] > 0 && i < lowest_eight) { lowest_eight = i; } printf("%3d", unicount[i]); if (i == (fontlen - 1)) { printf("\n};\n"); } else if ((i % 8) == 7) { printf(",\n\t"); } else { printf(", "); } } /* * If lowest_eightbit is anything else but 999, * this can't be 7-bit only. */ if (lowest_eight != 999 && !RawOrEnc) { RawOrEnc = UCT_ENC_8BIT; } if (nuni) { printf("\nstatic u16 dfont_unitable%s[%d] = \n{\n\t", id_append, nuni); } else { printf("\nstatic u16 dfont_unitable%s[1]; /* dummy */\n", id_append); } fp0 = 0; nent = 0; for (i = 0; i < nuni; i++) { while (nent >= unicount[fp0]) { fp0++; nent = 0; } printf("0x%04x", unitable[fp0][nent++]); if (i == (nuni - 1)) { printf("\n};\n"); } else if ((i % 8) == 7) { printf(",\n\t"); } else { printf(", "); } } if (themap_str.entry_ct) { printf("\n\static struct unipair_str repl_map%s[%d] = \n\{\n\t", id_append, themap_str.entry_ct); } else { printf("\n\/* static struct unipair_str repl_map%s[]; */\n", id_append); } for (i = 0; i < themap_str.entry_ct; i++) { printf("{0x%x,\"%s\"}", themap_str.entries[i].unicode, themap_str.entries[i].replace_str); if (i == (themap_str.entry_ct - 1)) { printf("\n};\n"); } else if ((i % 4) == 3) { printf(",\n\t"); } else { printf(", "); } } if (themap_str.entry_ct) { printf("\n\static struct unimapdesc_str dfont_replacedesc%s = {%d,repl_map%s,",id_append, themap_str.entry_ct, id_append); } else { printf("\n\static struct unimapdesc_str dfont_replacedesc%s = {0,NULL,",id_append); } printf("%d,%d};\n", this_isDefaultMap ? 1 : 0, (useDefaultMap && !this_isDefaultMap) ? 1 : 0 ); printf("#define UC_CHARSET_SETUP%s UC_Charset_Setup(\\"%s\",\\\n\"%s\",\\\n\dfont_unicount%s,dfont_unitable%s,%d,\\\n\dfont_replacedesc%s,%d,%d)\n",id_append, this_MIMEcharset, this_LYNXcharset,id_append, id_append, nuni, id_append, lowest_eight, RawOrEnc); exit(EX_OK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -