PERFORCE change 180518 for review
Benjamin Fiedler
bfiedler at FreeBSD.org
Tue Jul 6 06:48:06 UTC 2010
http://p4web.freebsd.org/@@180518?ac=10
Change 180518 by bfiedler at freebsd-home on 2010/07/06 06:48:02
Rename strrep to repstr (reserved names). Start group and line format support, as well as function match. Still a fair amount of work to do on these implementations.
Affected files ...
.. //depot/projects/soc2010/bsdtextproc/gabor_diff/diff.c#9 edit
.. //depot/projects/soc2010/bsdtextproc/gabor_diff/diff.h#8 edit
.. //depot/projects/soc2010/bsdtextproc/gabor_diff/diffreg.c#10 edit
Differences ...
==== //depot/projects/soc2010/bsdtextproc/gabor_diff/diff.c#9 (text+ko) ====
@@ -53,11 +53,12 @@
int tabsize = 8;
int format, status;
int fcase_behave = FCASE_SENSITIVE;
+char *line_format[3] = {NULL}, *group_format[4] = {NULL};
unsigned long long context;
-char *start, *ifdefname, *diffargs, *label[2], *ignore_pats;
+char *start, *ifdefname, *diffargs, *label[2], *ignore_pats, *fnline_pat;
struct stat stb1, stb2;
struct excludes *excludes_list;
-regex_t ignore_re;
+regex_t ignore_re, fnline_re;
enum {
HELP_OPT = CHAR_MAX + 1,
@@ -72,13 +73,20 @@
LEFTC_OPT,
SUPCL_OPT,
LF_OPT,
+
+/* the following groupings must be in sequence
+*/
+ OLDGF_OPT,
+ NEWGF_OPT,
UNCGF_OPT,
CHGF_OPT,
- OLDGF_OPT,
- NEWGF_OPT,
- UNCLF_OPT,
+
OLDLF_OPT,
NEWLF_OPT,
+ UNCLF_OPT,
+/* end order-sensitive enums
+*/
+
TSIZE_OPT,
HLINES_OPT,
LFILES_OPT,
@@ -136,17 +144,41 @@
/* XXX: the following are not very well documented and rarely used. */
{ "line-format", required_argument, NULL, LF_OPT },
+ { "old-line-format", required_argument, NULL, OLDLF_OPT },
+ { "new-line-format", required_argument, NULL, NEWLF_OPT },
+ { "unchanged-line-format", required_argument, NULL, UNCLF_OPT },
+
{ "show-function-line", required_argument, NULL, 'F' },
- { "unchanged-group-format", required_argument, NULL, UNCGF_OPT },
{ "old-group-format", required_argument, NULL, OLDGF_OPT },
{ "new-group-format", required_argument, NULL, NEWGF_OPT },
+ { "unchanged-group-format", required_argument, NULL, UNCGF_OPT },
{ "changed-group-format", required_argument, NULL, CHGF_OPT },
- { "unchanged-line-format", required_argument, NULL, UNCLF_OPT },
- { "old-line-format", required_argument, NULL, OLDLF_OPT },
- { "new-line-format", required_argument, NULL, NEWLF_OPT },
{ NULL, 0, NULL, '\0'}
};
+/*
+ * allow for grep-style regex's by substituting regex equivalent
+*/
+static struct {
+ char *orig;
+ char *sub;
+} const grep_regex[] = {
+ { "[:alpha:]", "" },
+ { "[:upper:]", "" },
+ { "[:lower:]", "" },
+ { "[:digit:]", "" },
+ { "[:xdigit:]", "" },
+ { "[:space:]", "" },
+ { "[:punct:]", "" },
+ { "[:alnum:]", "" },
+ { "[:print:]", "" },
+ { "[:graph:]", "" },
+ { "[:cntrl:]", "" },
+ { "[:blank:]", "" },
+ { NULL, NULL },
+};
+
+
static const char *help_msg[] = {
"-a --text treat files as ASCII text",
"-B --ignore-blank-lines Ignore blank newlines in the comparison",
@@ -160,9 +192,12 @@
void usage(void);
void push_excludes(char *);
void push_ignore_pats(char *);
+void compile_regex(regex_t *, char *);
void read_excludes_file(char *);
void set_argstr(char **, char **);
+char *estrdup(const char *);
+
int
main(int argc, char **argv)
{
@@ -337,11 +372,34 @@
case HORIZ_OPT:
if (optarg != NULL) {
context = strtol(optarg, &ep, 10);
- if (*ep != '\0' || context < 1 || context >=ULLONG_MAX)
+ if (*ep != '\0' || context < 1 ||
+ context >=ULLONG_MAX)
err(2, "context out of range\n");
horizon= (int)context;
}
break;
+ case LF_OPT:
+ line_format[OLD] = line_format[NEW] = line_format[UNCHANGED]
+ = optarg;
+ flags |= D_LINE;
+ break;
+ case OLDLF_OPT:
+ case NEWLF_OPT:
+ case UNCLF_OPT:
+ line_format[ ch - OLDLF_OPT ] = optarg;
+ flags |= D_LINE;
+ break;
+ case 'F':
+ pflag = 1;
+ fnline_pat = optarg;
+ break;
+ case OLDGF_OPT:
+ case NEWGF_OPT:
+ case UNCGF_OPT:
+ case CHGF_OPT:
+ group_format[ch - OLDGF_OPT] = optarg;
+ flags |= D_GROUP;
+ break;
case NOOP_OPT:
/* noop, compatibility */
@@ -350,13 +408,15 @@
/* compatibility, this is the default */
break;
case HELP_OPT:
- default:
for(;*help_strs;help_strs++)
{
printf( "%s\n", *help_strs);
}
exit(2);
break;
+ default:
+ usage();
+ break;
}
lastch = ch;
newarg = optind != prevoptind;
@@ -377,18 +437,22 @@
else if (argc != 2 )
usage();
if (ignore_pats != NULL) {
- char buf[BUFSIZ];
- int error;
+ compile_regex(&ignore_re, ignore_pats);
+ }
+ if ( fnline_pat != NULL) {
+ char *expand;
+ expand = estrdup(fnline_pat);
+ fnline_pat = expand;
+ int i;
+ for( i = 0; grep_regex[i].orig; i++)
+ {
+ fnline_pat = repstr(fnline_pat, grep_regex[i].orig,
+ grep_regex[i].sub);
+ }
- if ((error = regcomp(&ignore_re, ignore_pats,
- REG_NEWLINE | REG_EXTENDED)) != 0) {
- regerror(error, &ignore_re, buf, sizeof(buf));
- if (*ignore_pats != '\0')
- errx(2, "%s: %s", ignore_pats, buf);
- else
- errx(2, "%s", buf);
- }
- }
+ compile_regex(&fnline_re, fnline_pat);
+ }
+
src = fromfile ? fromfile : argv[0];
dst = fromfile ? argv[0] : (tofile ? tofile : argv[1]);
if (strcmp(src, "-") == 0) {
@@ -528,6 +592,25 @@
fclose(fp);
}
+
+/*
+ * compile regex from string into re, call errx() if failure
+*/
+void compile_regex(regex_t *re, char *re_pat)
+{
+ char buf[BUFSIZ];
+ int error;
+
+ if ((error = regcomp(re, re_pat,
+ REG_NEWLINE | REG_EXTENDED)) != 0) {
+ regerror(error, re, buf, sizeof(buf));
+ if (*re_pat != '\0')
+ errx(2, "%s: %s", re_pat, buf);
+ else
+ errx(2, "%s", buf);
+ }
+}
+
/*
* Push a pattern onto the excludes list.
*/
==== //depot/projects/soc2010/bsdtextproc/gabor_diff/diff.h#8 (text+ko) ====
@@ -55,6 +55,8 @@
#define D_HEADER 1 /* Print a header/footer between files */
#define D_EMPTY1 2 /* Treat first file as empty (/dev/null) */
#define D_EMPTY2 4 /* Treat second file as empty (/dev/null) */
+#define D_LINE 8 /* There is a line format given */
+#define D_GROUP 16 /* There is a group format given */
/*
* Status values for print_status() and diffreg() return values
@@ -82,6 +84,16 @@
struct excludes *next;
};
+/*
+ * enums for line/group formats
+ */
+enum {
+ OLD = 0,
+ NEW,
+ UNCHANGED,
+ CHANGED,
+};
+
extern int aflag, bflag, Bflag, dflag, Eflag, iflag;
extern int lflag, Nflag, Pflag, pflag, rflag, sflag;
extern int tflag, Tflag, wflag, uniflag;
@@ -90,12 +102,13 @@
extern int fcase_behave;
extern unsigned long long context;
extern char *start, *ifdefname, *diffargs, *label[2], *ignore_pats;
+extern char *line_format[3], *group_format[4], *fnline_pat;
extern struct stat stb1, stb2;
extern struct excludes *excludes_list;
-extern regex_t ignore_re;
+extern regex_t ignore_re, fnline_re;
char *splice(char *, char *);
-char *strrep(char*, char*, char*);
+char *repstr(char*, const char*, const char*);
int diffreg(char *, char *, int);
int easprintf(char **, const char *, ...);
void *emalloc(size_t);
==== //depot/projects/soc2010/bsdtextproc/gabor_diff/diffreg.c#10 (text+ko) ====
@@ -1308,7 +1308,14 @@
buf[nc] = '\0';
buf[strcspn(buf, "\n")] = '\0';
- if (isalpha(buf[0]) || buf[0] == '_' || buf[0] == '$') {
+ if ( fnline_pat != NULL) {
+ if ( regexec(&fnline_re, buf, 0, NULL, 0) != 0) {
+ return NULL;
+ }
+ }
+
+
+ else if (isalpha(buf[0]) || buf[0] == '_' || buf[0] == '$') {
if (begins_with(buf, "private:")) {
if (!state)
state = " (private)";
@@ -1576,7 +1583,7 @@
* realloc()'ing base ptr if more characters necessary
*/
char *
-strrep(char *base, char *old, char *new)
+repstr(char *base, const char *old, const char *new)
{
char *ptr, *tmp;
int occ, len1, len2, newlen;
More information about the p4-projects
mailing list