|
Lines 101-106
bool VarsReader::assign_key_value()
Link Here
|
| 101 |
} |
101 |
} |
| 102 |
return false; |
102 |
return false; |
| 103 |
} |
103 |
} |
|
|
104 |
|
| 105 |
if (string(key_begin, key_len) == "PORTAGE_TMPDIR") |
| 106 |
cout << value; |
| 104 |
(*vars)[string(key_begin, key_len)] = value; |
107 |
(*vars)[string(key_begin, key_len)] = value; |
| 105 |
return false; |
108 |
return false; |
| 106 |
} |
109 |
} |
|
Lines 228-244
void VarsReader::EVAL_VALUE()
Link Here
|
| 228 |
} |
231 |
} |
| 229 |
} |
232 |
} |
| 230 |
|
233 |
|
|
|
234 |
/* Backslash escapes supported by portage. */ |
| 235 |
static const char ESC_A = 007; |
| 236 |
static const char ESC_B = 010; |
| 237 |
static const char ESC_E = 033; |
| 238 |
static const char ESC_N = 012; |
| 239 |
static const char ESC_R = 015; |
| 240 |
static const char ESC_T = 011; |
| 241 |
static const char ESC_V = 013; |
| 242 |
/* and helper ones. */ |
| 243 |
static const char ESC_BS = '\\'; |
| 244 |
static const char ESC_SP = ' '; |
| 245 |
|
| 231 |
/** Reads a value enclosed in single quotes ('). |
246 |
/** Reads a value enclosed in single quotes ('). |
| 232 |
* Copy INPUT into value-buffer while INPUT is not in ['\\]. If the value ends, ASSIGN_KEY_VALUE is |
247 |
* Copy INPUT into value-buffer while INPUT is not in ['\\]. If the value ends, ASSIGN_KEY_VALUE is |
| 233 |
* called. |
248 |
* called. |
| 234 |
* '\\' -> [RV] SINGLE_QUOTE_ESCAPE | '\'' -> [RV] JUMP_NOISE */ |
249 |
* '\\' -> [RV] SINGLE_QUOTE_ESCAPE | '\'' -> [RV] JUMP_NOISE */ |
| 235 |
void VarsReader::VALUE_SINGLE_QUOTE() |
250 |
void VarsReader::VALUE_SINGLE_QUOTE() |
| 236 |
{ |
251 |
{ |
| 237 |
while(likely(INPUT != '\'')) { |
252 |
while(likely(INPUT != '\'' && INPUT != '\\')) { |
| 238 |
VALUE_APPEND(INPUT); |
253 |
if(unlikely(INPUT == '$' && (parse_flags & SUBST_VARS))) { |
|
|
254 |
NEXT_INPUT; |
| 255 |
resolveReference(); |
| 256 |
if(INPUT_EOF) |
| 257 |
return; |
| 258 |
continue; |
| 259 |
} |
| 260 |
if(INPUT == '\n') |
| 261 |
VALUE_APPEND(ESC_SP); |
| 262 |
else |
| 263 |
VALUE_APPEND(INPUT); |
| 239 |
NEXT_INPUT; |
264 |
NEXT_INPUT; |
| 240 |
} |
265 |
} |
| 241 |
ASSIGN_KEY_VALUE; NEXT_INPUT; CHSTATE(JUMP_NOISE); |
266 |
switch(INPUT) { |
|
|
267 |
case '\'': ASSIGN_KEY_VALUE; NEXT_INPUT; CHSTATE(JUMP_NOISE); |
| 268 |
default: NEXT_INPUT; CHSTATE(SINGLE_QUOTE_ESCAPE); |
| 269 |
} |
| 242 |
} |
270 |
} |
| 243 |
|
271 |
|
| 244 |
/** Read value enclosed in double-quotes ("). |
272 |
/** Read value enclosed in double-quotes ("). |
|
Lines 255-261
void VarsReader::VALUE_DOUBLE_QUOTE()
Link Here
|
| 255 |
return; |
283 |
return; |
| 256 |
continue; |
284 |
continue; |
| 257 |
} |
285 |
} |
| 258 |
VALUE_APPEND(INPUT); |
286 |
if(INPUT == '\n') |
|
|
287 |
VALUE_APPEND(ESC_SP); |
| 288 |
else |
| 289 |
VALUE_APPEND(INPUT); |
| 259 |
NEXT_INPUT; |
290 |
NEXT_INPUT; |
| 260 |
} |
291 |
} |
| 261 |
switch(INPUT) { |
292 |
switch(INPUT) { |
|
Lines 297-325
void VarsReader::VALUE_WHITESPACE()
Link Here
|
| 297 |
CHSTATE(JUMP_NOISE); |
328 |
CHSTATE(JUMP_NOISE); |
| 298 |
} |
329 |
} |
| 299 |
|
330 |
|
| 300 |
/** Cares about \\ in double-quote values. \n is ignored, everything else is put into buffer without |
331 |
/** Cares about \\ in single-quote values. \n is ignored, known Portage escapes are handled |
| 301 |
* the \\. |
332 |
* and everything else is put into buffer without the \\. |
|
|
333 |
* -> [RV] VALUE_SINGLE_QUOTE */ |
| 334 |
void VarsReader::SINGLE_QUOTE_ESCAPE() |
| 335 |
{ |
| 336 |
bool wasnl = false; |
| 337 |
|
| 338 |
switch(INPUT) { |
| 339 |
case 'a': VALUE_APPEND(ESC_A); break; |
| 340 |
case 'b': VALUE_APPEND(ESC_B); break; |
| 341 |
case 'e': VALUE_APPEND(ESC_E); break; |
| 342 |
case 'f': |
| 343 |
case 'n': VALUE_APPEND(ESC_N); break; |
| 344 |
case 'r': VALUE_APPEND(ESC_R); break; |
| 345 |
case 't': VALUE_APPEND(ESC_T); break; |
| 346 |
case 'v': VALUE_APPEND(ESC_V); break; |
| 347 |
case '\n': wasnl = true; break; |
| 348 |
default: VALUE_APPEND(INPUT); |
| 349 |
} |
| 350 |
NEXT_INPUT; |
| 351 |
/* any amount of backslashes forbids portage to expand var */ |
| 352 |
if(unlikely(INPUT == '$' && !wasnl)) { |
| 353 |
VALUE_APPEND(INPUT); |
| 354 |
NEXT_INPUT; |
| 355 |
} |
| 356 |
CHSTATE(VALUE_SINGLE_QUOTE); |
| 357 |
} |
| 358 |
|
| 359 |
/** Cares about \\ in double-quote values. \n is ignored, known Portage escapes are handled |
| 360 |
* and everything else is put into buffer without the \\. |
| 302 |
* -> [RV] VALUE_DOUBLE_QUOTE */ |
361 |
* -> [RV] VALUE_DOUBLE_QUOTE */ |
| 303 |
void VarsReader::DOUBLE_QUOTE_ESCAPE() |
362 |
void VarsReader::DOUBLE_QUOTE_ESCAPE() |
| 304 |
{ |
363 |
{ |
|
|
364 |
bool wasnl = false; |
| 365 |
|
| 305 |
switch(INPUT) { |
366 |
switch(INPUT) { |
| 306 |
case '\n': break; |
367 |
case 'a': VALUE_APPEND(ESC_A); break; |
|
|
368 |
case 'b': VALUE_APPEND(ESC_B); break; |
| 369 |
case 'e': VALUE_APPEND(ESC_E); break; |
| 370 |
case 'f': |
| 371 |
case 'n': VALUE_APPEND(ESC_N); break; |
| 372 |
case 'r': VALUE_APPEND(ESC_R); break; |
| 373 |
case 't': VALUE_APPEND(ESC_T); break; |
| 374 |
case 'v': VALUE_APPEND(ESC_V); break; |
| 375 |
case '\n': wasnl = true; break; |
| 376 |
case '\\': |
| 377 |
NEXT_INPUT; |
| 378 |
switch(INPUT) { |
| 379 |
case 'a': VALUE_APPEND(ESC_A); break; |
| 380 |
case 'b': VALUE_APPEND(ESC_B); break; |
| 381 |
case 'e': VALUE_APPEND(ESC_E); break; |
| 382 |
case 'f': |
| 383 |
case 'n': VALUE_APPEND(ESC_N); break; |
| 384 |
case 'r': VALUE_APPEND(ESC_R); break; |
| 385 |
case 't': VALUE_APPEND(ESC_T); break; |
| 386 |
case 'v': VALUE_APPEND(ESC_V); break; |
| 387 |
case '\n': wasnl = true; break; |
| 388 |
case '\\': |
| 389 |
VALUE_APPEND(INPUT); |
| 390 |
NEXT_INPUT; |
| 391 |
switch(INPUT) { |
| 392 |
case '\\': break; |
| 393 |
case '\n': VALUE_APPEND(ESC_SP); wasnl = true; break; |
| 394 |
default: VALUE_APPEND(INPUT); |
| 395 |
} |
| 396 |
break; |
| 397 |
default: VALUE_APPEND(INPUT); |
| 398 |
} |
| 399 |
break; |
| 307 |
default: VALUE_APPEND(INPUT); |
400 |
default: VALUE_APPEND(INPUT); |
| 308 |
} |
401 |
} |
| 309 |
NEXT_INPUT; |
402 |
NEXT_INPUT_OR_EOF; |
|
|
403 |
/* any amount of backslashes forbids portage to expand var */ |
| 404 |
if(unlikely(INPUT == '$' && !wasnl)) { |
| 405 |
VALUE_APPEND(INPUT); |
| 406 |
NEXT_INPUT; |
| 407 |
} |
| 310 |
CHSTATE(VALUE_DOUBLE_QUOTE); |
408 |
CHSTATE(VALUE_DOUBLE_QUOTE); |
| 311 |
} |
409 |
} |
| 312 |
|
410 |
|
| 313 |
/** Cares about \\ in values without quotes. \n is ignored, everything else is put into buffer without |
411 |
/** Cares about \\ in values without quotes. \n is ignored, known Portage escapes are handled |
| 314 |
* the \\. |
412 |
* and everything else is put into buffer without the \\. |
| 315 |
* -> [RV] VALUE_WHITESPACE */ |
413 |
* -> [RV] VALUE_WHITESPACE */ |
| 316 |
void VarsReader::WHITESPACE_ESCAPE() |
414 |
void VarsReader::WHITESPACE_ESCAPE() |
| 317 |
{ |
415 |
{ |
| 318 |
switch(INPUT) { |
416 |
switch(INPUT) { |
| 319 |
case '\n': break; |
417 |
case '\n': break; |
|
|
418 |
case '\\': |
| 419 |
NEXT_INPUT; |
| 420 |
if(INPUT == '\\') |
| 421 |
NEXT_INPUT; |
| 422 |
else if(INPUT == '\n') |
| 423 |
VALUE_APPEND(ESC_BS); |
| 424 |
switch(INPUT) { |
| 425 |
case 'a': VALUE_APPEND(ESC_A); break; |
| 426 |
case 'b': VALUE_APPEND(ESC_B); break; |
| 427 |
case 'e': VALUE_APPEND(ESC_E); break; |
| 428 |
case 'f': |
| 429 |
case 'n': VALUE_APPEND(ESC_N); break; |
| 430 |
case 'r': VALUE_APPEND(ESC_R); break; |
| 431 |
case 't': VALUE_APPEND(ESC_T); break; |
| 432 |
case 'v': VALUE_APPEND(ESC_V); break; |
| 433 |
case '\n': break; |
| 434 |
default: VALUE_APPEND(INPUT); |
| 435 |
} |
| 436 |
break; |
| 320 |
default: VALUE_APPEND(INPUT); |
437 |
default: VALUE_APPEND(INPUT); |
| 321 |
} |
438 |
} |
| 322 |
NEXT_INPUT; |
439 |
NEXT_INPUT_OR_EOF; |
|
|
440 |
/* any amount of backslashes forbids portage to expand var */ |
| 441 |
if(INPUT == '$') { |
| 442 |
VALUE_APPEND(INPUT); |
| 443 |
NEXT_INPUT; |
| 444 |
} |
| 323 |
CHSTATE(VALUE_WHITESPACE); |
445 |
CHSTATE(VALUE_WHITESPACE); |
| 324 |
} |
446 |
} |
| 325 |
|
447 |
|
|
Lines 426-431
void VarsReader::runFsm()
Link Here
|
| 426 |
case state_STOP: return; |
548 |
case state_STOP: return; |
| 427 |
case state_VALUE_WHITESPACE: VALUE_WHITESPACE(); break; |
549 |
case state_VALUE_WHITESPACE: VALUE_WHITESPACE(); break; |
| 428 |
case state_VALUE_SINGLE_QUOTE: VALUE_SINGLE_QUOTE(); break; |
550 |
case state_VALUE_SINGLE_QUOTE: VALUE_SINGLE_QUOTE(); break; |
|
|
551 |
case state_SINGLE_QUOTE_ESCAPE: SINGLE_QUOTE_ESCAPE(); break; |
| 429 |
case state_DOUBLE_QUOTE_ESCAPE: DOUBLE_QUOTE_ESCAPE(); break; |
552 |
case state_DOUBLE_QUOTE_ESCAPE: DOUBLE_QUOTE_ESCAPE(); break; |
| 430 |
case state_WHITESPACE_ESCAPE: WHITESPACE_ESCAPE(); break; |
553 |
case state_WHITESPACE_ESCAPE: WHITESPACE_ESCAPE(); break; |
| 431 |
default: break; |
554 |
default: break; |