1 /*
2 *******************************************************************************
3 *   Copyright (C) 1997-2011,2014-2015 International Business Machines
4 *   Corporation and others.  All Rights Reserved.
5 *******************************************************************************
6 *   Date        Name        Description
7 *   06/21/00    aliu        Creation.
8 *******************************************************************************
9 */
10 
11 #ifndef UTRANS_H
12 #define UTRANS_H
13 
14 #include "unicode/utypes.h"
15 
16 #if !UCONFIG_NO_TRANSLITERATION
17 
18 #include "unicode/localpointer.h"
19 #include "unicode/urep.h"
20 #include "unicode/parseerr.h"
21 #include "unicode/uenum.h"
22 #include "unicode/uset.h"
23 
24 /********************************************************************
25  * General Notes
26  ********************************************************************
27  */
28 /**
29  * \file
30  * \brief C API: Transliterator
31  *
32  * <h2> Transliteration </h2>
33  * The data structures and functions described in this header provide
34  * transliteration services.  Transliteration services are implemented
35  * as C++ classes.  The comments and documentation in this header
36  * assume the reader is familiar with the C++ headers translit.h and
37  * associated documentation.
38  *
39  * A significant but incomplete subset of the C++ transliteration
40  * services are available to C code through this header.  In order to
41  * access more complex transliteration services, refer to the C++
42  * headers and documentation.
43  *
44  * There are two sets of functions for working with transliterator IDs:
45  *
46  * An old, deprecated set uses char * IDs, which works for true and pure
47  * identifiers that these APIs were designed for,
48  * for example "Cyrillic-Latin".
49  * It does not work when the ID contains filters ("[:Script=Cyrl:]")
50  * or even a complete set of rules because then the ID string contains more
51  * than just "invariant" characters (see utypes.h).
52  *
53  * A new set of functions replaces the old ones and uses UChar * IDs,
54  * paralleling the UnicodeString IDs in the C++ API. (New in ICU 2.8.)
55  */
56 
57 /********************************************************************
58  * Data Structures
59  ********************************************************************/
60 
61 /**
62  * An opaque transliterator for use in C.  Open with utrans_openxxx()
63  * and close with utrans_close() when done.  Equivalent to the C++ class
64  * Transliterator and its subclasses.
65  * @see Transliterator
66  * @stable ICU 2.0
67  */
68 typedef void* UTransliterator;
69 
70 /**
71  * Direction constant indicating the direction in a transliterator,
72  * e.g., the forward or reverse rules of a RuleBasedTransliterator.
73  * Specified when a transliterator is opened.  An "A-B" transliterator
74  * transliterates A to B when operating in the forward direction, and
75  * B to A when operating in the reverse direction.
76  * @stable ICU 2.0
77  */
78 typedef enum UTransDirection {
79 
80     /**
81      * UTRANS_FORWARD means from &lt;source&gt; to &lt;target&gt; for a
82      * transliterator with ID &lt;source&gt;-&lt;target&gt;.  For a transliterator
83      * opened using a rule, it means forward direction rules, e.g.,
84      * "A > B".
85      */
86     UTRANS_FORWARD,
87 
88     /**
89      * UTRANS_REVERSE means from &lt;target&gt; to &lt;source&gt; for a
90      * transliterator with ID &lt;source&gt;-&lt;target&gt;.  For a transliterator
91      * opened using a rule, it means reverse direction rules, e.g.,
92      * "A < B".
93      */
94     UTRANS_REVERSE
95 
96 } UTransDirection;
97 
98 /**
99  * Position structure for utrans_transIncremental() incremental
100  * transliteration.  This structure defines two substrings of the text
101  * being transliterated.  The first region, [contextStart,
102  * contextLimit), defines what characters the transliterator will read
103  * as context.  The second region, [start, limit), defines what
104  * characters will actually be transliterated.  The second region
105  * should be a subset of the first.
106  *
107  * <p>After a transliteration operation, some of the indices in this
108  * structure will be modified.  See the field descriptions for
109  * details.
110  *
111  * <p>contextStart <= start <= limit <= contextLimit
112  *
113  * <p>Note: All index values in this structure must be at code point
114  * boundaries.  That is, none of them may occur between two code units
115  * of a surrogate pair.  If any index does split a surrogate pair,
116  * results are unspecified.
117  *
118  * @stable ICU 2.0
119  */
120 typedef struct UTransPosition {
121 
122     /**
123      * Beginning index, inclusive, of the context to be considered for
124      * a transliteration operation.  The transliterator will ignore
125      * anything before this index.  INPUT/OUTPUT parameter: This parameter
126      * is updated by a transliteration operation to reflect the maximum
127      * amount of antecontext needed by a transliterator.
128      * @stable ICU 2.4
129      */
130     int32_t contextStart;
131 
132     /**
133      * Ending index, exclusive, of the context to be considered for a
134      * transliteration operation.  The transliterator will ignore
135      * anything at or after this index.  INPUT/OUTPUT parameter: This
136      * parameter is updated to reflect changes in the length of the
137      * text, but points to the same logical position in the text.
138      * @stable ICU 2.4
139      */
140     int32_t contextLimit;
141 
142     /**
143      * Beginning index, inclusive, of the text to be transliteratd.
144      * INPUT/OUTPUT parameter: This parameter is advanced past
145      * characters that have already been transliterated by a
146      * transliteration operation.
147      * @stable ICU 2.4
148      */
149     int32_t start;
150 
151     /**
152      * Ending index, exclusive, of the text to be transliteratd.
153      * INPUT/OUTPUT parameter: This parameter is updated to reflect
154      * changes in the length of the text, but points to the same
155      * logical position in the text.
156      * @stable ICU 2.4
157      */
158     int32_t limit;
159 
160 } UTransPosition;
161 
162 /********************************************************************
163  * General API
164  ********************************************************************/
165 
166 /**
167  * Open a custom transliterator, given a custom rules string
168  * OR
169  * a system transliterator, given its ID.
170  * Any non-NULL result from this function should later be closed with
171  * utrans_close().
172  *
173  * @param id a valid transliterator ID
174  * @param idLength the length of the ID string, or -1 if NUL-terminated
175  * @param dir the desired direction
176  * @param rules the transliterator rules.  See the C++ header rbt.h for
177  *              rules syntax. If NULL then a system transliterator matching
178  *              the ID is returned.
179  * @param rulesLength the length of the rules, or -1 if the rules
180  *                    are NUL-terminated.
181  * @param parseError a pointer to a UParseError struct to receive the details
182  *                   of any parsing errors. This parameter may be NULL if no
183  *                   parsing error details are desired.
184  * @param pErrorCode a pointer to the UErrorCode
185  * @return a transliterator pointer that may be passed to other
186  *         utrans_xxx() functions, or NULL if the open call fails.
187  * @stable ICU 2.8
188  */
189 U_STABLE UTransliterator* U_EXPORT2
190 utrans_openU(const UChar *id,
191              int32_t idLength,
192              UTransDirection dir,
193              const UChar *rules,
194              int32_t rulesLength,
195              UParseError *parseError,
196              UErrorCode *pErrorCode);
197 
198 /**
199  * Open an inverse of an existing transliterator.  For this to work,
200  * the inverse must be registered with the system.  For example, if
201  * the Transliterator "A-B" is opened, and then its inverse is opened,
202  * the result is the Transliterator "B-A", if such a transliterator is
203  * registered with the system.  Otherwise the result is NULL and a
204  * failing UErrorCode is set.  Any non-NULL result from this function
205  * should later be closed with utrans_close().
206  *
207  * @param trans the transliterator to open the inverse of.
208  * @param status a pointer to the UErrorCode
209  * @return a pointer to a newly-opened transliterator that is the
210  * inverse of trans, or NULL if the open call fails.
211  * @stable ICU 2.0
212  */
213 U_STABLE UTransliterator* U_EXPORT2
214 utrans_openInverse(const UTransliterator* trans,
215                    UErrorCode* status);
216 
217 /**
218  * Create a copy of a transliterator.  Any non-NULL result from this
219  * function should later be closed with utrans_close().
220  *
221  * @param trans the transliterator to be copied.
222  * @param status a pointer to the UErrorCode
223  * @return a transliterator pointer that may be passed to other
224  * utrans_xxx() functions, or NULL if the clone call fails.
225  * @stable ICU 2.0
226  */
227 U_STABLE UTransliterator* U_EXPORT2
228 utrans_clone(const UTransliterator* trans,
229              UErrorCode* status);
230 
231 /**
232  * Close a transliterator.  Any non-NULL pointer returned by
233  * utrans_openXxx() or utrans_clone() should eventually be closed.
234  * @param trans the transliterator to be closed.
235  * @stable ICU 2.0
236  */
237 U_STABLE void U_EXPORT2
238 utrans_close(UTransliterator* trans);
239 
240 #if U_SHOW_CPLUSPLUS_API
241 
242 U_NAMESPACE_BEGIN
243 
244 /**
245  * \class LocalUTransliteratorPointer
246  * "Smart pointer" class, closes a UTransliterator via utrans_close().
247  * For most methods see the LocalPointerBase base class.
248  *
249  * @see LocalPointerBase
250  * @see LocalPointer
251  * @stable ICU 4.4
252  */
253 U_DEFINE_LOCAL_OPEN_POINTER(LocalUTransliteratorPointer, UTransliterator, utrans_close);
254 
255 U_NAMESPACE_END
256 
257 #endif
258 
259 /**
260  * Return the programmatic identifier for this transliterator.
261  * If this identifier is passed to utrans_openU(), it will open
262  * a transliterator equivalent to this one, if the ID has been
263  * registered.
264  *
265  * @param trans the transliterator to return the ID of.
266  * @param resultLength pointer to an output variable receiving the length
267  *        of the ID string; can be NULL
268  * @return the NUL-terminated ID string. This pointer remains
269  * valid until utrans_close() is called on this transliterator.
270  *
271  * @stable ICU 2.8
272  */
273 U_STABLE const UChar * U_EXPORT2
274 utrans_getUnicodeID(const UTransliterator *trans,
275                     int32_t *resultLength);
276 
277 /**
278  * Register an open transliterator with the system.  When
279  * utrans_open() is called with an ID string that is equal to that
280  * returned by utrans_getID(adoptedTrans,...), then
281  * utrans_clone(adoptedTrans,...) is returned.
282  *
283  * <p>NOTE: After this call the system owns the adoptedTrans and will
284  * close it.  The user must not call utrans_close() on adoptedTrans.
285  *
286  * @param adoptedTrans a transliterator, typically the result of
287  * utrans_openRules(), to be registered with the system.
288  * @param status a pointer to the UErrorCode
289  * @stable ICU 2.0
290  */
291 U_STABLE void U_EXPORT2
292 utrans_register(UTransliterator* adoptedTrans,
293                 UErrorCode* status);
294 
295 /**
296  * Unregister a transliterator from the system.  After this call the
297  * system will no longer recognize the given ID when passed to
298  * utrans_open(). If the ID is invalid then nothing is done.
299  *
300  * @param id an ID to unregister
301  * @param idLength the length of id, or -1 if id is zero-terminated
302  * @stable ICU 2.8
303  */
304 U_STABLE void U_EXPORT2
305 utrans_unregisterID(const UChar* id, int32_t idLength);
306 
307 /**
308  * Set the filter used by a transliterator.  A filter can be used to
309  * make the transliterator pass certain characters through untouched.
310  * The filter is expressed using a UnicodeSet pattern.  If the
311  * filterPattern is NULL or the empty string, then the transliterator
312  * will be reset to use no filter.
313  *
314  * @param trans the transliterator
315  * @param filterPattern a pattern string, in the form accepted by
316  * UnicodeSet, specifying which characters to apply the
317  * transliteration to.  May be NULL or the empty string to indicate no
318  * filter.
319  * @param filterPatternLen the length of filterPattern, or -1 if
320  * filterPattern is zero-terminated
321  * @param status a pointer to the UErrorCode
322  * @see UnicodeSet
323  * @stable ICU 2.0
324  */
325 U_STABLE void U_EXPORT2
326 utrans_setFilter(UTransliterator* trans,
327                  const UChar* filterPattern,
328                  int32_t filterPatternLen,
329                  UErrorCode* status);
330 
331 /**
332  * Return the number of system transliterators.
333  * It is recommended to use utrans_openIDs() instead.
334  *
335  * @return the number of system transliterators.
336  * @stable ICU 2.0
337  */
338 U_STABLE int32_t U_EXPORT2
339 utrans_countAvailableIDs(void);
340 
341 /**
342  * Return a UEnumeration for the available transliterators.
343  *
344  * @param pErrorCode Pointer to the UErrorCode in/out parameter.
345  * @return UEnumeration for the available transliterators.
346  *         Close with uenum_close().
347  *
348  * @stable ICU 2.8
349  */
350 U_STABLE UEnumeration * U_EXPORT2
351 utrans_openIDs(UErrorCode *pErrorCode);
352 
353 /********************************************************************
354  * Transliteration API
355  ********************************************************************/
356 
357 /**
358  * Transliterate a segment of a UReplaceable string.  The string is
359  * passed in as a UReplaceable pointer rep and a UReplaceableCallbacks
360  * function pointer struct repFunc.  Functions in the repFunc struct
361  * will be called in order to modify the rep string.
362  *
363  * @param trans the transliterator
364  * @param rep a pointer to the string.  This will be passed to the
365  * repFunc functions.
366  * @param repFunc a set of function pointers that will be used to
367  * modify the string pointed to by rep.
368  * @param start the beginning index, inclusive; <code>0 <= start <=
369  * limit</code>.
370  * @param limit pointer to the ending index, exclusive; <code>start <=
371  * limit <= repFunc->length(rep)</code>.  Upon return, *limit will
372  * contain the new limit index.  The text previously occupying
373  * <code>[start, limit)</code> has been transliterated, possibly to a
374  * string of a different length, at <code>[start,
375  * </code><em>new-limit</em><code>)</code>, where <em>new-limit</em>
376  * is the return value.
377  * @param status a pointer to the UErrorCode
378  * @stable ICU 2.0
379  */
380 U_STABLE void U_EXPORT2
381 utrans_trans(const UTransliterator* trans,
382              UReplaceable* rep,
383              UReplaceableCallbacks* repFunc,
384              int32_t start,
385              int32_t* limit,
386              UErrorCode* status);
387 
388 /**
389  * Transliterate the portion of the UReplaceable text buffer that can
390  * be transliterated unambiguosly.  This method is typically called
391  * after new text has been inserted, e.g. as a result of a keyboard
392  * event.  The transliterator will try to transliterate characters of
393  * <code>rep</code> between <code>index.cursor</code> and
394  * <code>index.limit</code>.  Characters before
395  * <code>index.cursor</code> will not be changed.
396  *
397  * <p>Upon return, values in <code>index</code> will be updated.
398  * <code>index.start</code> will be advanced to the first
399  * character that future calls to this method will read.
400  * <code>index.cursor</code> and <code>index.limit</code> will
401  * be adjusted to delimit the range of text that future calls to
402  * this method may change.
403  *
404  * <p>Typical usage of this method begins with an initial call
405  * with <code>index.start</code> and <code>index.limit</code>
406  * set to indicate the portion of <code>text</code> to be
407  * transliterated, and <code>index.cursor == index.start</code>.
408  * Thereafter, <code>index</code> can be used without
409  * modification in future calls, provided that all changes to
410  * <code>text</code> are made via this method.
411  *
412  * <p>This method assumes that future calls may be made that will
413  * insert new text into the buffer.  As a result, it only performs
414  * unambiguous transliterations.  After the last call to this method,
415  * there may be untransliterated text that is waiting for more input
416  * to resolve an ambiguity.  In order to perform these pending
417  * transliterations, clients should call utrans_trans() with a start
418  * of index.start and a limit of index.end after the last call to this
419  * method has been made.
420  *
421  * @param trans the transliterator
422  * @param rep a pointer to the string.  This will be passed to the
423  * repFunc functions.
424  * @param repFunc a set of function pointers that will be used to
425  * modify the string pointed to by rep.
426  * @param pos a struct containing the start and limit indices of the
427  * text to be read and the text to be transliterated
428  * @param status a pointer to the UErrorCode
429  * @stable ICU 2.0
430  */
431 U_STABLE void U_EXPORT2
432 utrans_transIncremental(const UTransliterator* trans,
433                         UReplaceable* rep,
434                         UReplaceableCallbacks* repFunc,
435                         UTransPosition* pos,
436                         UErrorCode* status);
437 
438 /**
439  * Transliterate a segment of a UChar* string.  The string is passed
440  * in in a UChar* buffer.  The string is modified in place.  If the
441  * result is longer than textCapacity, it is truncated.  The actual
442  * length of the result is returned in *textLength, if textLength is
443  * non-NULL. *textLength may be greater than textCapacity, but only
444  * textCapacity UChars will be written to *text, including the zero
445  * terminator.
446  *
447  * @param trans the transliterator
448  * @param text a pointer to a buffer containing the text to be
449  * transliterated on input and the result text on output.
450  * @param textLength a pointer to the length of the string in text.
451  * If the length is -1 then the string is assumed to be
452  * zero-terminated.  Upon return, the new length is stored in
453  * *textLength.  If textLength is NULL then the string is assumed to
454  * be zero-terminated.
455  * @param textCapacity a pointer to the length of the text buffer.
456  * Upon return,
457  * @param start the beginning index, inclusive; <code>0 <= start <=
458  * limit</code>.
459  * @param limit pointer to the ending index, exclusive; <code>start <=
460  * limit <= repFunc->length(rep)</code>.  Upon return, *limit will
461  * contain the new limit index.  The text previously occupying
462  * <code>[start, limit)</code> has been transliterated, possibly to a
463  * string of a different length, at <code>[start,
464  * </code><em>new-limit</em><code>)</code>, where <em>new-limit</em>
465  * is the return value.
466  * @param status a pointer to the UErrorCode
467  * @stable ICU 2.0
468  */
469 U_STABLE void U_EXPORT2
470 utrans_transUChars(const UTransliterator* trans,
471                    UChar* text,
472                    int32_t* textLength,
473                    int32_t textCapacity,
474                    int32_t start,
475                    int32_t* limit,
476                    UErrorCode* status);
477 
478 /**
479  * Transliterate the portion of the UChar* text buffer that can be
480  * transliterated unambiguosly.  See utrans_transIncremental().  The
481  * string is passed in in a UChar* buffer.  The string is modified in
482  * place.  If the result is longer than textCapacity, it is truncated.
483  * The actual length of the result is returned in *textLength, if
484  * textLength is non-NULL. *textLength may be greater than
485  * textCapacity, but only textCapacity UChars will be written to
486  * *text, including the zero terminator.  See utrans_transIncremental()
487  * for usage details.
488  *
489  * @param trans the transliterator
490  * @param text a pointer to a buffer containing the text to be
491  * transliterated on input and the result text on output.
492  * @param textLength a pointer to the length of the string in text.
493  * If the length is -1 then the string is assumed to be
494  * zero-terminated.  Upon return, the new length is stored in
495  * *textLength.  If textLength is NULL then the string is assumed to
496  * be zero-terminated.
497  * @param textCapacity the length of the text buffer
498  * @param pos a struct containing the start and limit indices of the
499  * text to be read and the text to be transliterated
500  * @param status a pointer to the UErrorCode
501  * @see utrans_transIncremental
502  * @stable ICU 2.0
503  */
504 U_STABLE void U_EXPORT2
505 utrans_transIncrementalUChars(const UTransliterator* trans,
506                               UChar* text,
507                               int32_t* textLength,
508                               int32_t textCapacity,
509                               UTransPosition* pos,
510                               UErrorCode* status);
511 
512 /**
513  * Create a rule string that can be passed to utrans_openU to recreate this
514  * transliterator.
515  *
516  * @param trans     The transliterator
517  * @param escapeUnprintable if TRUE then convert unprintable characters to their
518  *                  hex escape representations, \\uxxxx or \\Uxxxxxxxx.
519  *                  Unprintable characters are those other than
520  *                  U+000A, U+0020..U+007E.
521  * @param result    A pointer to a buffer to receive the rules.
522  * @param resultLength The maximum size of result.
523  * @param status    A pointer to the UErrorCode. In case of error status, the
524  *                  contents of result are undefined.
525  * @return int32_t   The length of the rule string (may be greater than resultLength,
526  *                  in which case an error is returned).
527  * @stable ICU 53
528  */
529 U_STABLE int32_t U_EXPORT2
530 utrans_toRules(     const UTransliterator* trans,
531                     UBool escapeUnprintable,
532                     UChar* result, int32_t resultLength,
533                     UErrorCode* status);
534 
535 /**
536  * Returns the set of all characters that may be modified in the input text by
537  * this UTransliterator, optionally ignoring the transliterator's current filter.
538  * @param trans     The transliterator.
539  * @param ignoreFilter If FALSE, the returned set incorporates the
540  *                  UTransliterator's current filter; if the filter is changed,
541  *                  the return value of this function will change. If TRUE, the
542  *                  returned set ignores the effect of the UTransliterator's
543  *                  current filter.
544  * @param fillIn    Pointer to a USet object to receive the modifiable characters
545  *                  set. Previous contents of fillIn are lost. <em>If fillIn is
546  *                  NULL, then a new USet is created and returned. The caller
547  *                  owns the result and must dispose of it by calling uset_close.</em>
548  * @param status    A pointer to the UErrorCode.
549  * @return USet*    Either fillIn, or if fillIn is NULL, a pointer to a
550  *                  newly-allocated USet that the user must close. In case of
551  *                  error, NULL is returned.
552  * @stable ICU 53
553  */
554 U_STABLE USet* U_EXPORT2
555 utrans_getSourceSet(const UTransliterator* trans,
556                     UBool ignoreFilter,
557                     USet* fillIn,
558                     UErrorCode* status);
559 
560 /* deprecated API ----------------------------------------------------------- */
561 
562 #ifndef U_HIDE_DEPRECATED_API
563 
564 /* see utrans.h documentation for why these functions are deprecated */
565 
566 /**
567  * Deprecated, use utrans_openU() instead.
568  * Open a custom transliterator, given a custom rules string
569  * OR
570  * a system transliterator, given its ID.
571  * Any non-NULL result from this function should later be closed with
572  * utrans_close().
573  *
574  * @param id a valid ID, as returned by utrans_getAvailableID()
575  * @param dir the desired direction
576  * @param rules the transliterator rules.  See the C++ header rbt.h
577  * for rules syntax. If NULL then a system transliterator matching
578  * the ID is returned.
579  * @param rulesLength the length of the rules, or -1 if the rules
580  * are zero-terminated.
581  * @param parseError a pointer to a UParseError struct to receive the
582  * details of any parsing errors. This parameter may be NULL if no
583  * parsing error details are desired.
584  * @param status a pointer to the UErrorCode
585  * @return a transliterator pointer that may be passed to other
586  * utrans_xxx() functions, or NULL if the open call fails.
587  * @deprecated ICU 2.8 Use utrans_openU() instead, see utrans.h
588  */
589 U_DEPRECATED UTransliterator* U_EXPORT2
590 utrans_open(const char* id,
591             UTransDirection dir,
592             const UChar* rules,         /* may be Null */
593             int32_t rulesLength,        /* -1 if null-terminated */
594             UParseError* parseError,    /* may be Null */
595             UErrorCode* status);
596 
597 /**
598  * Deprecated, use utrans_getUnicodeID() instead.
599  * Return the programmatic identifier for this transliterator.
600  * If this identifier is passed to utrans_open(), it will open
601  * a transliterator equivalent to this one, if the ID has been
602  * registered.
603  * @param trans the transliterator to return the ID of.
604  * @param buf the buffer in which to receive the ID.  This may be
605  * NULL, in which case no characters are copied.
606  * @param bufCapacity the capacity of the buffer.  Ignored if buf is
607  * NULL.
608  * @return the actual length of the ID, not including
609  * zero-termination.  This may be greater than bufCapacity.
610  * @deprecated ICU 2.8 Use utrans_getUnicodeID() instead, see utrans.h
611  */
612 U_DEPRECATED int32_t U_EXPORT2
613 utrans_getID(const UTransliterator* trans,
614              char* buf,
615              int32_t bufCapacity);
616 
617 /**
618  * Deprecated, use utrans_unregisterID() instead.
619  * Unregister a transliterator from the system.  After this call the
620  * system will no longer recognize the given ID when passed to
621  * utrans_open().  If the id is invalid then nothing is done.
622  *
623  * @param id a zero-terminated ID
624  * @deprecated ICU 2.8 Use utrans_unregisterID() instead, see utrans.h
625  */
626 U_DEPRECATED void U_EXPORT2
627 utrans_unregister(const char* id);
628 
629 /**
630  * Deprecated, use utrans_openIDs() instead.
631  * Return the ID of the index-th system transliterator.  The result
632  * is placed in the given buffer.  If the given buffer is too small,
633  * the initial substring is copied to buf.  The result in buf is
634  * always zero-terminated.
635  *
636  * @param index the number of the transliterator to return.  Must
637  * satisfy 0 <= index < utrans_countAvailableIDs().  If index is out
638  * of range then it is treated as if it were 0.
639  * @param buf the buffer in which to receive the ID.  This may be
640  * NULL, in which case no characters are copied.
641  * @param bufCapacity the capacity of the buffer.  Ignored if buf is
642  * NULL.
643  * @return the actual length of the index-th ID, not including
644  * zero-termination.  This may be greater than bufCapacity.
645  * @deprecated ICU 2.8 Use utrans_openIDs() instead, see utrans.h
646  */
647 U_DEPRECATED int32_t U_EXPORT2
648 utrans_getAvailableID(int32_t index,
649                       char* buf,
650                       int32_t bufCapacity);
651 
652 #endif  /* U_HIDE_DEPRECATED_API */
653 
654 #endif /* #if !UCONFIG_NO_TRANSLITERATION */
655 
656 #endif
657