summaryrefslogtreecommitdiff
path: root/biblio/bibtex/utils/mkbib/src/bib.y
diff options
context:
space:
mode:
Diffstat (limited to 'biblio/bibtex/utils/mkbib/src/bib.y')
-rw-r--r--biblio/bibtex/utils/mkbib/src/bib.y153
1 files changed, 153 insertions, 0 deletions
diff --git a/biblio/bibtex/utils/mkbib/src/bib.y b/biblio/bibtex/utils/mkbib/src/bib.y
new file mode 100644
index 0000000000..87708f9819
--- /dev/null
+++ b/biblio/bibtex/utils/mkbib/src/bib.y
@@ -0,0 +1,153 @@
+%{
+#include <stdio.h>
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <string.h>
+#include <glib/gstdio.h>
+#include <fcntl.h>
+#include "main.h"
+char* concat(char* str1, char* str2);
+
+void lex_brace();
+void lex_normal();
+#define slen 1064
+ int yylex(void);
+/*enum
+{
+ COL_BIB_KEY=0,
+ COL_BIB_TYPE, COL_BIB_AUTHOR, COL_BIB_YEAR,
+ NUM_COLS} ;
+*/
+typedef struct {
+ char *type;
+ char *id;
+ GHashTable *table;
+} BibEntry;
+
+BibEntry b_entry;
+GtkTreeIter siter;
+GtkListStore *store;
+
+void yyerror(char *s)
+{
+ printf("YYERROR : %s\n", s);
+}
+void parse_entry(BibEntry *bib_entry);
+
+%}
+
+// Symbols.
+%union
+{
+ char *sval;
+};
+
+%token <sval> ENTRYTYPE
+%token <sval> VALUE
+%token <sval> KEY
+%token OBRACE
+%token EBRACE
+%token QUOTE
+%token SEMICOLON
+%type <sval> Value
+%type <sval> BraceV
+%type <sval> BraceVs
+%start Input
+
+%%
+
+Input: Entry
+ | Input Entry ; /* input is zero or more entires */
+
+Entry:
+ ENTRYTYPE '{' KEY ','{
+ b_entry.type = $1;
+ b_entry.id = $3;
+ b_entry.table = g_hash_table_new_full(g_str_hash, g_str_equal, free, free);}
+ KeyVals '}' {
+ parse_entry(&b_entry);
+ g_hash_table_destroy(b_entry.table);
+ free(b_entry.type); free(b_entry.id);
+ b_entry.table = NULL;
+ b_entry.type = b_entry.id = NULL;}
+ ;
+
+KeyVals : /* empty */
+ | KeyVal
+ | KeyVal ',' KeyVals
+ ;
+
+KeyVal : KEY '=' Value { g_hash_table_replace(b_entry.table, $1, $3); }
+ ;
+
+Value : '{' { lex_brace(); } BraceVs { lex_normal(); } '}' { $$ = $3; }
+ | VALUE
+ ;
+
+BraceVs : /* empty */ { $$ = ""; }
+ | BraceV BraceVs { $$ = concat($1, $2); }
+ ;
+
+BraceV : VALUE
+ | '{' BraceVs '}' { $$ = concat(concat("{", $2), "}"); }
+ ;
+%%
+
+
+void parse_entry(BibEntry *bib_entry)
+{
+ char *author = "", *year = "";
+ GHashTableIter iter;
+ gpointer key, val;
+ char **kiter;
+ int i;
+ char *keys[] = {"id", "type", "author", "year", "title", "publisher", "editor",
+ "volume", "number", "pages", "month", "note", "address", "edition", "journal",
+ "series", "book", "chapter", "organization", NULL};
+ char *vals[] = {NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL};
+
+ g_hash_table_iter_init(&iter, bib_entry->table);
+ while (g_hash_table_iter_next(&iter, &key, &val)) {
+ for (kiter = keys, i = 0; *kiter; kiter++, i++)
+ {
+ if (!g_ascii_strcasecmp(*kiter, key)) {
+ vals[i] = g_strndup(val,slen);
+ break;
+ }
+ }
+ }
+
+ gtk_list_store_append (store, &siter);
+ gtk_list_store_set (store, &siter,
+ COL_BIB_AUTHOR, vals[COL_BIB_AUTHOR],
+ COL_BIB_TYPE, bib_entry->type,
+ COL_BIB_KEY, bib_entry->id,
+ COL_BIB_YEAR, vals[COL_BIB_YEAR],
+ COL_BIB_TITLE, vals[COL_BIB_TITLE],
+ COL_BIB_PUBLISHER, vals[COL_BIB_PUBLISHER],
+ COL_BIB_EDITOR, vals[COL_BIB_EDITOR],
+ COL_BIB_VOL, vals[COL_BIB_VOL],
+ COL_BIB_NUMBER, vals[COL_BIB_NUMBER],
+ COL_BIB_PAGE, vals[COL_BIB_PAGE],
+ COL_BIB_MON, vals[COL_BIB_MON],
+ COL_BIB_NOTE, vals[COL_BIB_NOTE],
+ COL_BIB_ADDRESS, vals[COL_BIB_ADDRESS],
+ COL_BIB_EDITION, vals[COL_BIB_EDITION],
+ COL_BIB_JOURNAL, vals[COL_BIB_JOURNAL],
+ COL_BIB_SERIES, vals[COL_BIB_SERIES],
+ COL_BIB_BOOK, vals[COL_BIB_BOOK],
+ COL_BIB_ORG, vals[COL_BIB_ORG],
+ COL_BIB_CHAP, vals[COL_BIB_CHAP],
+ COL_BIB_SCHOOL, vals[COL_BIB_SCHOOL],
+ -1);
+}
+
+char* concat(char* str1, char* str2) {
+ char* ret = malloc(strlen(str1) + strlen(str2) + 1);
+ strcpy(ret, str1);
+ strcat(ret, str2);
+ return ret;
+}