home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / CMDS / rcs4.lha / ident.c < prev    next >
C/C++ Source or Header  |  1993-03-03  |  4KB  |  151 lines

  1. /*
  2.  *                     RCS identification operation
  3.  */
  4. #ifndef lint
  5. static char rcsid[]=
  6. "$Header: /arthur/src/local/bin/rcs/src/RCS/ident.c,v 4.4 87/10/23 17:09:57 narten Exp $Purdue CS";
  7. #endif
  8. /*****************************************************************************
  9.  *****************************************************************************
  10.  *
  11.  * Copyright (C) 1982 by Walter F. Tichy
  12.  *                       Purdue University
  13.  *                       Computer Science Department
  14.  *                       West Lafayette, IN 47907
  15.  *
  16.  * All rights reserved. No part of this software may be sold or distributed
  17.  * in any form or by any means without the prior written permission of the
  18.  * author.
  19.  * Report problems and direct all inquiries to Tichy@purdue (ARPA net).
  20.  */
  21.  
  22. /* $Log:    ident.c,v $
  23.  * Revision 4.4  87/10/23  17:09:57  narten
  24.  * added exit(0) so exit return code would be non random
  25.  * 
  26.  * Revision 4.3  87/10/18  10:23:55  narten
  27.  * Updating version numbers. Changes relative to 1.1 are actually relative
  28.  * to 4.1
  29.  * 
  30.  * Revision 1.3  87/07/09  09:20:52  trinkle
  31.  * Added check to make sure there is at least one arg before comparing argv[1]
  32.  * with "-q".  This necessary on machines that don't allow dereferncing null
  33.  * pointers (i.e. Suns).
  34.  * 
  35.  * Revision 1.2  87/03/27  14:21:47  jenkins
  36.  * Port to suns
  37.  * 
  38.  * Revision 1.1  84/01/23  14:50:03  kcs
  39.  * Initial revision
  40.  * 
  41.  * Revision 4.1  83/05/10  16:31:02  wft
  42.  * Added option -q and input from reading stdin.
  43.  * Marker matching is now done with trymatch() (independent of keywords).
  44.  * 
  45.  * Revision 3.4  83/02/18  17:37:49  wft
  46.  * removed printing of new line after last file.
  47.  *
  48.  * Revision 3.3  82/12/04  12:48:55  wft
  49.  * Added LOCKER.
  50.  *
  51.  * Revision 3.2  82/11/28  18:24:17  wft
  52.  * removed Suffix; added ungetc to avoid skipping over trailing KDELIM.
  53.  *
  54.  * Revision 3.1  82/10/13  15:58:51  wft
  55.  * fixed type of variables receiving from getc() (char-->int).
  56. */
  57.  
  58. #include  "rcsbase.h"
  59. #define fflsbuf _flsbuf
  60. /* redefinition of _flsbuf in putc not needed */
  61. #ifndef lint
  62. static char rcsbaseid[] = RCSBASE;
  63. #endif
  64.  
  65. extern enum markers trymatch();
  66.  
  67. int quietflag;
  68.  
  69. main(argc, argv)
  70. int  argc; char  *argv[];
  71. /*  Ident searches the named files for all occurrences
  72.  *  of the pattern $keyword:...$, where the keywords are
  73.  *  Author, Date, Header, Id, Log, RCSfile, Revision, Source, and State.
  74.  */
  75.  
  76. {
  77.    FILE *fp, *fopen();
  78.  
  79.    quietflag = false;
  80.    if (argc > 1 && strcmp("-q",argv[1])==0) {
  81.         quietflag = true;
  82.         argc--; argv++;
  83.    }
  84.  
  85.    if (argc<2) {
  86.      if ((scanfile(stdin) == 0) && !quietflag)
  87.         VOID fprintf(stderr, "ident warning: no id keywords in input\n");
  88.     exit(0);
  89.    }
  90.  
  91.    while ( --argc > 0 ) {
  92.       if ( (fp = fopen(*++argv, "r") ) == NULL ) {
  93.          VOID fprintf(stderr,  "ident error: can't open %s\n", *argv);
  94.          continue;
  95.       } else {
  96.          VOID printf( "%s:\n", *argv);   /*  print file name  */
  97.      if ((scanfile(fp) == 0) && !quietflag)
  98.         VOID fprintf(stderr, "ident warning: no id keywords in %s\n", *argv);
  99.      if (argc>1) putchar('\n');
  100.      VOID fclose(fp);
  101.       }
  102.    }
  103.    exit(0);
  104. }
  105.  
  106.  
  107. int scanfile(file)
  108. FILE * file;
  109. /* Function: scan an open file with descriptor file for keywords.
  110.  * Returns the number of matches.
  111.  */
  112. {
  113.    register int matchcount;
  114.    register int c;
  115.  
  116.  
  117.    matchcount = 0;
  118.    while( (c=getc(file)) != EOF) {
  119.       if ( (char)c==KDELIM)
  120.      matchcount += match(file);
  121.    }
  122.    return matchcount;
  123. }
  124.  
  125.  
  126.  
  127. match(fp)   /* group substring between two KDELIM's; then do pattern match */
  128. FILE *fp;
  129. {
  130.    char line[keyvallength];
  131.    register int c;
  132.    register char * tp;
  133.  
  134.    tp = line;
  135.    while( (c = getc(fp)) != KDELIM ) {
  136.       *tp++ = c;
  137.       if ( c==EOF || c=='\n' || tp>= line+keyvallength-2)
  138.          return(0);
  139.    }
  140.    *tp++ = c;     /*append trailing KDELIM*/
  141.    *tp   = '\0';
  142.    if (trymatch(line,true)!=Nomatch) {
  143.         VOID fprintf(stdout,"     $%s\n",line);
  144.         return(1);
  145.    } else {
  146.       /* no match; put trailing KDELIM back into input */
  147.       VOID ungetc(c,fp );
  148.       return(0);
  149.    }
  150. }
  151.