summaryrefslogtreecommitdiff
path: root/support/glosstex/labels.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/glosstex/labels.c
Initial commit
Diffstat (limited to 'support/glosstex/labels.c')
-rw-r--r--support/glosstex/labels.c213
1 files changed, 213 insertions, 0 deletions
diff --git a/support/glosstex/labels.c b/support/glosstex/labels.c
new file mode 100644
index 0000000000..0b3f0d162b
--- /dev/null
+++ b/support/glosstex/labels.c
@@ -0,0 +1,213 @@
+
+/* -*- c -*- */
+
+/*
+ GlossTeX, a tool for the automatic preparation of glossaries.
+ Copyright (C) 1997 Volkan Yavuz
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ Volkan Yavuz, yavuzv@rumms.uni-mannheim.de
+ */
+
+/* $Id: labels.c,v 1.29 1997/12/13 16:06:55 volkan Exp $ */
+
+#include "glosstex.h"
+#include "labels.h"
+#include "list.h"
+#include "error.h"
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#define KEYWORDSIZE 10 /* \GLX@entry */
+#define INPUTWORDSIZE 7 /* \@input */
+
+static int get_label (char buf[],
+ char *label, char *pageref_mode,
+ char *list, char *list_mode, char *page);
+
+int
+read_labels (char *inname)
+{
+ FILE *infile;
+ char buf[LINESIZE];
+ unsigned int lineno = 0;
+ s_list_iterator iter;
+
+ /* don't forget to update "iter" whenever "labels" changes! */
+ iter.root = labels.root;
+ iter.current = labels.root;
+
+ if ((infile = fopen (inname, "r")) == NULL) {
+ error ("input-file %s", inname);
+ return 1;
+ }
+ printlog (PROGRESS, STDOUT, "(%s ", inname);
+
+ while (fgets (buf, LINESIZE, infile) != 0) {
+ if (buf[strlen (buf) - 1] == '\n')
+ lineno++;
+
+ if ((strncmp (buf, "\\GLX@entry", KEYWORDSIZE)) == 0) {
+
+ s_label *label = (s_label *) malloc (sizeof (s_label));
+ s_label *found_label = 0;
+ assert (label != 0);
+
+ label->label = (char *) malloc (WORDSIZE + 1);
+ assert (label->label != 0);
+
+ label->pageref_mode = (char *) malloc (WORDSIZE + 1);
+ assert (label->pageref_mode != 0);
+
+ label->list = (char *) malloc (WORDSIZE + 1);
+ assert (label->list != 0);
+
+ label->list_mode = (char *) malloc (WORDSIZE + 1);
+ assert (label->list_mode != 0);
+
+ label->page = (char *) malloc (WORDSIZE + 1);
+ assert (label->page != 0);
+
+ label->flag = UNRESOLVED;
+
+ if (get_label (&buf[KEYWORDSIZE],
+ label->label, label->pageref_mode,
+ label->list, label->list_mode,
+ label->page) != 0) {
+ printlog (PROGRESS, STDOUT, "x");
+ printlog (WARNING, LOGFILE, "\n%s:%u parse error: %s",
+ inname, lineno, buf);
+ count_label_parsing++;
+ continue;
+ }
+ if ((found_label =
+ find_label (&iter, FIND_FIRST, label->label, label->list)) == 0) {
+ list_add (&labels, label);
+ iter.root = labels.root; /* update iter because labels changed */
+ printlog (INFORMATION, LOGFILE, "\n%s:%u %s[%s](%s)%s@%s",
+ inname, lineno,
+ label->label, label->pageref_mode,
+ label->list, label->list_mode, label->page);
+ count_label_success++;
+ printlog (PROGRESS, STDOUT, "i");
+ } else {
+ if (((strcmp (found_label->pageref_mode, "n") == 0) &&
+ (strcmp (label->pageref_mode, "n") != 0)) ||
+ ((strcmp (found_label->list_mode, "n") == 0) &&
+ (strcmp (label->list_mode, "n") != 0))) {
+ printlog (INFORMATION, LOGFILE,
+ "\n%s:%u %s[%s](%s)%s@%s overrides %s[%s](%s)%s@%s",
+ inname, lineno,
+ label->label, label->pageref_mode,
+ label->list, label->list_mode, label->page,
+ found_label->label, found_label->pageref_mode,
+ found_label->list, found_label->list_mode, found_label->page);
+ printlog (PROGRESS, STDOUT, "o");
+ free (found_label->label);
+ free (found_label->pageref_mode);
+ free (found_label->list);
+ free (found_label->list_mode);
+ free (found_label->page);
+ found_label->label = label->label;
+ found_label->pageref_mode = label->pageref_mode;
+ found_label->list = label->list;
+ found_label->list_mode = label->list_mode;
+ found_label->page = label->page;
+ count_label_override++;
+ free (label);
+ } else {
+ printlog (VERBOSE, LOGFILE, "\n%s:%u %s[%s](%s)%s@%s ignored",
+ inname, lineno,
+ label->label, label->pageref_mode,
+ label->list, label->list_mode, label->page);
+ printlog (PROGRESS, STDOUT, ".");
+ count_label_defined++;
+
+ free (label->label);
+ free (label->pageref_mode);
+ free (label->list);
+ free (label->list_mode);
+ free (label->page);
+ free (label);
+ }
+ }
+
+ } else if ((strncmp (buf, "\\@input", INPUTWORDSIZE)) == 0) {
+ char *new_file_name = (char *) malloc (WORDSIZE + 1);
+ assert (new_file_name != 0);
+
+ if (sscanf ((char *) (&buf[INPUTWORDSIZE]),
+ "{%128[^}]}\n", new_file_name) == 1)
+ read_labels (new_file_name);
+ }
+ }
+ printlog (PROGRESS, STDOUT, ")");
+
+ return 0;
+}
+
+s_label *
+find_label (s_list_iterator * iterator, enum e_find_mode find_mode,
+ char *label, char *list)
+{
+ if (find_mode == FIND_FIRST)
+ iterator->current = iterator->root;
+ else
+ iterator->current != 0 ? iterator->current = iterator->current->next : 0;
+
+ while (iterator->current != 0) {
+ if ((strcmp (((s_label *) (iterator->current->ptr))->label, label) == 0) &&
+ ((list == 0) ? 1 == 1 :
+ (strcmp (((s_label *) (iterator->current->ptr))->list, list) == 0)))
+ return ((s_label *) (iterator->current->ptr));
+ iterator->current = iterator->current->next;
+ }
+ return 0;
+}
+
+unsigned int
+show_unresolved_labels (s_list list, FILE * file)
+{
+ unsigned int i = 0;
+ s_node *p = list.root;
+ while (p != 0) {
+ if ((((s_label *) (p->ptr))->flag) == UNRESOLVED) {
+ printlog (WARNING, STDOUT | LOGFILE, "\n%s[%s](%s)%s@%s unresolved",
+ ((s_label *) (p->ptr))->label,
+ ((s_label *) (p->ptr))->pageref_mode,
+ ((s_label *) (p->ptr))->list,
+ ((s_label *) (p->ptr))->list_mode,
+ ((s_label *) (p->ptr))->page);
+ ++i;
+ }
+ p = p->next;
+ }
+ return i;
+}
+
+static int
+get_label (char buf[],
+ char *label, char *pageref_mode,
+ char *list, char *list_mode, char *page)
+{
+ int i = sscanf ((char *) (buf),
+ "{%128[^}]}{%128[^}]}{%128[^}]}{%128[^}]}{%128[^}]}\n",
+ label, pageref_mode, list, list_mode, page);
+
+ return i != 5 ? 1 : 0;
+}