Extend KMacroExpander for shell-expansion?

Andreas Pakulat apaku at gmx.de
Fri Jul 18 19:54:11 BST 2008


On 12.07.08 15:13:47, Oswald Buddenhagen wrote:
> On Sat, Jul 12, 2008 at 01:17:51AM +0200, Andreas Pakulat wrote:
> > FOOBAR=kde
> > MYVAR=$HOME/$FOOBAR/test
> 
> > Now I'm thinking this might be of interest for other people too and as
> > there's already expanding code in KMacroExpander I'm wondering wether I
> > should put a expandShellVariables() function into that namespace too. Or
> > should it rather go into KShell??
> > 
> the right place would be KShell for hopefully obvious reasons.

Yeah.

> simple unix-style variable expansion can be implemented rather trivially
> with KMacroExpander::expandMacros( str, var2valueMap, QLatin1Char('$') )
> (var2valueMap being pre-populated with the environment) or (more
> efficiently) by subclassing KWordMacroExpander.
> to make subsequent expansions possible, one could use
> expandMacrosShellQuote().

I have to admit that after looking through the API and implementation
I'm not quite sure how to properly implement something like this:

FOO=BAR
BAZ=$FOO
SOMEVAR=$BAZ

where I of course want SOMEVAR=BAR as result. The problem I'm having
here is that the list of variables I have as input is not ordered like
above. So when I do expand $BAZ via expandMacro the first time I get
$FOO. So I need to expand again. So the obvious way would be to re-run
the expandMacro until the expanded String doesn't change anymore.
However that bears the risk of getting infinite loops unless I'm wrong:

FOO=$BAR $FOO
BAR=F $FOO

In a shell the above case works because the shell immediately resolves
FOO to the empty string. But in my case I just have the list of these
two variables and need to do the expansion. Am I just missing something
or is there simply no way to do this?

> note that KMacroExpander is unfit to implement the totally braindead
> semantics of dos-style variable expansion - and i suppose we want to use
> platform-native expansions?

If possible I guess thats the "easiest way out"...

> i think one should introduce a VariableExpand flag to KShell::Options
> and pass that as an additional option to KShell::splitArgs().
> for the non-splitting variant, one should generalize the tildeExpand()
> function into an expand() function that takes an option field like
> splitArgs().

I think I understand. Will have a look and come up with a patch when I
find the time.

Andreas

-- 
You are deeply attached to your friends and acquaintances.




More information about the kde-core-devel mailing list