diff options
author | Joris Vink <joris@cvs.openbsd.org> | 2005-10-06 15:39:12 +0000 |
---|---|---|
committer | Joris Vink <joris@cvs.openbsd.org> | 2005-10-06 15:39:12 +0000 |
commit | c31498c5d06af5f604439552a2b3f4500d159eca (patch) | |
tree | f19db898d4595ab8466d5894195c86a9a9d4a261 | |
parent | 8fd11ed674be3385f750fc9240e7199756a333a5 (diff) |
ident command, written by xsa@ but he is too busy with work right now;
-rw-r--r-- | usr.bin/rcs/Makefile | 4 | ||||
-rw-r--r-- | usr.bin/rcs/ident.c | 152 | ||||
-rw-r--r-- | usr.bin/rcs/rcsprog.c | 4 | ||||
-rw-r--r-- | usr.bin/rcs/rcsprog.h | 4 |
4 files changed, 159 insertions, 5 deletions
diff --git a/usr.bin/rcs/Makefile b/usr.bin/rcs/Makefile index 16999b31e2c..4d68b2ac077 100644 --- a/usr.bin/rcs/Makefile +++ b/usr.bin/rcs/Makefile @@ -1,11 +1,11 @@ -# $OpenBSD: Makefile,v 1.11 2005/10/06 12:56:49 joris Exp $ +# $OpenBSD: Makefile,v 1.12 2005/10/06 15:39:11 joris Exp $ .PATH: ${.CURDIR}/../cvs PROG= rcs MAN= rcs.1 -SRCS= ci.c co.c rcsclean.c rcsdiff.c rcsprog.c rlog.c buf.c diff.c \ +SRCS= ci.c co.c ident.c rcsclean.c rcsdiff.c rcsprog.c rlog.c buf.c diff.c \ log.c rcs.c rcsnum.c strtab.c CFLAGS+=-I${.CURDIR}/../cvs diff --git a/usr.bin/rcs/ident.c b/usr.bin/rcs/ident.c new file mode 100644 index 00000000000..48eacb36f5d --- /dev/null +++ b/usr.bin/rcs/ident.c @@ -0,0 +1,152 @@ +/* $OpenBSD: ident.c,v 1.1 2005/10/06 15:39:11 joris Exp $ */ +/* + * Copyright (c) 2005 Xavier Santolaria <xsa@openbsd.org> + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 AUTHOR 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. + */ + +#include <sys/param.h> + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "log.h" +#include "rcs.h" +#include "rcsprog.h" + +#define KEYDELIM '$' /* keywords delimitor */ +#define VALDELIM ':' /* values delimitor */ + +extern char *__progname; + +static int ident_file(const char *, FILE *); +static int ident_line(FILE *); + +int +ident_main(int argc, char **argv) +{ + int i, ch; + FILE *fp; + + while ((ch = getopt(argc, argv, "qV")) != -1) { + switch(ch) { + case 'q': + verbose = 0; + break; + case 'V': + printf("%s\n", rcs_version); + exit(0); + default: + (usage)(); + exit(1); + } + } + + argc -= optind; + argv += optind; + + if (argc == 0) { + ident_file(NULL, stdin); + } else { + for (i = 0; i < argc; i++) { + if ((fp = fopen(argv[i], "r")) == NULL) { + cvs_log(LP_ERRNO, "%s", argv[i]); + continue; + } + + ident_file(argv[i], fp); + fclose(fp); + } + } + + return (0); +} + + +static int +ident_file(const char *filename, FILE *fp) +{ + int c; + + if (fp != stdin) + printf("%s:\n", filename); + + for (c = 0; c != EOF; (c = getc(fp))) { + if ((feof(fp)) || (ferror(fp))) + break; + if (c == KEYDELIM) + ident_line(fp); + } + + return (0); +} + +static int +ident_line(FILE *fp) +{ + int c; + char *p, linebuf[1024]; + + p = linebuf; + + while ((c = getc(fp)) != VALDELIM) { + if ((c == EOF) && (feof(fp) | ferror(fp))) + return (0); + + if (isalpha(c)) + *(p++) = c; + else + return (0); + } + + *(p++) = ':'; + + while ((c = getc(fp)) != KEYDELIM) { + if ((c == EOF) && (feof(fp) | ferror(fp))) + return (0); + + if (c == '\n') + return (0); + + *(p++) = c; + } + + if (p[-1] != ' ') + return (0); + + /* append trailing KEYDELIM */ + *(p++) = c; + *p = '\0'; + + printf("\t%c%s\n", KEYDELIM, linebuf); + + return (0); +} + +void +ident_usage(void) +{ + fprintf(stderr, "Usage: %s [-qV] file ...\n", __progname); +} diff --git a/usr.bin/rcs/rcsprog.c b/usr.bin/rcs/rcsprog.c index a227ada53a9..f2c7b924ae4 100644 --- a/usr.bin/rcs/rcsprog.c +++ b/usr.bin/rcs/rcsprog.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rcsprog.c,v 1.21 2005/10/06 12:56:49 joris Exp $ */ +/* $OpenBSD: rcsprog.c,v 1.22 2005/10/06 15:39:11 joris Exp $ */ /* * Copyright (c) 2005 Jean-Francois Brousseau <jfb@openbsd.org> * All rights reserved. @@ -57,7 +57,7 @@ struct rcs_prog { { "rcsclean", rcsclean_main, rcsclean_usage }, { "rcsdiff", rcsdiff_main, rcsdiff_usage }, { "rlog", rlog_main, rlog_usage }, - { "ident", NULL, NULL }, + { "ident", ident_main, ident_usage }, }; int diff --git a/usr.bin/rcs/rcsprog.h b/usr.bin/rcs/rcsprog.h index f79de9640b4..24a58871b4f 100644 --- a/usr.bin/rcs/rcsprog.h +++ b/usr.bin/rcs/rcsprog.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rcsprog.h,v 1.7 2005/10/06 12:56:49 joris Exp $ */ +/* $OpenBSD: rcsprog.h,v 1.8 2005/10/06 15:39:11 joris Exp $ */ /* * Copyright (c) 2005 Joris Vink <joris@openbsd.org> * All rights reserved. @@ -37,6 +37,7 @@ void checkin_usage(void); void rcsdiff_usage(void); void rcsclean_usage(void); void rlog_usage(void); +void ident_usage(void); void (*usage)(void); int rcs_statfile(char *, char *, size_t); @@ -46,5 +47,6 @@ int rcs_main(int, char **); int rcsdiff_main(int, char **); int rcsclean_main(int, char **); int rlog_main(int, char **); +int ident_main(int, char **); #endif /* RCSPROG_H */ |