plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

testscan.c (3500B)


      1 #include "sys.h"
      2 #include "spam.h"
      3 
      4 int 	debug;
      5 Biobuf	bin;
      6 char	patfile[128], header[Hdrsize+2];
      7 char	cmd[1024];
      8 
      9 char*	canon(Biobuf*, char*, char*, int*);
     10 int	matcher(char *, Pattern*, char*, Resub*);
     11 int	matchaction(Patterns*, char*);
     12 
     13 void
     14 usage(void)
     15 {
     16 	fprint(2, "missing or bad arguments to qer\n");
     17 	exits("usage");
     18 }
     19 
     20 void *
     21 Malloc(long n)
     22 {
     23 	void *p;
     24 
     25 	p = malloc(n);
     26 	if(p == 0){
     27 		fprint(2, "malloc error");
     28 		exits("malloc");
     29 	}
     30 	return p;
     31 }
     32 
     33 void*
     34 Realloc(void *p, ulong n)
     35 {
     36 	p = realloc(p, n);
     37 	if(p == 0){
     38 		fprint(2, "realloc error");
     39 		exits("realloc");
     40 	}
     41 	return p;
     42 }
     43 
     44 void
     45 dumppats(void)
     46 {
     47 	int i, j;
     48 	Pattern *p;
     49 	Spat *s, *q;
     50 
     51 	for(i = 0; patterns[i].action; i++){
     52 		for(p = patterns[i].regexps; p; p = p->next){
     53 			print("%s <REGEXP>\n", patterns[i].action);
     54 			if(p->alt)
     55 				print("Alt:");
     56 			for(s = p->alt; s; s = s->next)
     57 				print("\t%s\n", s->string);
     58 		}
     59 		p = patterns[i].strings;
     60 		if(p == 0)
     61 			continue;
     62 
     63 		for(j = 0; j < Nhash; j++){
     64 			for(s = p->spat[j]; s; s = s->next){
     65 				print("%s %s\n", patterns[i].action, s->string);
     66 				if(s->alt)
     67 					print("Alt:");
     68 				for(q = s->alt; q; q = q->next)
     69 					print("\t%s\n", q->string);
     70 			}
     71 		}
     72 	}
     73 }
     74 
     75 void
     76 main(int argc, char *argv[])
     77 {
     78 	int i, fd, n, aflag, vflag;
     79 	char body[Bodysize+2], *raw, *ret;
     80 	Biobuf *bp;
     81 
     82 	sprint(patfile, "%s/patterns", UPASLIB);
     83 	aflag = -1;
     84 	vflag = 0;
     85 	ARGBEGIN {
     86 	case 'a':
     87 		aflag = 1;
     88 		break;
     89 	case 'v':
     90 		vflag = 1;
     91 		break;
     92 	case 'd':
     93 		debug++;
     94 		break;
     95 	case 'p':
     96 		strcpy(patfile,ARGF());
     97 		break;
     98 	} ARGEND
     99 
    100 	bp = Bopen(patfile, OREAD);
    101 	if(bp){
    102 		parsepats(bp);
    103 		Bterm(bp);
    104 	}
    105 
    106 	if(argc >= 1){
    107 		fd = open(*argv, OREAD);
    108 		if(fd < 0){
    109 			fprint(2, "can't open %s\n", *argv);
    110 			exits("open");
    111 		}
    112 		Binit(&bin, fd, OREAD);
    113 	} else
    114 		Binit(&bin, 0, OREAD);
    115 
    116 	*body = 0;
    117 	*header = 0;
    118 	ret = 0;
    119 	for(;;){
    120 		raw = canon(&bin, header+1, body+1, &n);
    121 		if(raw == 0)
    122 			break;
    123 		if(aflag == 0)
    124 			continue;
    125 		if(aflag < 0)
    126 			aflag = 0;
    127 		if(vflag){
    128 			if(header[1]) {
    129 				fprint(2, "\t**** Header ****\n\n");
    130 				write(2, header+1, strlen(header+1));
    131 				fprint(2, "\n");
    132 			}
    133 			fprint(2, "\t**** Body ****\n\n");
    134 			if(body[1])
    135 				write(2, body+1, strlen(body+1));
    136 			fprint(2, "\n");
    137 		}
    138 
    139 		for(i = 0; patterns[i].action; i++){
    140 			if(matchaction(&patterns[i], header+1))
    141 				ret = patterns[i].action;
    142 			if(i == HoldHeader)
    143 				continue;
    144 			if(matchaction(&patterns[i], body+1))
    145 				ret = patterns[i].action;
    146 		}
    147 	}
    148 	exits(ret);
    149 }
    150 
    151 char*
    152 canon(Biobuf *bp, char *header, char *body, int *n)
    153 {
    154 	int hsize, base64;
    155 
    156 	static char *raw;
    157 
    158 	hsize = 0;
    159 	base64 = 0;
    160 	*header = 0;
    161 	*body = 0;
    162 	if(raw == 0){
    163 		raw = readmsg(bp, &hsize, n);
    164 		if(raw)
    165 			base64 = convert(raw, raw+hsize, header, Hdrsize, 0);
    166 	} else {
    167 		free(raw);
    168 		raw = readmsg(bp, 0, n);
    169 	}
    170 	if(raw){
    171 		if(base64)
    172 			conv64(raw+hsize, raw+*n, body, Bodysize);
    173 		else
    174 			convert(raw+hsize, raw+*n, body, Bodysize, 1);
    175 	}
    176 	return raw;
    177 }
    178 
    179 int
    180 matchaction(Patterns *pp, char *message)
    181 {
    182 	char *name, *cp;
    183 	int ret;
    184 	Pattern *p;
    185 	Resub m[1];
    186 
    187 	if(message == 0 || *message == 0)
    188 		return 0;
    189 
    190 	name = pp->action;
    191 	p = pp->strings;
    192 	ret = 0;
    193 	if(p)
    194 		for(cp = message; matcher(name, p, cp, m); cp = m[0].e.ep)
    195 				ret++;
    196 
    197 	for(p = pp->regexps; p; p = p->next)
    198 		for(cp = message; matcher(name, p, cp, m); cp = m[0].e.ep)
    199 				ret++;
    200 	return ret;
    201 }
    202 
    203 int
    204 matcher(char *action, Pattern *p, char *message, Resub *m)
    205 {
    206 	if(matchpat(p, message, m)){
    207 		if(p->action != Lineoff)
    208 			xprint(1, action, m);
    209 		return 1;
    210 	}
    211 	return 0;
    212 }