12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2002-2010, International Business Machines Corporation and    *
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.impl;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.Replaceable;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.ReplaceableString;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.Transliterator;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.UnicodeMatcher;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author Ram
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//This class contains utility functions so testing not needed
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert///CLOVER:OFF
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class UtilityExtensions {
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Append the given string to the rule.  Calls the single-character
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * version of appendToRule for each character.
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void appendToRule(StringBuffer rule,
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    String text,
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    boolean isLiteral,
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    boolean escapeUnprintable,
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    StringBuffer quoteBuf) {
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i=0; i<text.length(); ++i) {
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Okay to process in 16-bit code units here
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Utility.appendToRule(rule, text.charAt(i), isLiteral, escapeUnprintable, quoteBuf);
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Given a matcher reference, which may be null, append its
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * pattern as a literal to the given rule.
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void appendToRule(StringBuffer rule,
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    UnicodeMatcher matcher,
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    boolean escapeUnprintable,
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                    StringBuffer quoteBuf) {
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (matcher != null) {
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            appendToRule(rule, matcher.toPattern(escapeUnprintable),
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                         true, escapeUnprintable, quoteBuf);
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * For debugging purposes; format the given text in the form
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * aaa{bbb|ccc|ddd}eee, where the {} indicate the context start
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * and limit, and the || indicate the start and limit.
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static String formatInput(ReplaceableString input,
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     Transliterator.Position pos) {
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer appendTo = new StringBuffer();
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        formatInput(appendTo, input, pos);
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return com.ibm.icu.impl.Utility.escape(appendTo.toString());
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * For debugging purposes; format the given text in the form
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * aaa{bbb|ccc|ddd}eee, where the {} indicate the context start
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * and limit, and the || indicate the start and limit.
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static StringBuffer formatInput(StringBuffer appendTo,
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                           ReplaceableString input,
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                           Transliterator.Position pos) {
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (0 <= pos.contextStart &&
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pos.contextStart <= pos.start &&
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pos.start <= pos.limit &&
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pos.limit <= pos.contextLimit &&
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            pos.contextLimit <= input.length()) {
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String  b, c, d;
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //a = input.substring(0, pos.contextStart);
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            b = input.substring(pos.contextStart, pos.start);
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            c = input.substring(pos.start, pos.limit);
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            d = input.substring(pos.limit, pos.contextLimit);
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //e = input.substring(pos.contextLimit, input.length());
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            appendTo.//append(a).
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                append('{').append(b).
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                append('|').append(c).append('|').append(d).
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                append('}')
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                //.append(e)
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ;
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            appendTo.append("INVALID Position {cs=" +
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            pos.contextStart + ", s=" + pos.start + ", l=" +
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            pos.limit + ", cl=" + pos.contextLimit + "} on " +
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            input);
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return appendTo;
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Convenience method.
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static String formatInput(Replaceable input,
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                     Transliterator.Position pos) {
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return formatInput((ReplaceableString) input, pos);
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Convenience method.
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static StringBuffer formatInput(StringBuffer appendTo,
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                           Replaceable input,
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                           Transliterator.Position pos) {
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return formatInput(appendTo, (ReplaceableString) input, pos);
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//CLOVER:ON