Home | History | Annotate | Download | only in kati
      1 // Copyright 2015 Google Inc. All rights reserved
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //      http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #ifndef STRUTIL_H_
     16 #define STRUTIL_H_
     17 
     18 #include <string>
     19 #include <vector>
     20 
     21 #include "string_piece.h"
     22 
     23 using namespace std;
     24 
     25 class WordScanner {
     26  public:
     27   struct Iterator {
     28     Iterator& operator++();
     29     StringPiece operator*() const;
     30     bool operator!=(const Iterator& r) const {
     31       return in != r.in || s != r.s || i != r.i;
     32     }
     33 
     34     const StringPiece* in;
     35     int s;
     36     int i;
     37   };
     38 
     39   explicit WordScanner(StringPiece in);
     40 
     41   Iterator begin() const;
     42   Iterator end() const;
     43 
     44   void Split(vector<StringPiece>* o);
     45 
     46  private:
     47   StringPiece in_;
     48 };
     49 
     50 class WordWriter {
     51  public:
     52   explicit WordWriter(string* o);
     53   void MaybeAddWhitespace();
     54   void Write(StringPiece s);
     55 
     56  private:
     57   string* out_;
     58   bool needs_space_;
     59 };
     60 
     61 // Temporary modifies s[s.size()] to '\0'.
     62 class ScopedTerminator {
     63  public:
     64   explicit ScopedTerminator(StringPiece s);
     65   ~ScopedTerminator();
     66 
     67  private:
     68   StringPiece s_;
     69   char c_;
     70 };
     71 
     72 template <class String>
     73 inline string JoinStrings(vector<String> v, const char* sep) {
     74   string r;
     75   for (StringPiece s : v) {
     76     if (!r.empty()) {
     77       r += sep;
     78     }
     79     r.append(s.begin(), s.end());
     80   }
     81   return r;
     82 }
     83 
     84 void AppendString(StringPiece str, string* out);
     85 
     86 bool HasPrefix(StringPiece str, StringPiece prefix);
     87 
     88 bool HasSuffix(StringPiece str, StringPiece suffix);
     89 
     90 bool HasWord(StringPiece str, StringPiece w);
     91 
     92 StringPiece TrimSuffix(StringPiece str, StringPiece suffix);
     93 
     94 class Pattern {
     95  public:
     96   explicit Pattern(StringPiece pat);
     97 
     98   bool Match(StringPiece str) const;
     99 
    100   StringPiece Stem(StringPiece str) const;
    101 
    102   void AppendSubst(StringPiece str, StringPiece subst, string* out) const;
    103 
    104   void AppendSubstRef(StringPiece str, StringPiece subst, string* out) const;
    105 
    106  private:
    107   bool MatchImpl(StringPiece str) const;
    108 
    109   StringPiece pat_;
    110   size_t percent_index_;
    111 };
    112 
    113 string NoLineBreak(const string& s);
    114 
    115 StringPiece TrimLeftSpace(StringPiece s);
    116 StringPiece TrimRightSpace(StringPiece s);
    117 StringPiece TrimSpace(StringPiece s);
    118 
    119 StringPiece Dirname(StringPiece s);
    120 StringPiece Basename(StringPiece s);
    121 StringPiece GetExt(StringPiece s);
    122 StringPiece StripExt(StringPiece s);
    123 void NormalizePath(string* o);
    124 void AbsPath(StringPiece s, string* o);
    125 
    126 size_t FindOutsideParen(StringPiece s, char c);
    127 size_t FindTwoOutsideParen(StringPiece s, char c1, char c2);
    128 size_t FindThreeOutsideParen(StringPiece s, char c1, char c2, char c3);
    129 
    130 size_t FindEndOfLine(StringPiece s, size_t e, size_t* lf_cnt);
    131 
    132 // Strip leading sequences of './' from file names, so that ./file
    133 // and file are considered to be the same file.
    134 // From http://www.gnu.org/software/make/manual/make.html#Features
    135 StringPiece TrimLeadingCurdir(StringPiece s);
    136 
    137 void FormatForCommandSubstitution(string* s);
    138 
    139 string SortWordsInString(StringPiece s);
    140 
    141 string ConcatDir(StringPiece b, StringPiece n);
    142 
    143 string EchoEscape(const string str);
    144 
    145 void EscapeShell(string* s);
    146 
    147 #endif  // STRUTIL_H_
    148