📄 ident.c
字号:
/* Copyright (C) 1982, 1988, 1989 Walter Tichy Copyright 1990, 1991 by Paul Eggert Distributed under license by the Free Software Foundation, Inc.This file is part of RCS.RCS is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.RCS is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with RCS; see the file COPYING. If not, write tothe Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.Report problems and direct all questions to: rcs-bugs@cs.purdue.edu*//* * RCS identification operation *//* $Log: ident.c,v $ * Revision 5.3 1991/09/10 22:15:46 eggert * Open files with FOPEN_R, not FOPEN_R_WORK, * because they might be executables, not working files. * * Revision 5.2 1991/08/19 03:13:55 eggert * Report read errors immediately. * * Revision 5.1 1991/02/25 07:12:37 eggert * Don't report empty keywords. Check for I/O errors. * * Revision 5.0 1990/08/22 08:12:37 eggert * Don't limit output to known keywords. * Remove arbitrary limits and lint. Ansify and Posixate. * * Revision 4.5 89/05/01 15:11:54 narten * changed copyright header to reflect current distribution rules * * Revision 4.4 87/10/23 17:09:57 narten * added exit(0) so exit return code would be non random * * Revision 4.3 87/10/18 10:23:55 narten * Updating version numbers. Changes relative to 1.1 are actually relative * to 4.1 * * Revision 1.3 87/07/09 09:20:52 trinkle * Added check to make sure there is at least one arg before comparing argv[1] * with "-q". This necessary on machines that don't allow dereferncing null * pointers (i.e. Suns). * * Revision 1.2 87/03/27 14:21:47 jenkins * Port to suns * * Revision 4.1 83/05/10 16:31:02 wft * Added option -q and input from reading stdin. * Marker matching is now done with trymatch() (independent of keywords). * * Revision 3.4 83/02/18 17:37:49 wft * removed printing of new line after last file. * * Revision 3.3 82/12/04 12:48:55 wft * Added LOCKER. * * Revision 3.2 82/11/28 18:24:17 wft * removed Suffix; added ungetc to avoid skipping over trailing KDELIM. * * Revision 3.1 82/10/13 15:58:51 wft * fixed type of variables receiving from getc() (char-->int).*/#include "rcsbase.h"static int match P((FILE*));static void scanfile P((FILE*,char const*,int));mainProg(identId, "ident", "$Id: ident.c,v 5.3 1991/09/10 22:15:46 eggert Exp $")/* Ident searches the named files for all occurrences * of the pattern $keyword:...$, where the keywords are * Author, Date, Header, Id, Log, RCSfile, Revision, Source, and State. */{ FILE *fp; int quiet; int status = EXIT_SUCCESS; if ((quiet = argc > 1 && strcmp("-q",argv[1])==0)) { argc--; argv++; } if (argc<2) scanfile(stdin, (char*)0, quiet); while ( --argc > 0 ) { if (!(fp = fopen(*++argv, FOPEN_R))) { VOID fprintf(stderr, "%s error: can't open %s\n", cmdid, *argv); status = EXIT_FAILURE; } else { scanfile(fp, *argv, quiet); if (argc>1) VOID putchar('\n'); } } if (ferror(stdout) || fclose(stdout)!=0) { VOID fprintf(stderr, "%s error: write error\n", cmdid); status = EXIT_FAILURE; } exitmain(status);}#if lint exiting void identExit() { _exit(EXIT_FAILURE); }#endif static voidscanfile(file, name, quiet) register FILE *file; char const *name; int quiet;/* Function: scan an open file with descriptor file for keywords. * Return false if there's a read error. */{ register int c; if (name) VOID printf("%s:\n", name); else name = "input"; c = 0; for (;;) { if (c < 0) { if (feof(file)) break; if (ferror(file)) goto read_error; } if (c == KDELIM) { if ((c = match(file))) continue; quiet = true; } c = getc(file); } if (!quiet) VOID fprintf(stderr, "%s warning: no id keywords in %s\n", cmdid, name); if (fclose(file) == 0) return; read_error: VOID fprintf(stderr, "%s error: %s: read error\n", cmdid, name); exit(EXIT_FAILURE);} static intmatch(fp) /* group substring between two KDELIM's; then do pattern match */ register FILE *fp;{ char line[BUFSIZ]; register int c; register char * tp; tp = line; while ((c = getc(fp)) != VDELIM) { if (c < 0) return c; switch (ctab[c]) { case LETTER: case Letter: *tp++ = c; if (tp < line+sizeof(line)-4) break; /* fall into */ default: return c ? c : '\n'/* anything but 0 or KDELIM or EOF */; } } if (tp == line) return c; *tp++ = c; if ((c = getc(fp)) != ' ') return c ? c : '\n'; *tp++ = c; while( (c = getc(fp)) != KDELIM ) { if (c < 0 && feof(fp) | ferror(fp)) return c; switch (ctab[c]) { default: *tp++ = c; if (tp < line+sizeof(line)-2) break; /* fall into */ case NEWLN: case UNKN: return c ? c : '\n'; } } if (tp[-1] != ' ') return c; *tp++ = c; /*append trailing KDELIM*/ *tp = '\0'; VOID fprintf(stdout, " %c%s\n", KDELIM, line); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -