1#!/bin/sh -
2#
3# $Id: chk.nl,v 12.0 2004/11/17 03:44:43 bostic Exp $
4#
5# Check to make sure that there are no trailing newlines in __db_err calls.
6
7d=../..
8
9[ -f $d/README ] || {
10	echo "FAIL: chk.nl can't find the source directory."
11	exit 1
12}
13
14cat << END_OF_CODE > t.c
15#include <sys/types.h>
16
17#include <errno.h>
18#include <stdio.h>
19
20int chk(FILE *, char *);
21
22int
23main(argc, argv)
24	int argc;
25	char *argv[];
26{
27	FILE *fp;
28	int exitv;
29
30	for (exitv = 0; *++argv != NULL;) {
31		if ((fp = fopen(*argv, "r")) == NULL) {
32			fprintf(stderr, "%s: %s\n", *argv, strerror(errno));
33			return (1);
34		}
35		if (chk(fp, *argv))
36			exitv = 1;
37		(void)fclose(fp);
38	}
39	return (exitv);
40}
41
42int
43chk(fp, name)
44	FILE *fp;
45	char *name;
46{
47	int ch, exitv, line, q;
48
49	exitv = 0;
50	for (ch = 'a', line = 1;;) {
51		if ((ch = getc(fp)) == EOF)
52			return (exitv);
53		if (ch == '\n') {
54			++line;
55			continue;
56		}
57		if (!isspace(ch)) continue;
58		if ((ch = getc(fp)) != '_') continue;
59		if ((ch = getc(fp)) != '_') continue;
60		if ((ch = getc(fp)) != 'd') continue;
61		if ((ch = getc(fp)) != 'b') continue;
62		if ((ch = getc(fp)) != '_') continue;
63		if ((ch = getc(fp)) != 'e') continue;
64		if ((ch = getc(fp)) != 'r') continue;
65		if ((ch = getc(fp)) != 'r') continue;
66		if ((ch = getc(fp)) != '(') continue;
67		while ((ch = getc(fp)) != '"') {
68			if (ch == EOF)
69				return (exitv);
70			if (ch == '\n')
71				++line;
72		}
73		while ((ch = getc(fp)) != '"')
74			switch (ch) {
75			case EOF:
76				return (exitv);
77			case '\\n':
78				++line;
79				break;
80			case '.':
81				if ((ch = getc(fp)) != '"')
82					ungetc(ch, fp);
83				else {
84					fprintf(stderr,
85				    "%s: <period> at line %d\n", name, line);
86					exitv = 1;
87				}
88				break;
89			case '\\\\':
90				if ((ch = getc(fp)) != 'n')
91					ungetc(ch, fp);
92				else if ((ch = getc(fp)) != '"')
93					ungetc(ch, fp);
94				else {
95					fprintf(stderr,
96				    "%s: <newline> at line %d\n", name, line);
97					exitv = 1;
98				}
99				break;
100			}
101	}
102	return (exitv);
103}
104END_OF_CODE
105
106cc t.c -o t
107if ./t $d/*/*.[ch] $d/*/*.cpp $d/*/*.in ; then
108	:
109else
110	echo "FAIL: found __db_err calls ending with periods/newlines."
111	exit 1
112fi
113
114exit 0
115