diff options
Diffstat (limited to 'Build/source/utils/xindy/rte/ordrules/ordrules.h')
-rw-r--r-- | Build/source/utils/xindy/rte/ordrules/ordrules.h | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/Build/source/utils/xindy/rte/ordrules/ordrules.h b/Build/source/utils/xindy/rte/ordrules/ordrules.h new file mode 100644 index 00000000000..6b5f1b48a77 --- /dev/null +++ b/Build/source/utils/xindy/rte/ordrules/ordrules.h @@ -0,0 +1,208 @@ +/* $Id: ordrules.h,v 1.9 2008/01/09 11:33:44 jschrod Exp $ + *---------------------------------------------------------------------- + * + * Ordering Rules for Strings + * + * [history at end] + */ + +#ifndef _ORDRULES_H +#define _ORDRULES_H + +#include <stdio.h> +#include "mkind.h" +#undef debug +#include "debug.h" +#include "regex.h" + +#define BEGIN 1 /* representation of '\b' */ +#define END 255 /* representation of '\e' */ + +/* values for RULE_TYPE */ +#define CHR_RULE 0001 +#define STR_RULE 0002 +#define REG_RULE 0004 +#define REJECT 0200 + +#define RULE_TYPE unsigned char + +/* structure representing a substitution rule */ +typedef struct rule { + + RULE_TYPE type; /* rule descriptor */ + + union { + + char chr; /* character transformation: 'chr1' --> 'chr2' */ + + struct { /* string substitution: 'str1' --> 'str2' */ + char *lside; + int llen; + char *rside; + int rlen; + } str; + + struct { /* regular expression rule: 'rexp' --> 'str' */ + regex_t *lside; + char *lstr; + char *rside; + char type; + } reg; + + } r; + + struct rule *next; /* link to next rule */ + +} RULE; + +/* RULE_LIST is a linked list of RULE's with a pointer to the last entry, + which allows efficient appending of new rules. */ +typedef struct { + RULE *first; + RULE *last; +} RULE_LIST; + +/* RULE_TABLE is a table of RULE_LIST's, where at position 'c' it contains + rules that could match strings beginning with character 'c'. The + last position (FORALL_POS) in this table has a special meaning. It stands for + regular expression rules that begin with a character class and + therefore they should be matched against all strings. + + RULE_TABLE[c] rules in this list: 'cxxxxx' --> 'foo' + RULE_TABLE[FORALL_POS] rules in this list: '[y-z]xxxx' --> 'foo' + +*/ + +#define MAX_RULE_TABLE 257 /* # entries in a rule table */ +#define FORALL_POS 256 /* position of regexp rules, that must be applied to all strings */ + +typedef RULE_LIST RULE_TABLE[MAX_RULE_TABLE]; + +extern RULE_TABLE* SortRules; /* rules for generating sortkeys */ +extern RULE_TABLE MergeRules; /* rules for generating mergekeys */ + +typedef struct grouprule { + short id; /* group id */ + char *let; /* sortkey prefix */ + int len; /* len(let) */ + struct grouprule *next; /* link to next rule */ +} GROUP_RULE; + +typedef struct { + GROUP_RULE *first; + GROUP_RULE *last; +} GROUP_LIST; + +extern GROUP_LIST GroupList; /* list of character groups */ +extern GROUP_LIST HeadingList; /* list of group headings */ + +/* These variables are used in ordrulei.lsp. The generated code, in + ordrulei.c uses sizeof() on them, thus the buffer size must be + defined. */ +#define BUFLEN ((size_t)1024) +extern char ordrules_string_buffer[BUFLEN]; +extern int ordrules_string_buffer_used_bytes; +extern int ordrules_msg_logging; +extern char* ordrules_msg_buffer; +extern int ordrules_msg_buffer_ptr; + + +#define add_group_rule(letter, group) \ + add_group( &GroupList, group, letter ) + +#define add_heading(group, head) \ + add_group( &HeadingList, group, head ) + +int initialize PROTO(( int num_sort_tables )); +int open_debug_file PROTO(( char* filename )); +int close_debug_file PROTO(( )); + +int get_group PROTO(( char *sortkey )); +char *get_heading PROTO(( int group )); + +int add_rule PROTO(( RULE_TABLE table, char *left, char *right, + int isreject, int ruletype, int run )); +void apply_rules PROTO(( RULE_TABLE table, char *source, char *dest, size_t buflen )); +void add_group PROTO(( GROUP_LIST *list, int group, char *letter )); + +int add_sort_rule PROTO((int run, char *left, char *right, int isreject, int ruletype)); +int add_merge_rule PROTO((char *left, char *right, int isreject, int ruletype)); + +char* gen_sortkey PROTO((char *key, int run)); +char* gen_mergekey PROTO((char *key)); + +#endif /* _ORDRULES_H */ + + +/*====================================================================== + * + * $Log: ordrules.h,v $ + * Revision 1.9 2008/01/09 11:33:44 jschrod + * Update to CLISP 2.43. + * + * Revision 1.8 2005/06/14 11:22:04 jschrod + * ordrulei.lisp is now ordrulei.lsp in distribution, as it is in CVS. + * + * Revision 1.7 2005/05/02 21:39:53 jschrod + * xindy run time engine 3.0; as used for CLISP 2.33.2. + * + * Revision 1.6 1999/07/30 08:37:38 kehr + * Intermediate checkin. + * + * Revision 1.5 1997/10/20 11:23:14 kehr + * New version of sorting rules. Sorting of more complex indexes (i.e. + * French) is now possible. + * + * Revision 1.4 1997/01/17 16:43:42 kehr + * Several changes for new version 1.1. + * + * Revision 1.3 1996/07/18 15:56:42 kehr + * Checkin after all changes that resulted from the define-letter-group + * modification were finished. Additionally I found an ugly bug in the + * ordrules.c file that was discovered when running the system under + * Solaris (which seems to have signed chars..Whee!). This is fixed now + * and the Imakefiles and that stuff was improved, too. + * + * Revision 1.2 1996/03/27 20:29:11 kehr + * It works. Today I had my first success in getting the FFI running with + * the ordrules-library. The interface is defined in `ordrulei.lsp' and + * allows direct access to the functions in `ordrules.c'. + * + * Revision 1.1 1996/03/26 17:31:00 kehr + * First check-in of the rx-support for clisp. + * + * Revision 1.8 1991/12/16 14:47:04 schrod + * updated documentation + * + * Revision 1.7 1991/12/10 20:25:53 schrod + * Changed all function declarations to ANSI prototypes using ARGS(). + * + * Revision 1.6 1991/12/10 20:10:02 schrod + * Reject-rules (*merge_rule and *sort_rule) implemented. + * + * Revision 1.5 1991/12/10 19:59:57 schrod + * Fixed bug in ordrules. Inserting a new group rule at the beginning of + * a rule list works not with groups, that have the same prefix: + * + * group_rule "ae" 1 + * group_rule "a" 2 + * + * would put 'aexxx' in group 2. + * + * Revision 1.4 1991/12/10 19:50:03 schrod + * Optimized group-rule handling. + * + * Revision 1.3 1991/12/10 19:43:42 schrod + * Optimized module 'ordrules': + * - all three types of rules (chr,str,regexp) now allowed for both sort + * and merge keys + * + * Revision 1.2 1991/12/10 19:20:35 schrod + * Changed the group merging algorithm to create the group-id of an index key + * using user defined rules (specified in the style file with commands: + * `sort_group' and `group_head') instead of the sortkey's first character. + * + * Revision 1.1 1991/12/10 17:15:58 schrod + * Initial revision + * + */ |