makeproto.c

来自「把pascal程序转成C语言程序 把pascal程序转成C语言程序」· C语言 代码 · 共 512 行 · 第 1/2 页

C
512
字号
/* "makeproto"  Copyright 1989, 1990, 1991, 1992, 1993 Free Software Foundation *//* Program to scan old-style source files and make prototypes */#include <stdio.h>#include <ctype.h>#include <time.h>#ifdef M_XENIX# define BSD 0#endif#ifdef FILE       /* a #define in BSD, a typedef in SYSV (hp-ux, at least) */# ifndef BSD#  define BSD 1# endif#endif#ifdef BSD# if !BSD#  undef BSD# endif#endif#ifdef BSD# include <strings.h>#else# include <string.h>#endif#define isidchar(x)    (isalnum(x) || (x) == '_')#define dprintf        if (!debug) ; else printf#define MAXARGS        16int verbose, debug, incomment;struct warnstruct {    char *bad, *good;} warntypes[] = {    { "char",             "int" },    { "signed char",      "int" },    { "unsigned char",    "int" },    { "short",            "int" },    { "signed short",     "int" },    { "unsigned short",   "int" },    { "boolean",          "int" },    { "Boolean",          "int" },    { "float",            "double" },    { NULL, NULL }} ;int readline(buf, inf)char *buf;FILE *inf;{    char *cp, *cp2;    int spflag;    for (;;) {        if (fgets(buf, 1000, inf)) {            cp = buf;            cp2 = buf;            spflag = 0;            while (*cp) {                if (incomment) {                    if (cp[0] == '*' && cp[1] == '/') {                        incomment = 0;                        cp += 2;                    } else                        cp++;                    spflag = 1;                } else {                    if (cp[0] == '/' && cp[1] == '*') {                        incomment = 1;                        cp += 2;                    } else if (isspace(*cp)) {                        spflag = 1;                        cp++;                    } else {                        if (spflag)                            *cp2++ = ' ';                        *cp2++ = *cp++;                        spflag = 0;                    }                }            }            *cp2 = 0;            if (!*buf)                continue;            if (verbose)                printf("\217%s\210\n", buf);            return 1;        } else            strcpy(buf, "\001");            return 0;    }}int strbeginsword(s1, s2)register char *s1, *s2;{    while (*s2 && *s1 == *s2)        s1++, s2++;    return (!*s2 && !isidchar(*s1));}void usage(){    fprintf(stderr, "usage:  makeproto [options] [infile ...] [-o outfile]]\n");    fprintf(stderr, "           -tnnn   Tab to nnn after type name [default 15]\n");    fprintf(stderr, "           -annn   Tab to nnn before arguments [default 30]\n");    fprintf(stderr, "           -s0     Omit functions declared static\n");    fprintf(stderr, "           -s1     Omit functions not declared static\n");    fprintf(stderr, "           -x      Add \"extern\" keyword (-X => \"Extern\")\n");    fprintf(stderr, "           -n      Include argument names in prototypes\n");    fprintf(stderr, "           -m      Use PP/PV macro notation\n");    exit(1);}#define bounce(msg)   do {  if (verbose) printf("Bounced: %s\n", msg); if (stupid) goto Lbounce;  } while (0)int main(argc, argv)int argc;char **argv;{    FILE *inf, *outf;    char outfname[256];    char buf[1000], ifdefname[256];    char ftype[256], fname[80], dtype[256], decl[256], dname[80], temp[256];    char argdecls[MAXARGS][256], argnames[MAXARGS][80];    char *cp, *cp2, *cp3;    int i, j, pos, len, thistab, numstars, whichf, nargs, incomment, errors = 0;    long li;    int typetab = 15, argtab = 30, width = 80, usenames = 0, usemacros = 0;    int useextern = 0, staticness = -1, hasheader = 0, useifdefs = 0;    int stupid = 1, firstdecl;    errors = 0;    verbose = 0;    debug = 0;    *outfname = 0;    while (argc > 1 && argv[1][0] == '-') {        if (argv[1][1] == 't') {            typetab = atoi(argv[1] + 2);        } else if (argv[1][1] == 'a') {            argtab = atoi(argv[1] + 2);        } else if (argv[1][1] == 'w') {            width = atoi(argv[1] + 2);        } else if (argv[1][1] == 's') {            staticness = atoi(argv[1] + 2);        } else if (argv[1][1] == 'v') {            verbose = 1;        } else if (argv[1][1] == 'D') {            debug = 1;        } else if (argv[1][1] == 'x') {            useextern = 1;        } else if (argv[1][1] == 'X') {            useextern = 2;        } else if (argv[1][1] == 'n') {            usenames = 1;        } else if (argv[1][1] == 'm') {            usemacros = 1;        } else if (argv[1][1] == 'h') {            hasheader = 1;        } else if (argv[1][1] == 'i') {            useifdefs = 1;        } else if (argv[1][1] == 'o' && argc > 2) {            strcpy(outfname, argv[2]);            argc--, argv++;        } else {            usage();        }        argc--, argv++;    }    if (argc > 2 && !strcmp(argv[argc-2], "-o")) {        strcpy(outfname, argv[argc-1]);        argc -= 2;    }    if (*outfname) {        outf = fopen(outfname, "w");        if (!outf) {            perror(outfname);            exit(1);        }    } else        outf = stdout;    if (hasheader) {        time(&li);        cp = ctime(&li);        cp[24] = 0;        fprintf(outf, "\n/* Declarations created by \"makeproto\" on %s */\n", cp);        fprintf(outf, "\n\n");    }    incomment = 0;    for (whichf = 1; whichf < argc + (argc < 2); whichf++) {        if (whichf >= argc || !strcmp(argv[whichf], "-")) {            inf = stdin;        } else {            inf = fopen(argv[whichf], "r");            if (!inf) {                perror(argv[whichf]);                fprintf(outf, "\n/* Unable to open file %s */\n", argv[whichf]);                errors++;                continue;            }        }        firstdecl = 1;        while (readline(buf, inf)) {            if (!isidchar(*buf))                continue;            cp = buf;            cp2 = ftype;            numstars = 0;            while (isspace(*cp) || isidchar(*cp))                *cp2++ = *cp++;            if (*cp == '*') {                while (*cp == '*' || isspace(*cp)) {                    if (*cp == '*')                        numstars++;                    cp++;                }            } else {                while (cp > buf && isspace(cp[-1])) cp--, cp2--;                while (cp > buf && isidchar(cp[-1])) cp--, cp2--;            }            while (cp2 > ftype && isspace(cp2[-1])) cp2--;            *cp2 = 0;            if (!*ftype)                strcpy(ftype, "int");

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?