view oldXMenu/XMakeAssoc.c @ 51415:762217a72cae

Long overdue merge. Don't require `compile' since it seems unnecessary. For all internal variables and functions the docstring comments have been converted into proper docstrings (bibtex-maintainer-address, bibtex-maintainer-salutation) (bibtex-version): Remove support for bug reporting. (bibtex-field-delimiters, bibtex-entry-delimiters) (bibtex-sort-ignore-string-entries, bibtex-maintain-sorted-entries) Replace make-variable-buffer-local by make-local-variable for (bibtex-entry-format): New tag `required-fields'. (bibtex-maintain-sorted-entries): New var. (bibtex-sort-entry-class, bibtex-sort-entry-class-alist): New vars. (bibtex-predefined-month-strings, bibtex-predefined-strings): Make into alists with pairs (abbreviation expansion). (bibtex-autokey-titleword-change-strings) (bibtex-autokey-transcriptions): Make into alists. Add new replacement pairs. (bibtex-autokey-use-crossref): New var. Replace bibtex-autokey-year-use-crossref-entry because updated code for autokey generation handles crossrefs independently of particular fields. (bibtex-reference-key, bibtex-mode-syntax-table): Remove = because it can't be part of a string's key. (bibtex-complete-key-cleanup): New var. (bibtex-complete): Merge bibtex-complete-string and bibtex-complete-key into it (and bind to M-tab). (bibtex-valid-entry-re, bibtex-any-valid-entry-re) (bibtex-valid-entry-whitespace-re, bibtex-empty-field-re) (bibtex-quoted-string-re): New vars. (bibtex-field-name-for-parsing): Don't make-variable-buffer-local. (zmacs-regions): Declare to quieten the byte-compiler. (bibtex-comment-start): Don't include the space. (bibtex-font-lock-syntactic-keywords): New var. (bibtex-font-lock-keywords): Remove the entry for @Comment. (bibtex-parse-field-string): Merge the functionality of bibtex-parse-field-string-braced, bibtex-parse-quoted-string and bibtex-parse-field-string-quoted. (bibtex-search-forward-field-string): Remove. (bibtex-parse-association): Use when. (bibtex-parse-field-name): Use when. (bibtex-parse-field-text): Use when and cond. (bibtex-parse-field): Use let. (bibtex-search-forward-field, bibtex-search-backward-field): Make bound optional, use let, setq, and cddr. (bibtex-start-of-field, bibtex-start-of-name-in-field) (bibtex-end-of-name-in-field): Use nth. (bibtex-name-in-field, bibtex-text-in-field-bounds) (bibtex-text-in-field, bibtex-type-in-head, bibtex-key-in-head) (bibtex-text-in-string): New functions. (bibtex-reference-key-in-string): New fun. Merge of bibtex-start-of-reference-key-in-string and bibtex-end-of-reference-key-in-string. (bibtex-parse-string-prefix): Use let and when. (bibtex-parse-string-postfix): Use when. (bibtex-search-forward-string, bibtex-search-backward-string): Use save-excursion and setq. (bibtex-member-of-regexp): Use let. (bibtex-assoc-of-regexp): Use caar und let. (bibtex-skip-to-valid-entry): Return buffer position. (bibtex-map-entries): Use save-excursion. (bibtex-progress-message): Simplify. (bibtex-search-entry): Use skip-chars-forward, when, save-match-data. (bibtex-move-outside-of-entry): Handle the case that point is before first entry. (bibtex-enclosing-field): Use save-excursion, when. (bibtex-format-field-delimiters): Merge into bibtex-format-entry. (bibtex-enclosing-entry-maybe-empty-head): Simplify. (bibtex-format-entry): Simplify. Handle new tag required-fields of bibtex-entry-format. (bibtex-autokey-abbrev): Accept negative values of len. (bibtex-autokey-get-field, bibtex-autokey-demangle-title): New funs. (bibtex-autokey-get-namefield, bibtex-autokey-get-namelist) (bibtex-autokey-get-yearfield-digits, bibtex-autokey-get-yearfield) (bibtex-autokey-get-titlestring): Remove. (bibtex-autokey-get-names): Simplify. (bibtex-autokey-get-titles): Rename to bibtex-autokey-get-title. (bibtex-autokey-demangle-name): Simplify, avoid error messages. (bibtex-generate-autokey): Simplify. (bibtex-parse-keys): Simplify, use push. (bibtex-parse-strings): New fun similar to bibtex-parse-keys. (bibtex-string-files-init): New fun. (bibtex-parse-buffers-stealthily): Use bibtex-parse-keys, bibtex-string-files-init and bibtex-parse-strings. (bibtex-complete): Rename to bibtex-complete-internal, use push, bibtex-reference-key-in-string, no sorting. (bibtex-complete-string-cleanup): New fun, displays expansion of completed strings. (bibtex-choose-completion-string): New fun. Required for choose-completion-string-functions. (bibtex-do-auto-fill): Remove. Set fill-prefix in bibtex-mode. (bibtex-pop): Simplify. (bibtex-mode): Move setting of bibtex-string to bibtex-parse-strings. Set choose-completion-string-functions. (bibtex-print-help-message,bibtex-make-field, bibtex-end-of-entry) (bibtex-count-entries): Simplify. (bibtex-entry-index, bibtex-lessp): New funs for generalized sorting scheme of indices, see bibtex-maintain-sorted-entries. (bibtex-sort-buffer): Use bibtex-lessp for sorting. (bibtex-find-crossref, bibtex-find-entry): New funs. (bibtex-find-entry-location): Rename to bibtex-prepare-new-entry, use bibtex-lessp, Simplify. (bibtex-validate): Simplify. Fixe bug of internal variable questionable-month. (bibtex-remove-OPT-or-ALT): Use when. (bibtex-remove-delimiters, bibtex-kill-field, bibtex-kill-entry) (bibtex-clean-entry, bibtex-fill-entry, bibtex-reformat): Simplify. (bibtex-convert-alien): Use deactivate-mark rather than the non-existent bibtex-mark-active variable. (bibtex-complete-string, bibtex-complete-key): Merge into new `smart' defun bibtex-complete. (bibtex-String): Update for new sorting scheme, distinguish empty and non-empty key strings.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Mon, 02 Jun 2003 22:30:09 +0000
parents 23a1cea22d13
children 695cf19ef79e d7ddb3e565de
line wrap: on
line source

/* $XConsortium: XMakeAssoc.c,v 10.18 91/01/06 12:09:28 rws Exp $ */
/* Copyright    Massachusetts Institute of Technology    1985	*/

/*
Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that
the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of M.I.T. not be used in advertising or
publicity pertaining to distribution of the software without specific,
written prior permission.  M.I.T. makes no representations about the
suitability of this software for any purpose.  It is provided "as is"
without express or implied warranty.
*/

#include <config.h>
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include "X10.h"
#include <errno.h>

#ifndef NULL
#define NULL 0
#endif

extern int errno;

void emacs_insque();
struct qelem {
	struct    qelem *q_forw;
	struct    qelem *q_back;
	char q_data[1];
};
/*
 * XMakeAssoc - Insert data into an XAssocTable keyed on an XId.
 * Data is inserted into the table only once.  Redundant inserts are
 * meaningless (but cause no problems).  The queue in each association
 * bucket is sorted (lowest XId to highest XId).
 */
XMakeAssoc(dpy, table, x_id, data)
	register Display *dpy;
	register XAssocTable *table;
	register XID x_id;
	register caddr_t data;
{
	int hash;
	register XAssoc *bucket;
	register XAssoc *Entry;
	register XAssoc *new_entry;

	/* Hash the XId to get the bucket number. */
	hash = x_id & (table->size - 1);
	/* Look up the bucket to get the entries in that bucket. */
	bucket = &table->buckets[hash];
	/* Get the first entry in the bucket. */
	Entry = bucket->next;

	/* If (Entry != bucket), the bucket is empty so make */
	/* the new entry the first entry in the bucket. */
	/* if (Entry == bucket), the we have to search the */
	/* bucket. */
	if (Entry != bucket) {
		/* The bucket isn't empty, begin searching. */
		/* If we leave the for loop then we have either passed */
		/* where the entry should be or hit the end of the bucket. */
		/* In either case we should then insert the new entry */
		/* before the current value of "Entry". */
		for (; Entry != bucket; Entry = Entry->next) {
			if (Entry->x_id == x_id) {
				/* Entry has the same XId... */
				if (Entry->display == dpy) {
					/* Entry has the same Display... */
					/* Therefore there is already an */
					/* entry with this XId and Display, */
					/* reset its data value and return. */
					Entry->data = data;
					return;
				}
				/* We found an association with the right */
				/* id but the wrong display! */
				continue;
			}
			/* If the current entry's XId is greater than the */
			/* XId of the entry to be inserted then we have */
			/* passed the location where the new XId should */
			/* be inserted. */
			if (Entry->x_id > x_id) break;
		}
        }

	/* If we are here then the new entry should be inserted just */
	/* before the current value of "Entry". */
	/* Create a new XAssoc and load it with new provided data. */
	new_entry = (XAssoc *) xmalloc(sizeof(XAssoc));
	new_entry->display = dpy;
	new_entry->x_id = x_id;
	new_entry->data = data;

	/* Insert the new entry. */
	emacs_insque((struct qelem *)new_entry, (struct qelem *)Entry->prev);
}