2 * Copyright 2007 Google Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.google.zxing.client.result;
19 import java.util.Vector;
23 * <a href="http://www.nttdocomo.co.jp/english/service/imode/make/content/barcode/about/s2.html">
24 * DoCoMo's documentation</a> about the result types represented by subclasses of this class.</p>
26 * <p>Thanks to Jeff Griffin for proposing rewrite of these classes that relies less
27 * on exception-based mechanisms during parsing.</p>
29 * @author srowen@google.com (Sean Owen)
31 abstract class AbstractDoCoMoParsedResult extends ParsedReaderResult {
33 AbstractDoCoMoParsedResult(ParsedReaderResultType type) {
37 // This could as well be implemented with java.util.regex. It was already implemented partially
38 // to run in a J2ME enviroment, where this unavailable.
40 static String[] matchPrefixedField(String prefix, String rawText) {
41 return matchPrefixedField(prefix, rawText, ';');
44 static String[] matchPrefixedField(String prefix, String rawText, char endChar) {
45 Vector matches = null;
47 int max = rawText.length();
49 i = rawText.indexOf(prefix, i);
53 i += prefix.length(); // Skip past this prefix we found to start
54 int start = i; // Found the start of a match here
57 i = rawText.indexOf((int) endChar, i);
59 // No terminating end character? uh, done. Set i such that loop terminates and break
62 } else if (rawText.charAt(i - 1) == '\\') {
63 // semicolon was escaped so continue
67 if (matches == null) {
68 matches = new Vector(3); // lazy init
70 matches.addElement(unescape(rawText.substring(start, i)));
76 if (matches == null || matches.isEmpty()) {
79 int size = matches.size();
80 String[] result = new String[size];
81 for (int j = 0; j < size; j++) {
82 result[j] = (String) matches.elementAt(j);
87 static String matchSinglePrefixedField(String prefix, String rawText) {
88 return matchSinglePrefixedField(prefix, rawText, ';');
91 static String matchSinglePrefixedField(String prefix, String rawText, char endChar) {
92 String[] matches = matchPrefixedField(prefix, rawText, endChar);
93 return matches == null ? null : matches[0];
96 private static String unescape(String escaped) {
97 if (escaped != null) {
98 int backslash = escaped.indexOf((int) '\\');
100 int max = escaped.length();
101 StringBuffer unescaped = new StringBuffer(max - 1);
102 unescaped.append(escaped.toCharArray(), 0, backslash);
103 boolean nextIsEscaped = false;
104 for (int i = backslash; i < max; i++) {
105 char c = escaped.charAt(i);
106 if (nextIsEscaped || c != '\\') {
108 nextIsEscaped = false;
110 nextIsEscaped = true;
113 return unescaped.toString();
119 static void maybeAppend(String value, StringBuffer result) {
122 result.append(value);
126 static void maybeAppend(String[] value, StringBuffer result) {
128 for (int i = 0; i < value.length; i++) {
130 result.append(value[i]);