📄 yacc.y
字号:
*/ if (flag) { for (i = list->min; i <= list->max; ++i) r->types[i - r->min] |= flag; } free(list); return; } if (list->min <= r->min && list->max >= r->max) { /* * Superset case. Make him big enough to hold us. * We might need to merge with the guy after him. */ if (flag) { list->types = xlalloc(list->max - list->min + 1); for (i = list->min; i <= list->max; ++i) list->types[i - list->min] = flag; for (i = r->min; i <= r->max; ++i) list->types[i - list->min] |= r->types[i - r->min]; free(r->types); r->types = list->types; } else { r->map = list->map; } r->min = list->min; r->max = list->max; free(list); } else if (list->min < r->min) { /* * Our tail intersects his head. */ if (flag) { list->types = xlalloc(r->max - list->min + 1); for (i = r->min; i <= r->max; ++i) list->types[i - list->min] = r->types[i - r->min]; for (i = list->min; i < r->min; ++i) list->types[i - list->min] = flag; for (i = r->min; i <= list->max; ++i) list->types[i - list->min] |= flag; free(r->types); r->types = list->types; } else { r->map = list->map; } r->min = list->min; free(list); return; } else { /* * Our head intersects his tail. * We might need to merge with the guy after him. */ if (flag) { r->types = xrelalloc(r->types, list->max - r->min + 1); for (i = list->min; i <= r->max; ++i) r->types[i - r->min] |= flag; for (i = r->max+1; i <= list->max; ++i) r->types[i - r->min] = flag; } r->max = r->max; free(list); } /* * Okay, check to see if we grew into the next guy(s) */ while ((lr = r->next) && r->max >= lr->min) { if (flag) { if (r->max >= lr->max) { /* * Good, we consumed all of him. */ for (i = lr->min; i <= lr->max; ++i) r->types[i - r->min] |= lr->types[i - lr->min]; } else { /* * "append" him on to the end of us. */ r->types = xrelalloc(r->types, lr->max - r->min + 1); for (i = lr->min; i <= r->max; ++i) r->types[i - r->min] |= lr->types[i - lr->min]; for (i = r->max+1; i <= lr->max; ++i) r->types[i - r->min] = lr->types[i - lr->min]; r->max = lr->max; } } else { if (lr->max > r->max) r->max = lr->max; } r->next = lr->next; if (flag) free(lr->types); free(lr); }}voiddump_tables(){ int x; rune_list *list; /* * See if we can compress some of the istype arrays */ for(list = types.root; list; list = list->next) { list->map = list->types[0]; for (x = 1; x < list->max - list->min + 1; ++x) { if (list->types[x] != list->map) { list->map = 0; break; } } } new_locale.invalid_rune = htonl(new_locale.invalid_rune); /* * Fill in our tables. Do this in network order so that * diverse machines have a chance of sharing data. * (Machines like Crays cannot share with little machines due to * word size. Sigh. We tried.) */ for (x = 0; x < _CACHED_RUNES; ++x) { new_locale.runetype[x] = htonl(types.map[x]); new_locale.maplower[x] = htonl(maplower.map[x]); new_locale.mapupper[x] = htonl(mapupper.map[x]); } /* * Count up how many ranges we will need for each of the extents. */ list = types.root; while (list) { new_locale.runetype_ext.nranges++; list = list->next; } new_locale.runetype_ext.nranges = htonl(new_locale.runetype_ext.nranges); list = maplower.root; while (list) { new_locale.maplower_ext.nranges++; list = list->next; } new_locale.maplower_ext.nranges = htonl(new_locale.maplower_ext.nranges); list = mapupper.root; while (list) { new_locale.mapupper_ext.nranges++; list = list->next; } new_locale.mapupper_ext.nranges = htonl(new_locale.mapupper_ext.nranges); new_locale.variable_len = htonl(new_locale.variable_len); /* * Okay, we are now ready to write the new locale file. */ /* * PART 1: The _RuneLocale structure */ if (fwrite((char *)&new_locale, sizeof(new_locale), 1, fp) != 1) { perror(locale_file); exit(1); } /* * PART 2: The runetype_ext structures (not the actual tables) */ list = types.root; while (list) { _RuneEntry re; re.min = htonl(list->min); re.max = htonl(list->max); re.map = htonl(list->map); if (fwrite((char *)&re, sizeof(re), 1, fp) != 1) { perror(locale_file); exit(1); } list = list->next; } /* * PART 3: The maplower_ext structures */ list = maplower.root; while (list) { _RuneEntry re; re.min = htonl(list->min); re.max = htonl(list->max); re.map = htonl(list->map); if (fwrite((char *)&re, sizeof(re), 1, fp) != 1) { perror(locale_file); exit(1); } list = list->next; } /* * PART 4: The mapupper_ext structures */ list = mapupper.root; while (list) { _RuneEntry re; re.min = htonl(list->min); re.max = htonl(list->max); re.map = htonl(list->map); if (fwrite((char *)&re, sizeof(re), 1, fp) != 1) { perror(locale_file); exit(1); } list = list->next; } /* * PART 5: The runetype_ext tables */ list = types.root; while (list) { for (x = 0; x < list->max - list->min + 1; ++x) list->types[x] = htonl(list->types[x]); if (!list->map) { if (fwrite((char *)&list->types, (list->max - list->min + 1)*sizeof(u_long), 1, fp) != 1) { perror(locale_file); exit(1); } } list = list->next; } /* * PART 5: And finally the variable data */ if (fwrite((char *)new_locale.variable, ntohl(new_locale.variable_len), 1, fp) != 1) { perror(locale_file); exit(1); } fclose(fp); if (!debug) return; if (new_locale.encoding[0]) fprintf(stderr, "ENCODING %s\n", new_locale.encoding); if (new_locale.variable) fprintf(stderr, "VARIABLE %s\n", new_locale.variable); fprintf(stderr, "\nMAPLOWER:\n\n"); for (x = 0; x < _CACHED_RUNES; ++x) { if (isprint(maplower.map[x])) fprintf(stderr, " '%c'", maplower.map[x]); else if (maplower.map[x]) fprintf(stderr, "%04x", maplower.map[x]); else fprintf(stderr, "%4x", 0); if ((x & 0xf) == 0xf) fprintf(stderr, "\n"); else fprintf(stderr, " "); } fprintf(stderr, "\n"); for (list = maplower.root; list; list = list->next) fprintf(stderr, "\t%04x - %04x : %04x\n", list->min, list->max, list->map); fprintf(stderr, "\nMAPUPPER:\n\n"); for (x = 0; x < _CACHED_RUNES; ++x) { if (isprint(mapupper.map[x])) fprintf(stderr, " '%c'", mapupper.map[x]); else if (mapupper.map[x]) fprintf(stderr, "%04x", mapupper.map[x]); else fprintf(stderr, "%4x", 0); if ((x & 0xf) == 0xf) fprintf(stderr, "\n"); else fprintf(stderr, " "); } fprintf(stderr, "\n"); for (list = mapupper.root; list; list = list->next) fprintf(stderr, "\t%04x - %04x : %04x\n", list->min, list->max, list->map); fprintf(stderr, "\nTYPES:\n\n"); for (x = 0; x < _CACHED_RUNES; ++x) { u_long r = types.map[x]; if (r) { if (isprint(x)) fprintf(stderr, " '%c': %2d", x, r & 0xff); else fprintf(stderr, "%04x: %2d", x, r & 0xff); fprintf(stderr, " %4s", (r & _A) ? "alph" : ""); fprintf(stderr, " %4s", (r & _C) ? "ctrl" : ""); fprintf(stderr, " %4s", (r & _D) ? "dig" : ""); fprintf(stderr, " %4s", (r & _G) ? "graf" : ""); fprintf(stderr, " %4s", (r & _L) ? "low" : ""); fprintf(stderr, " %4s", (r & _P) ? "punc" : ""); fprintf(stderr, " %4s", (r & _S) ? "spac" : ""); fprintf(stderr, " %4s", (r & _U) ? "upp" : ""); fprintf(stderr, " %4s", (r & _X) ? "xdig" : ""); fprintf(stderr, " %4s", (r & _B) ? "blnk" : ""); fprintf(stderr, " %4s", (r & _R) ? "prnt" : ""); fprintf(stderr, " %4s", (r & _I) ? "ideo" : ""); fprintf(stderr, " %4s", (r & _T) ? "spec" : ""); fprintf(stderr, " %4s", (r & _Q) ? "phon" : ""); fprintf(stderr, "\n"); } } for (list = types.root; list; list = list->next) { if (list->map && list->min + 3 < list->max) { u_long r = list->map; fprintf(stderr, "%04x: %2d", list->min, r & 0xff); fprintf(stderr, " %4s", (r & _A) ? "alph" : ""); fprintf(stderr, " %4s", (r & _C) ? "ctrl" : ""); fprintf(stderr, " %4s", (r & _D) ? "dig" : ""); fprintf(stderr, " %4s", (r & _G) ? "graf" : ""); fprintf(stderr, " %4s", (r & _L) ? "low" : ""); fprintf(stderr, " %4s", (r & _P) ? "punc" : ""); fprintf(stderr, " %4s", (r & _S) ? "spac" : ""); fprintf(stderr, " %4s", (r & _U) ? "upp" : ""); fprintf(stderr, " %4s", (r & _X) ? "xdig" : ""); fprintf(stderr, " %4s", (r & _B) ? "blnk" : ""); fprintf(stderr, " %4s", (r & _R) ? "prnt" : ""); fprintf(stderr, " %4s", (r & _I) ? "ideo" : ""); fprintf(stderr, " %4s", (r & _T) ? "spec" : ""); fprintf(stderr, " %4s", (r & _Q) ? "phon" : ""); fprintf(stderr, "\n...\n"); fprintf(stderr, "%04x: %2d", list->max, r & 0xff); fprintf(stderr, " %4s", (r & _A) ? "alph" : ""); fprintf(stderr, " %4s", (r & _C) ? "ctrl" : ""); fprintf(stderr, " %4s", (r & _D) ? "dig" : ""); fprintf(stderr, " %4s", (r & _G) ? "graf" : ""); fprintf(stderr, " %4s", (r & _L) ? "low" : ""); fprintf(stderr, " %4s", (r & _P) ? "punc" : ""); fprintf(stderr, " %4s", (r & _S) ? "spac" : ""); fprintf(stderr, " %4s", (r & _U) ? "upp" : ""); fprintf(stderr, " %4s", (r & _X) ? "xdig" : ""); fprintf(stderr, " %4s", (r & _B) ? "blnk" : ""); fprintf(stderr, " %4s", (r & _R) ? "prnt" : ""); fprintf(stderr, " %4s", (r & _I) ? "ideo" : ""); fprintf(stderr, " %4s", (r & _T) ? "spec" : ""); fprintf(stderr, " %4s", (r & _Q) ? "phon" : ""); fprintf(stderr, "\n"); } else for (x = list->min; x <= list->max; ++x) { u_long r = ntohl(list->types[x - list->min]); if (r) { fprintf(stderr, "%04x: %2d", x, r & 0xff); fprintf(stderr, " %4s", (r & _A) ? "alph" : ""); fprintf(stderr, " %4s", (r & _C) ? "ctrl" : ""); fprintf(stderr, " %4s", (r & _D) ? "dig" : ""); fprintf(stderr, " %4s", (r & _G) ? "graf" : ""); fprintf(stderr, " %4s", (r & _L) ? "low" : ""); fprintf(stderr, " %4s", (r & _P) ? "punc" : ""); fprintf(stderr, " %4s", (r & _S) ? "spac" : ""); fprintf(stderr, " %4s", (r & _U) ? "upp" : ""); fprintf(stderr, " %4s", (r & _X) ? "xdig" : ""); fprintf(stderr, " %4s", (r & _B) ? "blnk" : ""); fprintf(stderr, " %4s", (r & _R) ? "prnt" : ""); fprintf(stderr, " %4s", (r & _I) ? "ideo" : ""); fprintf(stderr, " %4s", (r & _T) ? "spec" : ""); fprintf(stderr, " %4s", (r & _Q) ? "phon" : ""); fprintf(stderr, "\n"); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -