diff options
Diffstat (limited to 'xc/doc/specs/PEX5/PEX5.1/SI/build_ind.c')
-rw-r--r-- | xc/doc/specs/PEX5/PEX5.1/SI/build_ind.c | 343 |
1 files changed, 0 insertions, 343 deletions
diff --git a/xc/doc/specs/PEX5/PEX5.1/SI/build_ind.c b/xc/doc/specs/PEX5/PEX5.1/SI/build_ind.c deleted file mode 100644 index e70434368..000000000 --- a/xc/doc/specs/PEX5/PEX5.1/SI/build_ind.c +++ /dev/null @@ -1,343 +0,0 @@ -/* $XConsortium: build_ind.c,v 5.2 94/04/17 20:05:30 rws Exp $ */ - -/*********************************************************** - -Copyright (c) 1990, 1991 X Consortium - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of the X Consortium shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from the X Consortium. - -Copyright (c) 1990, 1991 by Sun Microsystems, Inc. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -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 names of Sun Microsystems, -and the X Consortium, not be used in advertising or publicity -pertaining to distribution of the software without specific, written -prior permission. - -SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT -SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -******************************************************************/ - -#include <ctype.h> -#include <stdio.h> -#include "indexer.h" - -struct index_entry *root; - -/* insert_page_entry places a new page number structure into the - specified index node. */ - -insert_page_entry(node, page) - struct index_entry *node; - struct page_entry *page; -{ - - - struct page_entry *temp; - - page->next_page = NULL; - - /* If there are no pages in the index node at this time we - just insert the new entry and return */ - if (node->last_page == NULL) { - node->last_page = page; - node->page_entry = page; - return; - } - /* This is a new page entry to be added to a list of existing - page entries. We have to do some consistency checks */ - /* Eliminate duplicate page numbers */ - if (page->page_type == PAGE_NORMAL) { - for (temp = node->page_entry; temp != NULL; temp = temp->next_page) { - if (temp->page_type == PAGE_NORMAL || - temp->page_type == PAGE_MAJOR) - if (strcmp(temp->page_number, page->page_number) == 0) { - free (page); - return; - } - } - } - /* There should be only one major entry per reference */ - if (page->page_type == PAGE_MAJOR) { - for (temp = node->page_entry; temp != NULL; temp = temp->next_page) { - if (temp->page_type == PAGE_MAJOR) - fprintf(stderr, - "%s: Page number on line %d -- duplicate major reference\n", - command_name, line_number); - } - /* Place major entries in front */ - page->next_page = node->page_entry; - node->page_entry = page; - return; - } - /* Start and end of range should follow one after the other */ - if ((node->last_page->page_type == PAGE_START && page->page_type != PAGE_END) || - (node->last_page->page_type != PAGE_START && page->page_type == PAGE_END)) { - fprintf(stderr, "%s: Page range on line %d must be contiguous\n", - command_name, line_number); - node->last_page->page_type = PAGE_NORMAL; - page->page_type = PAGE_NORMAL; - node->last_page->next_page = page; - node->last_page = page; - return; - } - /* Just an ordinary page entry -- insert it */ - node->last_page->next_page = page; - node->last_page = page; -} - - -/* insert_index_entry inserts a new index entry at its correct place in - the tree of index entries and returns the address of the node - corresponding to the entry inserted. */ - -struct index_entry * -insert_index_entry(node, entry) - struct index_entry *node; - struct index_entry *entry; -{ - - int result; - int level; - - result = compare_entry(node, entry); - - if (result == 0) { /* exact match */ - /* Place the page entry for the duplicate */ - /* into the list of pages for this node */ - insert_page_entry(node, entry->page_entry); - free(entry); - return(node); - } - - if (result > 0) /* node greater than new entry -- */ - /* move to lesser nodes */ - if (node->lesser != NULL) - insert_index_entry(node->lesser, entry); - else { - node->lesser = entry; - return (node->lesser); - } - else /* node less than new entry -- */ - /* move to greater nodes */ - if (node->greater != NULL) - insert_index_entry(node->greater, entry); - else { - node->greater = entry; - return (node->greater); - } -} - - -/* compare_entry compares two index entries. compare_entry returns - 0 for an exact match, < 0 for entry_1 < entry_2, and > 0 for - entry_1 > entry_2. Null entries are considered less than non-null - entries. */ - -int -compare_entry(entry_1, entry_2) - struct index_entry *entry_1; - struct index_entry *entry_2; -{ - int level; - int result; - - for (level = 0; level < LEVELS; level++) { - result = compare_strings(entry_1->terms[level], - entry_2->terms[level]); - if (result != 0) - return(result); - } - return (0); /* exact match */ -} - - -/* - * compare_terms compares the collating terms of two index entries. - * compare_terms returns: - * 0 for an exact match, - * < 0 for entry_1 < entry_2, - * > 0 for entry_1 > entry_2. - * - * Null entries are considered less than non-null entries. -*/ - -int -compare_terms(entry_1, entry_2) - struct index_entry *entry_1; - struct index_entry *entry_2; -{ - int level; - int result; - - for (level = 0; level < LEVELS; level++) { - result = compare_strings(entry_1->terms[level], - entry_2->terms[level]); - if (result != 0) - return(result); - } - return (0); /* exact match */ -} - - -/* compare_prints compares the printing terms of two index entries. - * compare_prints returns: - * 0 for an exact match, - * 1 for different -*/ - -/* int -compare_prints(entry_1, entry_2) - struct print_entry *entry_1; - struct print_entry *entry_2; -{ - int level; - int result; - - for (level = 0; level < LEVELS; level++) { - if (entry_1->print_field[level] == NULL && - entry_2->print_field[level] == NULL) - continue; - if (entry_1->print_field[level] == NULL && - entry_2->print_field[level] != NULL) - return(1); - if (entry_1->print_field[level] != NULL && - entry_2->print_field[level] == NULL) - return(1); - if (strcmp(entry_1->print_field[level], - entry_2->print_field[level]) 1= 0) - return(1); - } - return (0); -} */ - - - - - -/* compare_strings compares the two strings passed as arguments, with the - following extra constraints: - . lower-case letters and upper-case letters are considered the same. - . Punctuation characters come to the front of the collating sequence. - . A shorter string is considered extended with spaces. - - compare_strings returns: 0 if string_1 is equal to string_2, - -1 if string_1 is less than string_2, - +1 if string_1 is greater than string_2 */ - -int -compare_strings(string_1, string_2) - char *string_1; - char *string_2; -{ - int length_1; /* length of first string */ - int length_2; /* length of second string */ - int pos_1; /* character position in string_1 */ - int pos_2; /* character position in string_2 */ - char char_1; /* character from string_1 */ - char char_2; /* character from string_2 */ - - /* first check for null strings */ - if (string_1 == NULL && string_2 == NULL) - return(0); - if (string_1 == NULL && string_2 != NULL) - return(-1); - if (string_1 != NULL && string_2 == NULL) - return(1); - /* Exact match just returns straight away */ - if (strcmp(string_1, string_2) == 0) - return(0); - - length_1 = strlen(string_1); - length_2 = strlen(string_2); - /* check for zero-length strings */ - if (length_1 == 0 && length_2 == 0) - return(0); - if (length_1 == 0 && length_2 != 0) - return(-1); - if (length_1 != 0 && length_2 == 0) - return(1); - - pos_1 = pos_2 = 0; - while (TRUE) { - if (pos_1 >= length_1) - char_1 = ' '; - else - char_1 = string_1[pos_1]; - char_1 = isupper(char_1) ? tolower(char_1) : char_1; - - if (pos_2 >= length_2) - char_2 = ' '; - else - char_2 = string_2[pos_2]; - char_2 = isupper(char_2) ? tolower(char_2) : char_2; - - /* First test alphanumerics */ - if (isalnum(char_1) && isalnum(char_2)) { - if (char_1 > char_2) - return(1); - if (char_1 < char_2) - return(-1); - } - - /* Alphanumerics collate higher than punctuation */ - if (isalnum(char_1) && ispunct(char_2)) - return(1); - if (ispunct(char_1) && isalnum(char_2)) - return(-1); - - /* Punctuation collates among itself */ - if (ispunct(char_1) && ispunct(char_2)) { - if (char_1 > char_2) - return(1); - if (char_1 < char_2) - return(-1); - } - - /* Spaces collate lower than anything else */ - if (char_1 > char_2) - return(1); - if (char_1 < char_2) - return(-1); - - if (pos_1 >= length_1 && pos_2 >= length_2) - break; - pos_1++; - pos_2++; - } - if (char_1 > char_2) - return(1); - if (char_1 < char_2) - return(-1); - return(0); /* Should not happen */ -} |