Mercurial > public > mercurial-scm > hg
comparison mercurial/revsetlang.py @ 31355:77270ec0cdd9
revsetlang: slice out single bytes instead of indexing
For portability with Python 3.
author | Augie Fackler <augie@google.com> |
---|---|
date | Sun, 12 Mar 2017 00:46:59 -0500 |
parents | 0b8356705de6 |
children | 7556fe09cc48 |
comparison
equal
deleted
inserted
replaced
31354:e6a2b625e0d9 | 31355:77270ec0cdd9 |
---|---|
94 yield ('end', None, len(program)) | 94 yield ('end', None, len(program)) |
95 return | 95 return |
96 | 96 |
97 pos, l = 0, len(program) | 97 pos, l = 0, len(program) |
98 while pos < l: | 98 while pos < l: |
99 c = program[pos] | 99 c = program[pos:pos + 1] |
100 if c.isspace(): # skip inter-token whitespace | 100 if c.isspace(): # skip inter-token whitespace |
101 pass | 101 pass |
102 elif c == ':' and program[pos:pos + 2] == '::': # look ahead carefully | 102 elif c == ':' and program[pos:pos + 2] == '::': # look ahead carefully |
103 yield ('::', None, pos) | 103 yield ('::', None, pos) |
104 pos += 1 # skip ahead | 104 pos += 1 # skip ahead |
112 yield (c, None, pos) | 112 yield (c, None, pos) |
113 elif (c in '"\'' or c == 'r' and | 113 elif (c in '"\'' or c == 'r' and |
114 program[pos:pos + 2] in ("r'", 'r"')): # handle quoted strings | 114 program[pos:pos + 2] in ("r'", 'r"')): # handle quoted strings |
115 if c == 'r': | 115 if c == 'r': |
116 pos += 1 | 116 pos += 1 |
117 c = program[pos] | 117 c = program[pos:pos + 1] |
118 decode = lambda x: x | 118 decode = lambda x: x |
119 else: | 119 else: |
120 decode = parser.unescapestr | 120 decode = parser.unescapestr |
121 pos += 1 | 121 pos += 1 |
122 s = pos | 122 s = pos |
123 while pos < l: # find closing quote | 123 while pos < l: # find closing quote |
124 d = program[pos] | 124 d = program[pos:pos + 1] |
125 if d == '\\': # skip over escaped characters | 125 if d == '\\': # skip over escaped characters |
126 pos += 2 | 126 pos += 2 |
127 continue | 127 continue |
128 if d == c: | 128 if d == c: |
129 yield ('string', decode(program[s:pos]), s) | 129 yield ('string', decode(program[s:pos]), s) |
134 # gather up a symbol/keyword | 134 # gather up a symbol/keyword |
135 elif c in syminitletters: | 135 elif c in syminitletters: |
136 s = pos | 136 s = pos |
137 pos += 1 | 137 pos += 1 |
138 while pos < l: # find end of symbol | 138 while pos < l: # find end of symbol |
139 d = program[pos] | 139 d = program[pos:pos + 1] |
140 if d not in symletters: | 140 if d not in symletters: |
141 break | 141 break |
142 if d == '.' and program[pos - 1] == '.': # special case for .. | 142 if (d == '.' |
143 and program[pos - 1:pos] == '.'): # special case for .. | |
143 pos -= 1 | 144 pos -= 1 |
144 break | 145 break |
145 pos += 1 | 146 pos += 1 |
146 sym = program[s:pos] | 147 sym = program[s:pos] |
147 if sym in keywords: # operator keywords | 148 if sym in keywords: # operator keywords |