aboutsummaryrefslogtreecommitdiff
path: root/refs.lex
blob: 714a79e1e15f566c5a35b3136fcd42e6f6c7dedb (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
	#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();
}

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);
}

void
entry()
{
	(pf("% (%).\n", e.au, e.da) || pf("%.\n", e.au));
	(pf("%.\n\\fI%\\fP.\n", e.ti, e.bo ? e.bo : e.jo)
	|| pf("%.\n", e.ti));
	(pf("%: %.\n", e.ci, e.pu) || pf("%.\n", e.pu));
}

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[0])
				return 0;
			strcat(buf, p);
			break;
		default:
			strncat(buf, fmt, 1);
		}
	printf("%s", buf);
	va_end(ap);
	return 1;
}