/* Find the building type for a given localized name (as seen by the user). Useful for parsing * orders. The inverse of locale_string(lang, btype->_name), sort of. */ const building_type *findbuildingtype(const char *name, const struct locale *lang) { variant type; local_names *bn = bnames; while (bn) { if (bn->lang == lang) break; bn = bn->next; } if (!bn) { quicklist *ql = buildingtypes; int qi; bn = (local_names *)calloc(sizeof(local_names), 1); bn->next = bnames; bn->lang = lang; for (qi = 0, ql = buildingtypes; ql; ql_advance(&ql, &qi, 1)) { building_type *btype = (building_type *)ql_get(ql, qi); const char *n = LOC(lang, btype->_name); type.v = (void *)btype; addtoken(&bn->names, n, type); } bnames = bn; } if (findtoken(bn->names, name, &type) == E_TOK_NOMATCH) return NULL; return (const building_type *)type.v; }
const ship_type *findshiptype(const char *name, const struct locale *lang) { local_names *sn = snames; variant var; while (sn && sn->lang != lang) { sn = sn->next; } if (!sn) { selist *ql; int qi; sn = (local_names *)calloc(1, sizeof(local_names)); if (!sn) abort(); sn->next = snames; sn->lang = lang; for (qi = 0, ql = shiptypes; ql; selist_advance(&ql, &qi, 1)) { ship_type *stype = (ship_type *)selist_get(ql, qi); variant var2; const char *n = LOC(lang, stype->_name); var2.v = (void *)stype; addtoken((struct tnode **)&sn->names, n, var2); } snames = sn; } if (findtoken(sn->names, name, &var) == E_TOK_NOMATCH) return NULL; return (const ship_type *)var.v; }
const ship_type *findshiptype(const char *name, const struct locale *lang) { local_names *sn = snames; variant var; while (sn) { if (sn->lang == lang) break; sn = sn->next; } if (!sn) { quicklist *ql; int qi; sn = (local_names *)calloc(sizeof(local_names), 1); sn->next = snames; sn->lang = lang; for (qi = 0, ql = shiptypes; ql; ql_advance(&ql, &qi, 1)) { ship_type *stype = (ship_type *)ql_get(ql, qi); variant var2; const char *n = LOC(lang, stype->_name); var2.v = (void *)stype; addtoken(&sn->names, n, var2); } snames = sn; } if (findtoken(sn->names, name, &var) == E_TOK_NOMATCH) return NULL; return (const ship_type *)var.v; }
/** ** GM: TERRAFORM <x> <y> <terrain> ** requires: permission-key "gmterf" **/ static void gm_terraform(const void *tnext, struct unit *u, struct order *ord) { const struct plane *p = rplane(u->region); int x = rel_to_abs(p, u->faction, getint(), 0); int y = rel_to_abs(p, u->faction, getint(), 1); const char *c = getstrtoken(); variant token; void **tokens = get_translations(u->faction->locale, UT_TERRAINS); region *r; pnormalize(&x, &y, p); r = findregion(x, y); if (r == NULL || p != rplane(r)) { mistake(u, ord, "region is in another plane."); return; } else { /* checking permissions */ attrib *permissions = a_find(u->faction->attribs, &at_permissions); if (!permissions || !has_permission(permissions, atoi36("gmterf"))) return; } if (findtoken(*tokens, c, &token) != E_TOK_NOMATCH) { const terrain_type *terrain = (const terrain_type *)token.v; terraform_region(r, terrain); } }
INT32 GisLexAwkt::FindKeyWord(wchar_t* word, GisKeyWord* aKeyWords, INT32 cCount) { INT32 ii; if ((ii = findtoken(word, aKeyWords, cCount)) >= 0) return aKeyWords[ii].token; return GisToken_Undefined; }
magic_t getmagicskill(const struct locale * lang) { void **tokens = get_translations(lang, UT_MAGIC); variant token; const char *s = getstrtoken(); if (tokens && s && s[0]) { if (findtoken(*tokens, s, &token) == E_TOK_SUCCESS) { return (magic_t)token.i; } else { char buffer[8]; buffer[0] = s[0]; buffer[1] = s[1]; buffer[2] = '\0'; if (findtoken(*tokens, buffer, &token) == E_TOK_SUCCESS) { return (magic_t)token.i; } } } return M_NONE; }
int main(int argc, char *argv[]) { char line[INBUFSIZE]; const char *fname = "stdin"; char *ptr, *tok; char defs[INBUFSIZE]; char stmt[INBUFSIZE]; FILE *fp = stdin; int lineno = 0; int inprocess = 0; int token, state; int errs = 0; if ((pname = strrchr(argv[0], '/')) == NULL) pname = argv[0]; else pname++; if (argc > 2) { (void) fprintf(stderr, "Usage: %s [<filename>]\n", pname); return 1; } if (argc == 2) if ((fp = fopen(fname = argv[1], "r")) == NULL) { (void) fprintf(stderr, "%s: Cannot open `%s'\n", pname, fname); return 1; } state = S_DISCARD; while ((ptr = fgets(line, sizeof(line), fp)) != NULL) { lineno++; switch (token = findtoken(gettoken(&ptr, defs))) { case T_NEWCODE: state = S_CODE; break; case T_ENDCODE: state = S_DISCARD; break; case T_COMMENT: state = S_COMMENT; break; case T_NEWDEF: state = S_KEYWORD; break; case T_ENDDEF: state = S_DISCARD; break; case T_VENDOR: state = S_KEYWORD; break; case T_HOSTTYPE: state = S_KEYWORD; break; case T_MACHTYPE: state = S_KEYWORD; break; case T_OSTYPE: state = S_KEYWORD; break; case T_MACRO: if (gettoken(&ptr, defs) == NULL) { (void) fprintf(stderr, "%s: \"%s\", %d: Missing macro name\n", pname, fname, lineno); break; } if (gettoken(&ptr, stmt) == NULL) { (void) fprintf(stderr, "%s: \"%s\", %d: Missing macro body\n", pname, fname, lineno); break; } (void) fprintf(stdout, "\n#if %s\n# define %s\n#endif\n\n", stmt, defs); break; case T_NONE: if (state != S_CODE && *defs != '\0') { (void) fprintf(stderr, "%s: \"%s\", %d: Discarded\n", pname, fname, lineno); if (++errs == 30) { (void) fprintf(stderr, "%s: Too many errors\n", pname); return 1; } break; } (void) fprintf(stdout, "%s", line); break; default: (void) fprintf(stderr, "%s: \"%s\", %d: Unexpected token\n", pname, fname, lineno); return 1; } switch (state) { case S_DISCARD: if (inprocess) { inprocess = 0; (void) fprintf(stdout, "#endif\n"); } break; case S_KEYWORD: tok = gettoken(&ptr, defs); if (token == T_NEWDEF) { if (inprocess) { (void) fprintf(stderr, "%s: \"%s\", %d: Missing enddef\n", pname, fname, lineno); return 1; } if (tok == NULL) { (void) fprintf(stderr, "%s: \"%s\", %d: No defs\n", pname, fname, lineno); return 1; } (void) fprintf(stdout, "\n\n"); #ifdef LINEDIRECTIVE (void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname); #endif /* LINEDIRECTIVE */ (void) fprintf(stdout, "#if %s\n", defs); inprocess = 1; } else { if (tok && *tok) (void) fprintf(stdout, "# if (%s) && !defined(_%s_)\n", explode(defs), keyword[token]); else (void) fprintf(stdout, "# if !defined(_%s_)\n", keyword[token]); if (gettoken(&ptr, stmt) == NULL) { (void) fprintf(stderr, "%s: \"%s\", %d: No statement\n", pname, fname, lineno); return 1; } (void) fprintf(stdout, "# define _%s_\n", keyword[token]); (void) fprintf(stdout, " %s = %s;\n", keyword[token], stmt); (void) fprintf(stdout, "# endif\n"); } break; case S_COMMENT: if (gettoken(&ptr, defs)) (void) fprintf(stdout, " /* %s */\n", defs); break; case S_CODE: if (token == T_NEWCODE) { #ifdef LINEDIRECTIVE (void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname); #endif /* LINEDIRECTIVE */ } break; default: (void) fprintf(stderr, "%s: \"%s\", %d: Unexpected state\n", pname, fname, lineno); return 1; } } if (inprocess) { (void) fprintf(stderr, "%s: \"%s\", %d: Missing enddef\n", pname, fname, lineno); return 1; } if (fp != stdin) (void) fclose(fp); return 0; }