/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_codemaker.hxx" #include "codemaker/unotype.hxx" #include "osl/diagnose.h" #include "rtl/string.hxx" #include "sal/types.h" #include codemaker::UnoType::Sort codemaker::UnoType::getSort(rtl::OString const & type) { return type == "void" ? SORT_VOID : type == "boolean" ? SORT_BOOLEAN : type == "byte" ? SORT_BYTE : type == "short" ? SORT_SHORT : type == "unsigned short" ? SORT_UNSIGNED_SHORT : type == "long" ? SORT_LONG : type == "unsigned long" ? SORT_UNSIGNED_LONG : type == "hyper" ? SORT_HYPER : type == "unsigned hyper" ? SORT_UNSIGNED_HYPER : type == "float" ? SORT_FLOAT : type == "double" ? SORT_DOUBLE : type == "char" ? SORT_CHAR : type == "string" ? SORT_STRING : type == "type" ? SORT_TYPE : type == "any" ? SORT_ANY : SORT_COMPLEX; } bool codemaker::UnoType::isSequenceType(rtl::OString const & type) { return ( !type.isEmpty() && type[0] == '[' ); } rtl::OString codemaker::UnoType::decompose( rtl::OString const & type, sal_Int32 * rank, std::vector< rtl::OString > * arguments) { sal_Int32 len = type.getLength(); sal_Int32 i = 0; while (len - i > 1 && type[i + 1] == ']') { i += 2; } if (rank != 0) { *rank = i / 2; } sal_Int32 j = arguments == 0 ? -1 : type.indexOf('<', i); if (j < 0) { return type.copy(i); } sal_Int32 k = j; do { ++k; // skip '<' or ',' sal_Int32 l = k; for (sal_Int32 level = 0; l != len; ++l) { char c = type[l]; if (c == ',') { if (level == 0) { break; } } else if (c == '<') { ++level; } else if (c == '>') { if (level == 0) { break; } --level; } } arguments->push_back(type.copy(k, l - k)); k = l; } while (k != len && type[k] != '>'); OSL_ASSERT(k == len - 1 && type[k] == '>'); return type.copy(i, j - i); }