Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 229005 Details for
Bug 316907
app-portage/eix: doesn't support escapes in make.conf
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch adjusting the config file reading to match Portage
eix-9999-portage-config-reading.diff (text/plain), 6.45 KB, created by
Michał Górny
on 2010-04-24 14:39:43 UTC
(
hide
)
Description:
Patch adjusting the config file reading to match Portage
Filename:
MIME Type:
Creator:
Michał Górny
Created:
2010-04-24 14:39:43 UTC
Size:
6.45 KB
patch
obsolete
>Index: eixTk/varsreader.cc >=================================================================== >--- eixTk/varsreader.cc (revision 1047) >+++ eixTk/varsreader.cc (working copy) >@@ -101,6 +101,9 @@ bool VarsReader::assign_key_value() > } > return false; > } >+ >+ if (string(key_begin, key_len) == "PORTAGE_TMPDIR") >+ cout << value; > (*vars)[string(key_begin, key_len)] = value; > return false; > } >@@ -228,17 +231,42 @@ void VarsReader::EVAL_VALUE() > } > } > >+/* Backslash escapes supported by portage. */ >+static const char ESC_A = 007; >+static const char ESC_B = 010; >+static const char ESC_E = 033; >+static const char ESC_N = 012; >+static const char ESC_R = 015; >+static const char ESC_T = 011; >+static const char ESC_V = 013; >+/* and helper ones. */ >+static const char ESC_BS = '\\'; >+static const char ESC_SP = ' '; >+ > /** Reads a value enclosed in single quotes ('). > * Copy INPUT into value-buffer while INPUT is not in ['\\]. If the value ends, ASSIGN_KEY_VALUE is > * called. > * '\\' -> [RV] SINGLE_QUOTE_ESCAPE | '\'' -> [RV] JUMP_NOISE */ > void VarsReader::VALUE_SINGLE_QUOTE() > { >- while(likely(INPUT != '\'')) { >- VALUE_APPEND(INPUT); >+ while(likely(INPUT != '\'' && INPUT != '\\')) { >+ if(unlikely(INPUT == '$' && (parse_flags & SUBST_VARS))) { >+ NEXT_INPUT; >+ resolveReference(); >+ if(INPUT_EOF) >+ return; >+ continue; >+ } >+ if(INPUT == '\n') >+ VALUE_APPEND(ESC_SP); >+ else >+ VALUE_APPEND(INPUT); > NEXT_INPUT; > } >- ASSIGN_KEY_VALUE; NEXT_INPUT; CHSTATE(JUMP_NOISE); >+ switch(INPUT) { >+ case '\'': ASSIGN_KEY_VALUE; NEXT_INPUT; CHSTATE(JUMP_NOISE); >+ default: NEXT_INPUT; CHSTATE(SINGLE_QUOTE_ESCAPE); >+ } > } > > /** Read value enclosed in double-quotes ("). >@@ -255,7 +283,10 @@ void VarsReader::VALUE_DOUBLE_QUOTE() > return; > continue; > } >- VALUE_APPEND(INPUT); >+ if(INPUT == '\n') >+ VALUE_APPEND(ESC_SP); >+ else >+ VALUE_APPEND(INPUT); > NEXT_INPUT; > } > switch(INPUT) { >@@ -297,29 +328,120 @@ void VarsReader::VALUE_WHITESPACE() > CHSTATE(JUMP_NOISE); > } > >-/** Cares about \\ in double-quote values. \n is ignored, everything else is put into buffer without >- * the \\. >+/** Cares about \\ in single-quote values. \n is ignored, known Portage escapes are handled >+ * and everything else is put into buffer without the \\. >+ * -> [RV] VALUE_SINGLE_QUOTE */ >+void VarsReader::SINGLE_QUOTE_ESCAPE() >+{ >+ bool wasnl = false; >+ >+ switch(INPUT) { >+ case 'a': VALUE_APPEND(ESC_A); break; >+ case 'b': VALUE_APPEND(ESC_B); break; >+ case 'e': VALUE_APPEND(ESC_E); break; >+ case 'f': >+ case 'n': VALUE_APPEND(ESC_N); break; >+ case 'r': VALUE_APPEND(ESC_R); break; >+ case 't': VALUE_APPEND(ESC_T); break; >+ case 'v': VALUE_APPEND(ESC_V); break; >+ case '\n': wasnl = true; break; >+ default: VALUE_APPEND(INPUT); >+ } >+ NEXT_INPUT; >+ /* any amount of backslashes forbids portage to expand var */ >+ if(unlikely(INPUT == '$' && !wasnl)) { >+ VALUE_APPEND(INPUT); >+ NEXT_INPUT; >+ } >+ CHSTATE(VALUE_SINGLE_QUOTE); >+} >+ >+/** Cares about \\ in double-quote values. \n is ignored, known Portage escapes are handled >+ * and everything else is put into buffer without the \\. > * -> [RV] VALUE_DOUBLE_QUOTE */ > void VarsReader::DOUBLE_QUOTE_ESCAPE() > { >+ bool wasnl = false; >+ > switch(INPUT) { >- case '\n': break; >+ case 'a': VALUE_APPEND(ESC_A); break; >+ case 'b': VALUE_APPEND(ESC_B); break; >+ case 'e': VALUE_APPEND(ESC_E); break; >+ case 'f': >+ case 'n': VALUE_APPEND(ESC_N); break; >+ case 'r': VALUE_APPEND(ESC_R); break; >+ case 't': VALUE_APPEND(ESC_T); break; >+ case 'v': VALUE_APPEND(ESC_V); break; >+ case '\n': wasnl = true; break; >+ case '\\': >+ NEXT_INPUT; >+ switch(INPUT) { >+ case 'a': VALUE_APPEND(ESC_A); break; >+ case 'b': VALUE_APPEND(ESC_B); break; >+ case 'e': VALUE_APPEND(ESC_E); break; >+ case 'f': >+ case 'n': VALUE_APPEND(ESC_N); break; >+ case 'r': VALUE_APPEND(ESC_R); break; >+ case 't': VALUE_APPEND(ESC_T); break; >+ case 'v': VALUE_APPEND(ESC_V); break; >+ case '\n': wasnl = true; break; >+ case '\\': >+ VALUE_APPEND(INPUT); >+ NEXT_INPUT; >+ switch(INPUT) { >+ case '\\': break; >+ case '\n': VALUE_APPEND(ESC_SP); wasnl = true; break; >+ default: VALUE_APPEND(INPUT); >+ } >+ break; >+ default: VALUE_APPEND(INPUT); >+ } >+ break; > default: VALUE_APPEND(INPUT); > } >- NEXT_INPUT; >+ NEXT_INPUT_OR_EOF; >+ /* any amount of backslashes forbids portage to expand var */ >+ if(unlikely(INPUT == '$' && !wasnl)) { >+ VALUE_APPEND(INPUT); >+ NEXT_INPUT; >+ } > CHSTATE(VALUE_DOUBLE_QUOTE); > } > >-/** Cares about \\ in values without quotes. \n is ignored, everything else is put into buffer without >- * the \\. >+/** Cares about \\ in values without quotes. \n is ignored, known Portage escapes are handled >+ * and everything else is put into buffer without the \\. > * -> [RV] VALUE_WHITESPACE */ > void VarsReader::WHITESPACE_ESCAPE() > { > switch(INPUT) { > case '\n': break; >+ case '\\': >+ NEXT_INPUT; >+ if(INPUT == '\\') >+ NEXT_INPUT; >+ else if(INPUT == '\n') >+ VALUE_APPEND(ESC_BS); >+ switch(INPUT) { >+ case 'a': VALUE_APPEND(ESC_A); break; >+ case 'b': VALUE_APPEND(ESC_B); break; >+ case 'e': VALUE_APPEND(ESC_E); break; >+ case 'f': >+ case 'n': VALUE_APPEND(ESC_N); break; >+ case 'r': VALUE_APPEND(ESC_R); break; >+ case 't': VALUE_APPEND(ESC_T); break; >+ case 'v': VALUE_APPEND(ESC_V); break; >+ case '\n': break; >+ default: VALUE_APPEND(INPUT); >+ } >+ break; > default: VALUE_APPEND(INPUT); > } >- NEXT_INPUT; >+ NEXT_INPUT_OR_EOF; >+ /* any amount of backslashes forbids portage to expand var */ >+ if(INPUT == '$') { >+ VALUE_APPEND(INPUT); >+ NEXT_INPUT; >+ } > CHSTATE(VALUE_WHITESPACE); > } > >@@ -426,6 +548,7 @@ void VarsReader::runFsm() > case state_STOP: return; > case state_VALUE_WHITESPACE: VALUE_WHITESPACE(); break; > case state_VALUE_SINGLE_QUOTE: VALUE_SINGLE_QUOTE(); break; >+ case state_SINGLE_QUOTE_ESCAPE: SINGLE_QUOTE_ESCAPE(); break; > case state_DOUBLE_QUOTE_ESCAPE: DOUBLE_QUOTE_ESCAPE(); break; > case state_WHITESPACE_ESCAPE: WHITESPACE_ESCAPE(); break; > default: break; >Index: eixTk/varsreader.h >=================================================================== >--- eixTk/varsreader.h (revision 1047) >+++ eixTk/varsreader.h (working copy) >@@ -105,6 +105,7 @@ class VarsReader { > state_VALUE_SINGLE_QUOTE, > state_VALUE_DOUBLE_QUOTE, > state_VALUE_WHITESPACE, >+ state_SINGLE_QUOTE_ESCAPE, > state_DOUBLE_QUOTE_ESCAPE, > state_WHITESPACE_ESCAPE, > state_NOISE_ESCAPE,
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 316907
: 229005