1 /* 2 * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 #pragma once 26 27 #include <string> 28 #include <vector> 29 #include "buffer.h" 30 31 class BufferCursor; 32 class Range; 33 34 class Mark final : public PureRange { 35 BufferCursor *cursor; 36 char *ptr; 37 char *end; 38 friend BufferCursor; 39 40 explicit Mark(BufferCursor *); 41 42 public: 43 char *getStart() override; 44 45 char *getEnd() override; 46 47 size_t getSize() override; 48 49 char *setEnd(); 50 51 std::string str(char *end) const; 52 53 std::string str(); 54 55 std::string str(int delta); 56 }; 57 58 class BufferCursor final : public PureRange { 59 protected: 60 char *startPtr, *ptr, *endPtr; 61 std::vector<Mark *> marks; 62 63 public: 64 char *get(); 65 66 char *getStart() override; 67 68 char *getEnd() override; 69 70 size_t getSize() override; 71 72 BufferCursor *moveToOffset(int offset); 73 74 virtual bool isValid(char *p); 75 76 bool end() const; 77 78 BufferCursor *advance(int i); 79 80 BufferCursor *advance(); 81 82 BufferCursor *backup(int i); 83 84 BufferCursor *backup(); 85 86 char ch(); 87 88 int chAsDigit(); 89 90 int chAsHexDigit(); 91 92 char chAndAdvance(); 93 94 bool isLookingAt(char c); 95 96 BufferCursor *skipWhiteSpace(); 97 98 BufferCursor *skipWhiteSpaceOrNewLine(); 99 100 bool isLookingAt(const char *str); 101 102 bool isLookingAtAndStepOver(const char *str); 103 104 BufferCursor *skipUntilLookingAt(const char *str); 105 106 BufferCursor *backupUntilLookingAt(const char *str); 107 108 BufferCursor *skipUntilLookingAtOneOf(const char *str); 109 110 BufferCursor *skipWhileLookingAt(const char *str); 111 112 BufferCursor *skipWhileLookingAtOneOf(const char *str); 113 114 bool isLookingAtOneOf(const char *str); 115 116 bool isLookingAtCRNL(); 117 118 BufferCursor *stepOverCRNL(); 119 120 bool isLookingAtNL(); 121 122 BufferCursor *stepOverNL(); 123 124 Mark *mark(); 125 126 Mark *markUntil(const char *s); 127 128 bool isLookingAtAlpha(); 129 130 bool isLookingAtDigit(); 131 132 bool isLookingAtHexDigit(); 133 134 bool isLookingAtOctalDigit(); 135 136 bool isLookingAtAlphaNum(); 137 138 bool isLookingAtAlphaNumOr(const char *s); 139 140 BufferCursor *moveTo(Mark *mark); 141 142 BufferCursor *stepOver(char c); 143 144 BufferCursor *stepOver(const char *s); 145 146 BufferCursor *skipTill(const char *str); 147 148 BufferCursor *reset(); 149 150 explicit BufferCursor(PureRange *pureRange); 151 152 BufferCursor(char *ptr, size_t len); 153 154 explicit BufferCursor(char *ptr); 155 156 ~BufferCursor() override; 157 158 void show(std::ostream &o); 159 }; 160 161 162 std::ostream &operator<<(std::ostream &o, BufferCursor &c); 163 164 std::ostream &operator<<(std::ostream &o, BufferCursor *c);