• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 
17 #ifndef _UTILS_TOKENIZER_H
18 #define _UTILS_TOKENIZER_H
19 
20 #include <assert.h>
21 #include <utils/Errors.h>
22 #include <utils/FileMap.h>
23 #include <utils/String8.h>
24 
25 namespace android {
26 
27 /**
28  * A simple tokenizer for loading and parsing ASCII text files line by line.
29  */
30 class Tokenizer {
31     Tokenizer(const String8& filename, FileMap* fileMap, char* buffer, size_t length);
32 
33 public:
34     ~Tokenizer();
35 
36     /**
37      * Opens a file and maps it into memory.
38      *
39      * Returns NO_ERROR and a tokenizer for the file, if successful.
40      * Otherwise returns an error and sets outTokenizer to NULL.
41      */
42     static status_t open(const String8& filename, Tokenizer** outTokenizer);
43 
44     /**
45      * Returns true if at the end of the file.
46      */
isEof()47     inline bool isEof() const { return mCurrent == getEnd(); }
48 
49     /**
50      * Returns true if at the end of the line or end of the file.
51      */
isEol()52     inline bool isEol() const { return isEof() || *mCurrent == '\n'; }
53 
54     /**
55      * Gets the name of the file.
56      */
getFilename()57     inline String8 getFilename() const { return mFilename; }
58 
59     /**
60      * Gets a 1-based line number index for the current position.
61      */
getLineNumber()62     inline int32_t getLineNumber() const { return mLineNumber; }
63 
64     /**
65      * Formats a location string consisting of the filename and current line number.
66      * Returns a string like "MyFile.txt:33".
67      */
68     String8 getLocation() const;
69 
70     /**
71      * Gets the character at the current position.
72      * Returns null at end of file.
73      */
peekChar()74     inline char peekChar() const { return isEof() ? '\0' : *mCurrent; }
75 
76     /**
77      * Gets the remainder of the current line as a string, excluding the newline character.
78      */
79     String8 peekRemainderOfLine() const;
80 
81     /**
82      * Gets the character at the current position and advances past it.
83      * Returns null at end of file.
84      */
nextChar()85     inline char nextChar() { return isEof() ? '\0' : *(mCurrent++); }
86 
87     /**
88      * Gets the next token on this line stopping at the specified delimiters
89      * or the end of the line whichever comes first and advances past it.
90      * Also stops at embedded nulls.
91      * Returns the token or an empty string if the current character is a delimiter
92      * or is at the end of the line.
93      */
94     String8 nextToken(const char* delimiters);
95 
96     /**
97      * Advances to the next line.
98      * Does nothing if already at the end of the file.
99      */
100     void nextLine();
101 
102     /**
103      * Skips over the specified delimiters in the line.
104      * Also skips embedded nulls.
105      */
106     void skipDelimiters(const char* delimiters);
107 
108 private:
109     Tokenizer(const Tokenizer& other); // not copyable
110 
111     String8 mFilename;
112     FileMap* mFileMap;
113     char* mBuffer;
114     size_t mLength;
115 
116     const char* mCurrent;
117     int32_t mLineNumber;
118 
getEnd()119     inline const char* getEnd() const { return mBuffer + mLength; }
120 
121 };
122 
123 } // namespace android
124 
125 #endif // _UTILS_TOKENIZER_H
126