⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trans.c

📁 把pascal程序转成C语言程序 把pascal程序转成C语言程序
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -