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