Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 316907
Collapse All | Expand All

(-)eixTk/varsreader.cc (-11 / +134 lines)
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;
(-)eixTk/varsreader.h (+1 lines)
Lines 105-110 class VarsReader { Link Here
105
			state_VALUE_SINGLE_QUOTE,
105
			state_VALUE_SINGLE_QUOTE,
106
			state_VALUE_DOUBLE_QUOTE,
106
			state_VALUE_DOUBLE_QUOTE,
107
			state_VALUE_WHITESPACE,
107
			state_VALUE_WHITESPACE,
108
			state_SINGLE_QUOTE_ESCAPE,
108
			state_DOUBLE_QUOTE_ESCAPE,
109
			state_DOUBLE_QUOTE_ESCAPE,
109
			state_WHITESPACE_ESCAPE,
110
			state_WHITESPACE_ESCAPE,
110
			state_NOISE_ESCAPE,
111
			state_NOISE_ESCAPE,

Return to bug 316907