static char *totitle_func(const struct unicode_info *u, const char *cp, int *ip) { unicode_char *uc=c2u(u, cp, ip); char *s; int dummy; unsigned i; if (!uc) return (NULL); for (i=0; uc[i]; i++) { unicode_char c=unicode_tc(uc[i]); if (revlookup(c)) uc[i]=c; } s=u2c(u, uc, &dummy); free(uc); return (s); }
int main() { FILE *fp=popen("gunzip -cd <Unihan-3.2.0.txt.gz", "r"); char buf[4000]; unicode_char *uc; char *s, *p; int dummyi; if (!fp) return (0); while (fgets(buf, sizeof(buf), fp)) { unsigned a, b, c; int dummy; if (sscanf(buf, "U+%4x kBigFive %4x", &b, &a) != 2) continue; printf("0x%04x 0x%04x: ", a, b); buf[0]= a / 256; buf[1]= a % 256; buf[2]=0; uc=c2u(buf, &dummy); if (!uc) { printf("c2u failure: %d\n", dummy); return (1); } if (uc[0] != b || uc[1]) { printf("c2u failure: got 0x%04x, expected 0x%04x\n", (unsigned)uc[0], (unsigned)b); return (1); } s=u2c(uc, &dummy); if (s == NULL && uc[0] == 0xfffd) { free(uc); printf("Ok\n"); continue; /* Unmapped */ } free(uc); if (!s) { printf("u2c failure: %d\n", dummy); return (1); } c=0; if (!s[0] || !s[1] || s[2] || (c=(int)(unsigned char)s[0] * 256 + (unsigned char)s[1]) != a) { printf("u2c failure: got 0x%04x, expected 0x%04x\n", c, a); return (1); } p=toupper_func(s, NULL); if (!p) { printf("toupper failure\n"); return (1); } if (strcmp(p, s)) printf("toupper "); free(p); p=tolower_func(s, NULL); if (!p) { printf("tolower failure\n"); return (1); } if (strcmp(p, s)) printf("tolower "); free(p); p=totitle_func(s, NULL); if (!p) { printf("totitle failure\n"); return (1); } if (strcmp(p, s)) printf("totitle "); free(p); free(s); printf("ok\n"); } fclose(fp); buf[0]=0x40; buf[1]=0; uc=c2u(buf, NULL); if (!uc) { printf("us-ascii c2u failure\n"); return (1); } s=u2c(uc, NULL); free(uc); if (!s) { printf("us-ascii u2c failure\n"); return (1); } free(s); buf[0]=0xA2; buf[1]=0x40; buf[2]=0; uc=c2u(buf, NULL); if (!uc) { printf("fallback failed\n"); return (1); } printf("fallback: %04x %04x\n", (unsigned)uc[0], (unsigned)uc[1]); s=u2c(uc, NULL); free(uc); if (!s) { printf("fallback-reverse failed\n"); return (1); } printf("fallback: %02x %02x\n", (int)(unsigned char)s[0], (int)(unsigned char)s[1]); free(s); buf[0]=0xA2; buf[1]=0x40; buf[2]=0; uc=c2u(buf, &dummyi); if (uc) { printf("abort failed\n"); return (1); } printf("aborted at index %d\n", dummyi); { static unicode_char testing[]={0x0040, 0x1000, 0}; uc=testing; s=u2c(uc, NULL); if (!s) { printf("abort-fallback failed\n"); return (1); } printf("abort-fallback: %02x %02x\n", (int)(unsigned char)s[0], (int)(unsigned char)s[1]); free(s); uc=testing; } s=u2c(uc, &dummyi); if (s) { printf("abort-abort failed\n"); return (1); } printf("abort-aborted: index %d\n", dummyi); return (0); }
static int get_panel(int oid, data_panel *panel, size_t size) { int ret = (s32b) size; switch(oid) { case 1: { int i = 0; assert( size >= (u32b) boundaries[1].page_rows); ret = boundaries[1].page_rows; P_I(TERM_L_BLUE, "Name", "%y", s2u(op_ptr->full_name), END ); P_I(TERM_L_BLUE, "Sex", "%y", s2u(sp_ptr->title), END ); P_I(TERM_L_BLUE, "Race", "%y", s2u(rp_ptr->name), END ); P_I(TERM_L_BLUE, "Class", "%y", s2u(cp_ptr->name), END ); P_I(TERM_L_BLUE, "Title", "%y", s2u(show_title()), END ); P_I(TERM_L_BLUE, "HP", "%y/%y", i2u(p_ptr->chp), i2u(p_ptr->mhp) ); P_I(TERM_L_BLUE, "SP", "%y/%y", i2u(p_ptr->csp), i2u(p_ptr->msp) ); P_I(TERM_L_BLUE, "Level", "%y", i2u(p_ptr->lev), END ); assert(i == boundaries[1].page_rows); return ret; } case 2: { int i = 0; assert( ret >= boundaries[2].page_rows); ret = boundaries[2].page_rows; P_I(max_color(p_ptr->lev, p_ptr->max_lev), "Level", "%y", i2u(p_ptr->lev), END ); P_I(max_color(p_ptr->exp, p_ptr->max_exp), "Cur Exp", "%y", i2u(p_ptr->exp), END ); P_I(TERM_L_GREEN, "Max Exp", "%y", i2u(p_ptr->max_exp), END ); P_I(TERM_L_GREEN, "Adv Exp", "%y", s2u(show_adv_exp()), END ); P_I(TERM_L_GREEN, "MaxDepth", "%y", s2u(show_depth()), END ); P_I(TERM_L_GREEN, "Game Turns", "%y", i2u(turn), END ); P_I(TERM_L_GREEN, "Standard Turns","%y", i2u(p_ptr->total_energy / 100), END ); P_I(TERM_L_GREEN, "Resting Turns","%y", i2u(p_ptr->resting_turn), END ); P_I(TERM_L_GREEN, "Gold", "%y", i2u(p_ptr->au), END ); assert(i == boundaries[2].page_rows); return ret; } case 3: { int i = 0; assert(ret >= boundaries[3].page_rows); ret = boundaries[3].page_rows; P_I(TERM_L_BLUE, "Armor", "[%y,%+y]", i2u(p_ptr->state.dis_ac), i2u(p_ptr->state.dis_to_a) ); P_I(TERM_L_BLUE, "Fight", "(%+y,%+y)", i2u(p_ptr->state.dis_to_h), i2u(p_ptr->state.dis_to_d) ); P_I(TERM_L_BLUE, "Melee", "%y", s2u(show_melee_weapon(&p_ptr->inventory[INVEN_WIELD])), END ); P_I(TERM_L_BLUE, "Shoot", "%y", s2u(show_missile_weapon(&p_ptr->inventory[INVEN_BOW])), END ); P_I(TERM_L_BLUE, "Blows", "%y.%y/turn", i2u(p_ptr->state.num_blow / 100), i2u((p_ptr->state.num_blow / 10) % 10) ); P_I(TERM_L_BLUE, "Shots", "%y/turn", i2u(p_ptr->state.num_fire), END ); P_I(TERM_L_BLUE, "Infra", "%y ft", i2u(p_ptr->state.see_infra * 10), END ); P_I(TERM_L_BLUE, "Speed", "%y", s2u(show_speed()), END ); P_I(TERM_L_BLUE, "Burden","%.1y lbs", f2u(p_ptr->total_weight/10.0), END ); assert(i == boundaries[3].page_rows); return ret; } case 4: { static struct { const char *name; int skill; int div; } skills[] = { { "Saving Throw", SKILL_SAVE, 6 }, { "Stealth", SKILL_STEALTH, 1 }, { "Fighting", SKILL_TO_HIT_MELEE, 12 }, { "Shooting", SKILL_TO_HIT_BOW, 12 }, { "Disarming", SKILL_DISARM, 8 }, { "Magic Device", SKILL_DEVICE, 6 }, { "Perception", SKILL_SEARCH_FREQUENCY, 6 }, { "Searching", SKILL_SEARCH, 6 } }; int i; assert(N_ELEMENTS(skills) == boundaries[4].page_rows); ret = N_ELEMENTS(skills); if ((u32b) ret > size) ret = size; for (i = 0; i < ret; i++) { s16b skill = p_ptr->state.skills[skills[i].skill]; panel[i].color = TERM_L_BLUE; panel[i].label = skills[i].name; if (skills[i].skill == SKILL_SAVE || skills[i].skill == SKILL_SEARCH) { if (skill < 0) skill = 0; if (skill > 100) skill = 100; panel[i].fmt = "%y%%"; panel[i].value[0] = i2u(skill); panel[i].color = colour_table[skill / 10]; } else if (skills[i].skill == SKILL_DEVICE) { panel[i].fmt = "%y"; panel[i].value[0] = i2u(skill); panel[i].color = colour_table[skill / 13]; } else if (skills[i].skill == SKILL_SEARCH_FREQUENCY) { if (skill <= 0) skill = 1; if (skill >= 50) { panel[i].fmt = "1 in 1"; panel[i].color = colour_table[10]; } else { /* convert to % chance of searching */ skill = 50 - skill; panel[i].fmt = "1 in %y"; panel[i].value[0] = i2u(skill); panel[i].color = colour_table[(100 - skill*2) / 10]; } } else if (skills[i].skill == SKILL_DISARM) { /* assume disarming a dungeon trap */ skill -= 5; if (skill > 100) skill = 100; if (skill < 2) skill = 2; panel[i].fmt = "%y%%"; panel[i].value[0] = i2u(skill); panel[i].color = colour_table[skill / 10]; } else { panel[i].fmt = "%y"; panel[i].value[0] = s2u(likert(skill, skills[i].div, &panel[i].color)); } } return ret; } case 5: { int i = 0; assert(ret >= boundaries[5].page_rows); ret = boundaries[5].page_rows; P_I(TERM_L_BLUE, "Age", "%y", i2u(p_ptr->age), END ); P_I(TERM_L_BLUE, "Height", "%y", i2u(p_ptr->ht), END ); P_I(TERM_L_BLUE, "Weight", "%y", i2u(p_ptr->wt), END ); P_I(TERM_L_BLUE, "Social", "%y", s2u(show_status()), END ); P_I(TERM_L_BLUE, "Maximize", "%y", c2u(OPT(birth_maximize) ? 'Y' : 'N'), END); #if 0 /* Preserve mode deleted */ P_I(TERM_L_BLUE, "Preserve", "%y", c2u(birth_preserve ? 'Y' : 'N'), END); #endif assert(i == boundaries[5].page_rows); return ret; } } /* hopefully not reached */ return 0; }