📄 trans.c
字号:
strcpy(mallocname, "malloc"); if (!*freename) strcpy(freename, "free"); fix_parameters();}void saveoldfile(fname)char *fname;{#if defined(unix) || defined(__unix) || defined(CAN_LINK) (void) unlink(format_s("%s~", fname)); if (link(fname, format_s("%s~", fname)) == 0) (void) unlink(fname);#endif}#ifndef __STDC__# ifdef NO_GETENV# define getenv(x) NULL# elseextern char *getenv PP((char *));# endif#endifStatic long starting_time;Static void openlogfile(){ char *name, *uname; if (*codefname == '<') name = format_ss(logfnfmt, infname, infname); else name = format_ss(logfnfmt, infname, codefname); if (!name) name = format_s("%s.log", codefname); saveoldfile(name); logf = fopen(name, "w"); if (logf) { fprintf(logf, "\nTranslation of %s to %s by p2c %s\n", infname, codefname, P2C_VERSION); fprintf(logf, "Translated"); uname = getenv("USER"); if (uname) fprintf(logf, " by %s", uname); time(&starting_time); fprintf(logf, " on %s", ctime(&starting_time)); fprintf(logf, "\n\n"); } else { perror(name); verbose = 0; }}void closelogfile(){ long ending_time; if (logf) { fprintf(logf, "\n\n");#if defined(unix) || defined(__unix) fprintf(logf, "Total memory used: %ld bytes.\n", (long)sbrk(0));#endif time(&ending_time); fprintf(logf, "Processed %d source lines in %ld:%ld seconds.\n", inf_ltotal, (ending_time - starting_time) / 60, (ending_time - starting_time) % 60); fprintf(logf, "\n\nTranslation completed on %s", ctime(&ending_time)); fclose(logf); }}void showinitfile(){ FILE *f; int ch; char *name; name = format_s("%H/%s", "p2crc"); printf("# Copy of file %%H/p2crc => %s:\n\n", name); f = fopen(name, "r"); if (!f) { perror(name); exit_failure(); } while ((ch = getc(f)) != EOF) putchar(ch); fclose(f);}void usage(){ fprintf(stderr, "usage: p2c [options] file [modulename] [-h file.h] [-o file.c]\n"); exit_failure();}struct bitfieldtest { int f1 : 2;};int main(argc, argv)int argc;char **argv;{ int numsearch; char *searchlist[50]; char infnbuf[200], codefnbuf[200], hdrfnbuf[200], *cp; Symbol *sp; Strlist *sl; int i, nobuffer = 0, savequiet; i = 0; while (i < argc && strcmp(argv[i], "-H")) i++; if (i < argc-1) p2c_home = argv[i+1]; else { cp = getenv("P2C_HOME"); if (cp) p2c_home = cp; } init_stuff(); i = 0; while (i < argc && strcmp(argv[i], "-i")) i++; if (i < argc) { showinitfile(); return EXIT_SUCCESS; } initrc(); setup_dir(); infname = infnbuf; *infname = 0; i = 0; while (i < argc && argv[i][0] == '-') i++; if (i >= argc) strcpy(infname, argv[i]); i = 0; while (i < argc && strcmp(argv[i], "-v")) i++; if (i >= argc) { cp = getenv("P2CRC"); if (cp) readrc(cp, 1); else readrc(format_s("%H/%s", "p2crc"), 1); } i = 0; while (i < argc && strcmp(argv[i], "-c")) i++; if (i < argc-1) { if (strcmp(argv[i+1], "-")) readrc(argv[i+1], 1); } else if (!readrc("p2crc", 0)) readrc(".p2crc", 0); if (!*codefnfmt) { fprintf(stderr, "Unable to find required system p2crc file\n"); exit_failure(); } codefname = codefnbuf; *codefname = 0; hdrfname = hdrfnbuf; *hdrfname = 0; requested_module = NULL; found_module = 0; error_crash = 0;#ifdef CONSERVE_MEMORY conserve_mem = CONSERVE_MEMORY;#else conserve_mem = 1;#endif regression = 0; verbose = 0; partialdump = 1; numsearch = 0; argc--, argv++; while (argc > 0) { if (**argv == '-' && (*argv)[1]) { if (!strcmp(*argv, "-a")) { ansiC = 1; } else if (argv[0][1] == 'L') { if (strlen(*argv) == 2 && argc > 1) { strcpy(language, ++*argv); --argc; } else strcpy(language, *argv + 2); upc(language); } else if (!strcmp(*argv, "-q")) { quietmode = 1; } else if (!strcmp(*argv, "-comp")) { /* Set defaults for compiler-like usage */ maxalts = 100; elimdeadcode = 0; analyzeflow = 0; foldconsts = 1; foldstrconsts = 1; offsetforloops = 0; keepnulls = 1; hasstaticlinks = 1; mod_po2 = 0; div_po2 = 0; assumebits = 0; assumesigns = 0; formatstrings = 1; structfilesflag = 1; fullstrwrite = 1; } else if (!strcmp(*argv, "-local")) { /* Assume target machine is same that which compiled p2c */ unsigned int ui; unsigned long ul; unsigned short us; unsigned char uc; int i; char ch; struct bitfieldtest bft;#ifdef __STDC__ ansiC = 1;#endif ch = (char)0xffff; signedchars = (ch < 0); bft.f1 = 0xffff; signedfield = (bft.f1 < 0); i = -1; i >>= 1; signedshift = (i < 0); uc = -1; sizeof_char = 0; while (uc) uc >>= 1, sizeof_char++; us = -1; sizeof_short = 0; while (us) us >>= 1, sizeof_short++; ui = -1; sizeof_int = 0; while (ui) ui >>= 1, sizeof_int++; ul = -1; sizeof_long = 0; while (ul) ul >>= 1, sizeof_long++; } else if (!strcmp(*argv, "-check")) { /* Enable all error checking */ casecheck = 1; arraycheck = 1; nilcheck = 1; malloccheck = 1; checkfileisopen = 1; checkreadformat = 1; checkfileeof = 1; checkstdineof = 1; checkfileseek = 1; } else if (!strcmp(*argv, "-o")) { if (*codefname || --argc <= 0) usage(); strcpy(codefname, *++argv); } else if (!strcmp(*argv, "-h")) { if (*hdrfname || --argc <= 0) usage(); strcpy(hdrfname, *++argv); } else if (!strcmp(*argv, "-s")) { if (--argc <= 0) usage(); cp = *++argv; if (!strcmp(cp, "-")) librfiles = NULL; else searchlist[numsearch++] = cp; } else if (!strcmp(*argv, "-c")) { if (--argc <= 0) usage(); argv++; /* already done above */ } else if (!strcmp(*argv, "-v")) { /* already done above */ } else if (!strcmp(*argv, "-H")) { argc--, argv++; /* already done above */ } else if (argv[0][1] == 'I') { if (strlen(*argv) == 2 && argc > 1) { strlist_append(&importdirs, ++*argv); --argc; } else strlist_append(&importdirs, *argv + 2); } else if (argv[0][1] == 'p') { if (strlen(*argv) == 2) showprogress = 25; else showprogress = atoi(*argv + 2); nobuffer = 1; } else if (!strcmp(*argv, "-e")) { copysource++; } else if (!strcmp(*argv, "-t")) { tokentrace++; } else if (!strcmp(*argv, "-x")) { error_crash++; } else if (argv[0][1] == 'E') { if (strlen(*argv) == 2) maxerrors = 0; else maxerrors = atoi(*argv + 2); } else if (!strcmp(*argv, "-F")) { partialdump = 0; } else if (argv[0][1] == 'd') { nobuffer = 1; if (strlen(*argv) == 2) debug = 1; else debug = atoi(*argv + 2); } else if (argv[0][1] == 'B') { if (strlen(*argv) == 2) i = 1; else i = atoi(*argv + 2); if (argc == 2 && strlen(argv[1]) > 2 && !strcmp(argv[1] + strlen(argv[1]) - 2, ".c")) { testlinebreaker(i, argv[1]); return EXIT_SUCCESS; } else testlinebreaker(i, NULL); } else if (argv[0][1] == 'C') { if (strlen(*argv) == 2) cmtdebug = 1; else cmtdebug = atoi(*argv + 2); } else if (argv[0][1] == 'F') { if (strlen(*argv) == 2) flowdebug = 1; else flowdebug = atoi(*argv + 2); } else if (!strcmp(*argv, "-R")) { regression = 1; } else if (argv[0][1] == 'V') { if (strlen(*argv) == 2) verbose = 1; else verbose = atoi(*argv + 2); } else if (argv[0][1] == 'M') { if (strlen(*argv) == 2) conserve_mem = 1; else conserve_mem = atoi(*argv + 2); } else usage(); } else if (!*infname) { strcpy(infname, *argv); } else if (!requested_module) { requested_module = stralloc(*argv); } else usage(); argc--, argv++; } if (requested_module && !*codefname) strcpy(codefname, format_ss(modulefnfmt, infname, requested_module)); if (*infname && strcmp(infname, "-")) { if (strlen(infname) > 2 && !strcmp(infname + strlen(infname) - 2, ".c")) { fprintf(stderr, "What is wrong with this picture?\n"); exit_failure(); } inf = fopen(infname, "r"); if (!inf) { perror(infname); exit_failure(); } if (!*codefname) strcpy(codefname, format_s(codefnfmt, infname)); } else { strcpy(infname, "<stdin>"); inf = stdin; if (!*codefname) strcpy(codefname, "-"); } if (strcmp(codefname, "-")) { saveoldfile(codefname); codef = fopen(codefname, "w"); if (!codef) { perror(codefname); exit_failure(); } i = (slashslash > 0 || (slashslash < 0 && cplus > 0)); fprintf(codef, i ? "// " : "/* "); fprintf(codef, "Output from p2c %s, the Pascal-to-C translator", P2C_VERSION); fprintf(codef, i ? "\n" : " */\n"); } else { strcpy(codefname, "<stdout>"); codef = stdout; } if (nobuffer) setbuf(codef, NULL); /* for debugging */ outf = codef; outf_lnum = 1; logf = NULL; if (verbose) openlogfile(); setup_complete = 0; init_lex(); leadingcomments(); postrc(); setup_comment(); /* must call this first */ setup_lex(); /* must call this second */ setup_out(); setup_decl(); /* must call *after* setup_lex() */ setup_parse(); setup_funcs(); for (sl = tweaksymbols; sl; sl = sl->next) { cp = sl->s; if (*cp == '*') { cp++; if (!pascalcasesens) upc(cp); } sp = findsymbol(cp); if (sl->value & FUNCBREAK) sp->flags &= ~FUNCBREAK; sp->flags |= sl->value; } strlist_empty(&tweaksymbols); for (sl = synonyms; sl; sl = sl->next) { if (!pascalcasesens) upc(sl->s); sp = findsymbol(sl->s); sp->flags |= SSYNONYM; if (sl->value) { if (!pascalcasesens) upc((char *)sl->value); strlist_append(&sp->symbolnames, "===")->value = (long)findsymbol((char *)sl->value); } else strlist_append(&sp->symbolnames, "===")->value = 0; } strlist_empty(&synonyms); for (sl = addmacros; sl; sl = sl->next) { defmacro(sl->s, sl->value, "<macro>", 0); } strlist_empty(&addmacros); handle_nameof(); setup_complete = 1; savequiet = quietmode; quietmode = 1; for (sl = librfiles; sl; sl = sl->next) { if (strlist_find(librfiles, sl->s) == sl) (void)p_search(format_none(sl->s), "pas", 0); } for (i = 0; i < numsearch; i++) (void)p_search(format_none(searchlist[i]), "pas", 1); quietmode = savequiet; p_program(); end_source(); flushcomments(NULL, -1, -1); showendnotes(); check_unused_macros(); if (!quietmode) printf("\n"); if (!showprogress && !quietmode) fprintf(stderr, "\n"); output("\n"); if (requested_module && !found_module) error(format_s("Module \"%s\" not found in file", requested_module)); if (codef != stdout) { if (slashslash) output("\n\n// End.\n"); else output("\n\n/* End. */\n"); } if (inf != stdin) fclose(inf); if (codef != stdout) fclose(codef); closelogfile(); mem_summary(); if (!quietmode) fprintf(stderr, "Translation completed.\n"); return EXIT_SUCCESS;}void exit_failure(){ exit(EXIT_FAILURE);}int outmem(){ fprintf(stderr, "p2c: Out of memory!\n"); exit(EXIT_FAILURE);}#if !defined(NO_ISBOGUS) && (defined(mc68000) || defined(m68k) || defined(vax))int ISBOGUS(p)char *p;{ unsigned long ip = (unsigned long)p; if (ip < 0) { if (ip < (unsigned long)&ip) return 1; /* below the start of the stack */ } else if (ip >= 512) { if (ip > (unsigned long)sbrk(0)) return 1; /* past the end of memory */ } else return 1; return 0;}#else#define ISBOGUS(p) 0#endifchar *meaningkindname(kind)enum meaningkind kind;{#ifdef HASDUMPS if ((unsigned int)kind < (unsigned int)MK_LAST) return meaningkindnames[(int) kind]; else#endif /*HASDUMPS*/ return format_d("<meaning %d>", (int) kind);}char *typekindname(kind)enum typekind kind;{#ifdef HASDUMPS if ((unsigned int)kind < (unsigned int)TK_LAST) return typekindnames[(int) kind]; else#endif /*HASDUMPS*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -