1/*	$NetBSD$	*/
2
3/* OpenLDAP: pkg/ldap/libraries/liblunicode/ucdata/ucpgba.h,v 1.8.2.5 2010/04/13 20:23:04 kurt Exp */
4/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 *
6 * Copyright 1998-2010 The OpenLDAP Foundation.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted only as authorized by the OpenLDAP
11 * Public License.
12 *
13 * A copy of this license is available in file LICENSE in the
14 * top-level directory of the distribution or, alternatively, at
15 * <http://www.OpenLDAP.org/license.html>.
16 */
17/* Copyright 1999 Computing Research Labs, New Mexico State University
18 *
19 * Permission is hereby granted, free of charge, to any person obtaining a
20 * copy of this software and associated documentation files (the "Software"),
21 * to deal in the Software without restriction, including without limitation
22 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
23 * and/or sell copies of the Software, and to permit persons to whom the
24 * Software is furnished to do so, subject to the following conditions:
25 *
26 * The above copyright notice and this permission notice shall be included in
27 * all copies or substantial portions of the Software.
28 *
29 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
32 * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
33 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
34 * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
35 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 */
37/* Id: ucpgba.h,v 1.4 1999/11/19 15:24:30 mleisher Exp */
38
39#ifndef _h_ucpgba
40#define _h_ucpgba
41
42#include "portable.h"
43
44LDAP_BEGIN_DECL
45
46/***************************************************************************
47 *
48 * Macros and types.
49 *
50 ***************************************************************************/
51
52/*
53 * These are the direction values that can appear in render runs and render
54 * strings.
55 */
56#define UCPGBA_LTR 0
57#define UCPGBA_RTL 1
58
59/*
60 * These are the flags for cursor motion.
61 */
62#define UCPGBA_CURSOR_VISUAL  0
63#define UCPGBA_CURSOR_LOGICAL 1
64
65/*
66 * This structure is used to contain runs of text in a particular direction.
67 */
68typedef struct _ucrun_t {
69    struct _ucrun_t *visual_prev;  /* Pointer to the previous visual run.    */
70    struct _ucrun_t *visual_next;  /* Pointer to the next visual run.        */
71
72    struct _ucrun_t *logical_prev; /* Pointer to the previous logical run.   */
73    struct _ucrun_t *logical_next; /* Pointer to the next logical run.       */
74
75    int direction;                 /* Direction of the run.                  */
76
77    long cursor;                   /* Position of "cursor" in the string.    */
78
79    unsigned long *chars;          /* List of characters for the run.        */
80    unsigned long *positions;      /* List of original positions in source.  */
81
82    unsigned long *source;         /* The source string.                     */
83    unsigned long start;           /* Beginning offset in the source string. */
84    unsigned long end;             /* Ending offset in the source string.    */
85} ucrun_t;
86
87/*
88 * This represents a string of runs rendered up to a point that is not
89 * platform specific.
90 */
91typedef struct _ucstring_t {
92    int direction;                /* Overall direction of the string.       */
93
94    int cursor_motion;            /* Logical or visual cursor motion flag.  */
95
96    ucrun_t *cursor;              /* The run containing the "cursor."       */
97
98    ucrun_t *logical_first;       /* First run in the logical order.        */
99    ucrun_t *logical_last;        /* Last run in the logical order.         */
100
101    ucrun_t *visual_first;        /* First run in the visual order.         */
102    ucrun_t *visual_last;         /* Last run in the visual order.          */
103
104    unsigned long *source;        /* The source string.                     */
105    unsigned long start;          /* The beginning offset in the source.    */
106    unsigned long end;            /* The ending offset in the source.       */
107} ucstring_t;
108
109/***************************************************************************
110 *
111 * API
112 *
113 ***************************************************************************/
114
115/*
116 * This creates and reorders the specified substring using the
117 * "Pretty Good Bidi Algorithm."  A default direction is provided for cases
118 * of a string containing no strong direction characters and the default
119 * cursor motion should be provided.
120 */
121LDAP_LUNICODE_F (ucstring_t *)
122ucstring_create LDAP_P((unsigned long *source,
123		        unsigned long start,
124		        unsigned long end,
125		        int default_direction,
126		        int cursor_motion));
127/*
128 * This releases the string.
129 */
130LDAP_LUNICODE_F (void) ucstring_free LDAP_P((ucstring_t *string));
131
132/*
133 * This changes the cursor motion flag for the string.
134 */
135LDAP_LUNICODE_F (int)
136ucstring_set_cursor_motion LDAP_P((ucstring_t *string,
137				   int cursor_motion));
138
139/*
140 * This function will move the cursor to the right depending on the
141 * type of cursor motion that was specified for the string.
142 *
143 * A 0 is returned if no cursor motion is performed, otherwise a
144 * 1 is returned.
145 */
146LDAP_LUNICODE_F (int)
147ucstring_cursor_right LDAP_P((ucstring_t *string, int count));
148
149/*
150 * This function will move the cursor to the left depending on the
151 * type of cursor motion that was specified for the string.
152 *
153 * A 0 is returned if no cursor motion is performed, otherwise a
154 * 1 is returned.
155 */
156LDAP_LUNICODE_F (int)
157ucstring_cursor_left LDAP_P((ucstring_t *string, int count));
158
159/*
160 * This routine retrieves the direction of the run containing the cursor
161 * and the actual position in the original text string.
162 */
163LDAP_LUNICODE_F (void)
164ucstring_cursor_info LDAP_P((ucstring_t *string, int *direction,
165			     unsigned long *position));
166
167LDAP_END_DECL
168
169#endif /* _h_ucpgba */
170