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

📄 makedefs.c

📁 早期freebsd实现
💻 C
字号:
/* * Copyright (c) 1983 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintchar copyright[] ="@(#) Copyright (c) 1983 The Regents of the University of California.\n\ All rights reserved.\n";#endif /* not lint */#ifndef lintstatic char sccsid[] = "@(#)makedefs.c	5.6 (Berkeley) 6/1/90";#endif /* not lint *//* * Create a definitions file (e.g. .h) from an implementation file (e.g. .c). * * Usage is "makedefs source.c source.h" where source.h is to be created. * * Lines beginning with "public" or within a "#ifndef public ... #endif" * block are copied to the new file.  Initializations (e.g. "int x = 3") are * omitted ("int x;" is output). * * Normally a temporary definitions file is created and compared to * the given destination.  If they are different, the temporary file * is copied on top of the destination.  This is so that dependencies * when using "make" are not triggered. * * The "-f" option overrides this and forces the destination file to be created. */#include "defs.h"#include <signal.h>#include "pathnames.h"#define procedure void#define streqn(s1, s2, n) (strncmp(s1, s2, n) == 0)Boolean force;Boolean copytext;String tmpname;String modulename();procedure abnorm();main(argc, argv)int argc;String argv[];{    extern String mktemp();    String name;    File tmp;    Integer r;    Integer index;    if (streq(argv[1], "-f")) {	force = true;	index = 2;    } else {	force = false;	index = 1;    }    if (argc - index > 2) {	fatal("usage: makedefs [ -f ] file.c [ file.h ]\n");    }    tmp = nil;    if (freopen(argv[index], "r", stdin) == NULL) {	fatal("can't read %s", argv[index]);    }    signal(SIGINT, abnorm);    signal(SIGQUIT, abnorm);    if (index + 1 < argc) {	if (force) {	    tmpname = argv[index + 1];	} else {	    tmpname = mktemp(_PATH_TMP);	}	tmp = freopen(tmpname, "w", stdout);	if (tmp == nil) {	    fatal("can't write %s", tmpname);	}    }    copytext = false;    name = modulename(argv[index]);    printf("#ifndef %s\n", name);    printf("#define %s\n", name);    copy();    printf("#endif\n");    if (tmp != NULL and not force) {	fclose(tmp);	r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil);	if (r != 0) {	    r = call("cp", stdin, stderr, tmpname, argv[2], nil);	    if (r != 0) {		fprintf(stderr, "can't create %s\n", argv[2]);	    }	}	unlink(tmpname);    }    quit(0);}String modulename(s)String s;{    String r, i, j;    static char buf[256];    strcpy(buf, s);    i = rindex(buf, '/');    if (i == nil) {	i = buf;    } else {	++i;    }    for (j = i; *j; j++) {	if (*j == '.') {	    *j = '_';	}    }    if (j > i && *--j == 'c') {	*j = 'h';    }    return i;}copy(){    register char *p;    integer nesting;    char line[1024];    while (gets(line) != NULL) {	if (streqn(line, "#ifndef public", 14)) {	    copytext = true;	    nesting = 1;	} else if (streqn(line, "public", 6)) {	    copydef(line);	} else if (copytext) {	    if (streqn(line, "#ifdef", 6) or streqn(line, "#ifndef", 7)) {		++nesting;		printf("%s\n", line);	    } else if (streqn(line, "#endif", 6)) {		--nesting;		if (nesting <= 0) {		    copytext = false;		} else {		    printf("%s\n", line);		}	    } else {		printf("%s\n", line);	    }	} else if (	    streqn(line, "#ifdef", 6) or	    streqn(line, "#ifndef", 7) or	    streqn(line, "#else", 5) or	    streqn(line, "#endif", 6)	) {	    printf("%s\n", line);	}    }}copydef(s)String s;{    register char *p;    register Boolean isproc;    isproc = false;    for (p = &s[7]; *p != '\0' and *p != '='; p++) {	if (*p == '(') {	    isproc = true;	    printf("(/* ");	} else if (*p == ')' and isproc and *(p+1) == '\0') {	    printf(" */)");	} else {	    putchar(*p);	}    }    if (isproc or *p == '=') {	putchar(';');    }    putchar('\n');}/* * Terminate program. */procedure abnorm(signo)int signo;{    unlink(tmpname);    quit(signo);}quit(r)int r;{    exit(r);}/* * No special error recovery strategy. */erecover(){}

⌨️ 快捷键说明

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