📄 fini.c
字号:
= cc; } newname->name_uc[i] = newname->name_lc[i] = newname->name_ic[i] = '\0'; /* Warn user if names aren't alphabetically ordered. */ if ((last_buf[0] != '\0') && (strcmp (last_buf, newname->name_uc) >= 0)) { fprintf (stderr, "%s: \"%s\" precedes \"%s\"\n", input_name, last_buf, newname->name_uc); do_exit = TRUE; } strcpy (last_buf, newname->name_uc); /* Append name to end of alpha-sorted list (assumes names entered in alpha order wrt name, not kwname, even though kwname is output from this list). */ n = names_alpha.last; newname->next_alpha = n->next_alpha; newname->previous_alpha = n; n->next_alpha->previous_alpha = newname; n->next_alpha = newname; /* Insert name in appropriate length/name ordered list. */ n = (name) &names[len]; while ((n->next != (name) &names[len]) && (strcmp (buf, n->next->name_uc) > 0)) n = n->next; if (strcmp (buf, n->next->name_uc) == 0) { fprintf (stderr, "%s: extraneous \"%s\"\n", input_name, buf); do_exit = TRUE; } newname->next = n->next; newname->previous = n; n->next->previous = newname; n->next = newname; }#if 0 for (len = 0; len < ARRAY_SIZE (name); ++len) { if (names[len].first == (name) &names[len]) continue; printf ("Length %d:\n", len); for (n = names[len].first; n != (name) &names[len]; n = n->next) printf (" %s %s %s\n", n->name_uc, n->name_lc, n->name_ic); }#endif if (do_exit) exit (1); /* First output the #include file. */ for (n = names_alpha.first; n != (name) &names_alpha; n = n->next_alpha) { fprintf (incl, "#define %sl%s%s %d\n", prefix, n->kwname, postfix, n->namelen); } fprintf (incl, "\\n\enum %s_\n\{\n\%sNone%s,\n\", type, prefix, postfix); for (n = names_alpha.first; n != (name) &names_alpha; n = n->next_alpha) { fprintf (incl, "\%s%s%s,\n\", prefix, n->kwname, postfix); } fprintf (incl, "\%s%s\n\};\n\typedef enum %s_ %s;\n\", prefix, postfix, type, type); /* Now output the C program. */ fprintf (out, "\%s%s\n\%s (ffelexToken t)\n\%c\n\ char *p;\n\ int c;\n\\n\ p = ffelex_token_text (t);\n\\n\", storage, type, routine, '{'); if (do_name) { if (do_names) fprintf (out, "\ if (ffelex_token_type (t) == FFELEX_typeNAME)\n\ {\n\ switch (ffelex_token_length (t))\n\\t{\n\" ); else fprintf (out, "\ assert (ffelex_token_type (t) == FFELEX_typeNAME);\n\\n\ switch (ffelex_token_length (t))\n\ {\n\" );/* Now output the length as a case, followed by the binary search within that length. */ for (len = 0; ((size_t) len) < ARRAY_SIZE (names); ++len) { if (names[len].first != (name) &names[len]) { if (do_names) fprintf (out, "\\tcase %d:\n\", len); else fprintf (out, "\ case %d:\n\", len); testname (FALSE, do_names ? 10 : 6, names[len].first, names[len].last); if (do_names) fprintf (out, "\\t break;\n\" ); else fprintf (out, "\ break;\n\" ); } } if (do_names) fprintf (out, "\\t}\n\ return %sNone%s;\n\ }\n\\n\", prefix, postfix); else fprintf (out, "\ }\n\\n\ return %sNone%s;\n\}\n\", prefix, postfix); } if (do_names) { fputs ("\ assert (ffelex_token_type (t) == FFELEX_typeNAMES);\n\\n\ switch (ffelex_token_length (t))\n\ {\n\ default:\n\", out); /* Find greatest non-empty length list. */ for (len = ARRAY_SIZE (names) - 1; names[len].first == (name) &names[len]; --len) ;/* Now output the length as a case, followed by the binary search within that length. */ if (len > 0) { for (; len != 0; --len) { fprintf (out, "\ case %d:\n\", len); if (names[len].first != (name) &names[len]) testnames (FALSE, 6, len, names[len].first, names[len].last); } if (names[1].first == (name) &names[1]) fprintf (out, "\ ;\n\" ); /* Need empty statement after an empty case 1: */ } fprintf (out, "\ }\n\\n\ return %sNone%s;\n\}\n\", prefix, postfix); } if (out != stdout) fclose (out); if (incl != stdout) fclose (incl); if (in != stdin) fclose (in); exit (0);}voidtestname (bool nested, int indent, name first, name last){ name n; name nhalf; int num; int numhalf; assert (!nested || indent >= 2); assert (((size_t) indent) + 4 < ARRAY_SIZE (xspaces)); num = 0; numhalf = 0; for (n = first, nhalf = first; n != last->next; n = n->next) { if ((++num & 1) == 0) { nhalf = nhalf->next; ++numhalf; } } if (nested) fprintf (out, "\%s{\n\", xspaces[indent - 2]); fprintf (out, "\%sif ((c = ffesrc_strcmp_2c (ffe_case_match (), p, \"%s\", \"%s\", \"%s\")) == 0)\n\%sreturn %s%s%s;\n\", xspaces[indent], nhalf->name_uc, nhalf->name_lc, nhalf->name_ic, xspaces[indent + 2], prefix, nhalf->kwname, postfix); if (num != 1) { fprintf (out, "\%selse if (c < 0)\n\", xspaces[indent]); if (numhalf == 0) fprintf (out, "\%s;\n\", xspaces[indent + 2]); else testname (TRUE, indent + 4, first, nhalf->previous); if (num - numhalf > 1) { fprintf (out, "\%selse\n\", xspaces[indent]); testname (TRUE, indent + 4, nhalf->next, last); } } if (nested) fprintf (out, "\%s}\n\", xspaces[indent - 2]);}voidtestnames (bool nested, int indent, int len, name first, name last){ name n; name nhalf; int num; int numhalf; assert (!nested || indent >= 2); assert (((size_t) indent) + 4 < ARRAY_SIZE (xspaces)); num = 0; numhalf = 0; for (n = first, nhalf = first; n != last->next; n = n->next) { if ((++num & 1) == 0) { nhalf = nhalf->next; ++numhalf; } } if (nested) fprintf (out, "\%s{\n\", xspaces[indent - 2]); fprintf (out, "\%sif ((c = ffesrc_strncmp_2c (ffe_case_match (), p, \"%s\", \"%s\", \"%s\", %d)) == 0)\n\%sreturn %s%s%s;\n\", xspaces[indent], nhalf->name_uc, nhalf->name_lc, nhalf->name_ic, len, xspaces[indent + 2], prefix, nhalf->kwname, postfix); if (num != 1) { fprintf (out, "\%selse if (c < 0)\n\", xspaces[indent]); if (numhalf == 0) fprintf (out, "\%s;\n\", xspaces[indent + 2]); else testnames (TRUE, indent + 4, len, first, nhalf->previous); if (num - numhalf > 1) { fprintf (out, "\%selse\n\", xspaces[indent]); testnames (TRUE, indent + 4, len, nhalf->next, last); } } if (nested) fprintf (out, "\%s}\n\", xspaces[indent - 2]);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -