aboutsummaryrefslogtreecommitdiff
path: root/refs.lex
blob: 5440777503ddac26ef6081d5605153369d0a46e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
	#include <err.h>
	#include <stdarg.h>

	#define MAX 255
	#define ED "red."
	#define TR "Ă–vers."

	void field(char *);
	void entry(void);
	int pf(char *, ...);

	char *name;

	struct entry {
		char au[MAX]; char al[MAX];
		char bo[MAX]; char ci[MAX];
		char da[MAX]; char ed[MAX];
		char jo[MAX]; char no[MAX];
		char pg[MAX]; char pu[MAX];
		char se[MAX]; char ti[MAX];
		char tr[MAX]; char vo[MAX];
	} e;

%s ENTRY
%%
^%.*\n		field(yytext); BEGIN(ENTRY);
<ENTRY>^[^%]	entry(); ECHO; BEGIN(0);
<ENTRY><<EOF>>	entry(); yyterminate();
%%

void
main(int argc, char *argv[0])
{
	name = argv[0];
	yylex();
}

/* Save entry field. */
void
field(char *t)
{

#define AS(a,b) if(strncmp(t, a, 2) == 0 && (t += 3)){ strcpy(b, t); return; }

	t++;
	t[strcspn(t, "\n")] = 0;

	AS("au",e.au); AS("al",e.al);
	AS("bo",e.bo); AS("ci",e.ci);
	AS("da",e.da); AS("ed",e.ed);
	AS("jo",e.jo); AS("no",e.no);
	AS("pg",e.pg); AS("pu",e.pu);
	AS("se",e.se); AS("ti",e.ti);
	AS("tr",e.tr); AS("vo",e.vo);

	fprintf(stderr, "%s: unrecognized field %%%.2s\n", name, t);
	exit(1);
}

/* Print formatted entry. */
void
entry()
{

#define EI(a, b) a ? a : b

	(pf("% (%).\n", e.au, e.da) || pf("%.\n", e.au));
	if (*e.bo || *e.jo){
		pf("%.\n", e.ti);
		pf("\\fI%\\fP", EI(e.bo, e.jo));
		pf(" ("ED" %)", e.ed);
		pf(".\n");
	}else
		pf("\\fI%\\fP.\n", e.ti);
	pf(TR" %.\n", e.tr);
	(pf("%: %.\n", e.ci, e.pu) || pf("%.\n", e.pu));

#define CL(a) *a = 0

	CL(e.au); CL(e.al);
	CL(e.bo); CL(e.ci);
	CL(e.da); CL(e.ed);
	CL(e.jo); CL(e.no);
	CL(e.pg); CL(e.pu);
	CL(e.se); CL(e.ti);
	CL(e.tr); CL(e.vo);
}

/* Print formatted text if given strings are non-empty. */
int
pf(char *fmt, ...)
{
	char *buf, *p;
	int n;
	va_list ap;

	n = 0;
	for(p = fmt; *p; p++)
		if(*p == '%')
			n++;

	if(!(buf = malloc(strlen(fmt)+n*MAX+1)))
		err(1, "malloc");

	va_start(ap, fmt);
	for(; *fmt; fmt++)
		switch(*fmt){
		case '%':
			p = va_arg(ap, char *);
			if(!p || !*p)
				return 0;
			strcat(buf, p);
			break;
		default:
			strncat(buf, fmt, 1);
		}
	printf("%s", buf);
	va_end(ap);
	return 1;
}