/* Copyright (c) 2010-2011, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "common_util.h" bool StringMatch(const string& wildcard, const string& text) { const char* c_text = text.c_str(); const char* c_wildcard = wildcard.c_str(); // Start of the current look-ahead. Everything before these positions is a // definite, optimal match. const char* c_text_last = NULL; const char* c_wildcard_last = NULL; char last_wc_char = wildcard[wildcard.size() - 1]; if (last_wc_char == '*' && wildcard.size() == 1) { return true; // '*' matches everything. } if (last_wc_char != '*' && last_wc_char != '?' && last_wc_char != text[text.size() - 1]) { // short cut for the case when the wildcard does not end with '*' or '?' // and the last characters of wildcard and text do not match. return false; } while (*c_text) { if (*c_wildcard == '*') { while (*++c_wildcard == '*') { // Skip all '*'. } if (!*c_wildcard) { // Ends with a series of '*'. return true; } c_text_last = c_text; c_wildcard_last = c_wildcard; } else if ((*c_text == *c_wildcard) || (*c_wildcard == '?')) { ++c_text; ++c_wildcard; } else if (c_text_last) { // No match. But we have seen at least one '*', so rollback and try at the // next position. c_wildcard = c_wildcard_last; c_text = c_text_last++; } else { return false; } } // Skip all '*' at the end of the wildcard. while (*c_wildcard == '*') { ++c_wildcard; } return !*c_wildcard; } string ConvertToPlatformIndependentPath(const string &s) { string ret = s; #ifdef _MSC_VER // TODO(timurrrr): do we need anything apart from s/\\///g? size_t it = 0; while ((it = ret.find("\\", it)) != string::npos) { ret.replace(it, 1, "/"); } #endif // _MSC_VER return ret; } TS_FILE OpenFileReadOnly(const string &file_name, bool die_if_failed) { TS_FILE ret = TS_FILE_INVALID; #ifdef TS_VALGRIND SysRes sres = VG_(open)((const Char*)file_name.c_str(), VKI_O_RDONLY, 0); if (!sr_isError(sres)) ret = sr_Res(sres); #elif defined(_MSC_VER) ret = fopen(file_name.c_str(), "r"); #else // no TS_VALGRIND ret = open(file_name.c_str(), O_RDONLY); #endif if (ret == TS_FILE_INVALID && die_if_failed) { Printf("ERROR: can not open file %s\n", file_name.c_str()); exit(1); } return ret; } // Read the contents of a file to string. Valgrind version. string ReadFileToString(const string &file_name, bool die_if_failed) { TS_FILE fd = OpenFileReadOnly(file_name, die_if_failed); if (fd == TS_FILE_INVALID) { return string(); } char buff[257] = {0}; int n_read; string res; while ((n_read = read(fd, buff, sizeof(buff) - 1)) > 0) { buff[n_read] = 0; res.append(buff, n_read); } close(fd); return res; }