From 253264591e14d173ac256fcb0b83b3463548c8fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Tue, 20 Jul 2021 02:10:11 +0200 Subject: Handle multiple authors --- example.t | 1 + refs.lex | 81 ++++++++++++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 60 insertions(+), 22 deletions(-) diff --git a/example.t b/example.t index b6051b7..7b5ebbb 100644 --- a/example.t +++ b/example.t @@ -9,6 +9,7 @@ References %pu Типография Михаила Земкевича .XP %au de Courtenay, J. Baudouin +%au Author, Fake Extra %da 1972 %ti The Difference between Phonetics and Psychophonetics %bo A Baudouin de Courtenay Anthology diff --git a/refs.lex b/refs.lex index 5440777..02ebbb0 100644 --- a/refs.lex +++ b/refs.lex @@ -2,6 +2,8 @@ #include #define MAX 255 + + #define AND "och" #define ED "red." #define TR "Övers." @@ -12,13 +14,22 @@ 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]; + int a; /* Number of authors. */ + char au[MAX][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]; + char QQ[MAX]; } e; %s ENTRY @@ -32,6 +43,7 @@ void main(int argc, char *argv[0]) { name = argv[0]; + e.a = 0; yylex(); } @@ -45,13 +57,21 @@ field(char *t) 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); + AS("au",e.au[e.a++]); + 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); + AS("??",e.QQ); fprintf(stderr, "%s: unrecognized field %%%.2s\n", name, t); exit(1); @@ -61,10 +81,19 @@ field(char *t) void entry() { + int i; #define EI(a, b) a ? a : b - (pf("% (%).\n", e.au, e.da) || pf("%.\n", e.au)); + /* Print authors. */ + for(i = 0; i < e.a-2; i++) + printf("%s, ", e.au[i]); + if(i == e.a-2) + printf("%s "AND" ", e.au[i++]); + if(i == e.a-1) + printf("%s", e.au[i]); + + (pf(" (%).\n", e.da) || (e.a ? pf(".\n") : 0)); if (*e.bo || *e.jo){ pf("%.\n", e.ti); pf("\\fI%\\fP", EI(e.bo, e.jo)); @@ -77,13 +106,21 @@ entry() #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); + e.a = 0; + 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); + CL(e.QQ); } /* Print formatted text if given strings are non-empty. */ -- cgit v1.2.3