<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  
</head>
<body text="#000000" bgcolor="#ffffff">
<tt>Stefan Hajnoczi wrote:</tt>
<blockquote type="cite" cite="mid:1268560704-12411-1-git-send-email-stefanha@gmail.com">
  
  
  <title>[gPXE-devel] (no subject)</title>
<!-- Converted from text/plain format -->
  <p><tt><font size="2">The 'loopif' command does two things: a
conditional and a loop.&nbsp; I wanted to<br>
see how expensive a general form of control flow would be with if/goto.<br>
  </font></tt></p>
</blockquote>
<tt><br>
One of the ideas I had about 'loopif' was that one could have a
collection of specialized scripts and the top-level script could do
something like:<br>
<br>
#!gpxe<br>
set keep-running 1<br>
imgfree<br>
imgload ${next-script}.gpxe<br>
boot ${next-script}.gpxe<br>
loopif ${keep-running}<br>
<br>
Other scripts could then set next-script and keep-running as needed in
order to perform something akin to 'goto'.&nbsp; I really wanted to offer
something that could achieve flow control with minimal impact on gPXE
code size.&nbsp; Having said that...<br>
<br>
</tt>
<blockquote type="cite" cite="mid:1268560704-12411-1-git-send-email-stefanha@gmail.com">
  <p><tt><font size="2">Expressing 'loopif' using if/goto looks like
this:<br>
#!gpxe<br>
: start<br>
  </font></tt></p>
</blockquote>
<tt><br>
I totally agree that this is a nice form for the user to define a
'goto' point.<br>
<br>
</tt>
<blockquote type="cite" cite="mid:1268560704-12411-1-git-send-email-stefanha@gmail.com">
  <p><tt><font size="2">[...]<br>
if ${condition} goto start<br>
  <br>
The 'if' command can be used to predicate any command, not just a
'goto':<br>
if ${initrd} initrd ${initrd}<br>
  </font></tt></p>
</blockquote>
<tt><br>
Also totally agreed.&nbsp; If we ever have something akin to $(command)
where it expands to command's return code, this could stay the same,
too.<br>
<br>
</tt>
<blockquote type="cite" cite="mid:1268560704-12411-1-git-send-email-stefanha@gmail.com">
  <p><tt><font size="2">Similarly, 'goto' is its own command and can be
used independent of 'if':<br>
: loop<br>
[...]<br>
goto loop<br>
  </font></tt></p>
</blockquote>
<tt><br>
Agreed again.&nbsp; Once you have these, it would seem that gPXE has more to
offer to the sysadmin who wishes to support a variety of startup
strategies.&nbsp; The only "problem" I perceive is the unpopularity of
'goto' and labels amongst those who prefer less primitive flow control
semantics.&nbsp; It's not a problem for DOS batch files.&nbsp; Tracking named
labels suggests a bit more of a code cost than breaking out of a
"control block" or looping back to its beginning.&nbsp; Both can be
enjoyable. :)<br>
<br>
</tt>
<blockquote type="cite" cite="mid:1268560704-12411-1-git-send-email-stefanha@gmail.com">
  <p><tt><font size="2">The uncompressed code size of my 'ifgoto'
branch is +541 bytes:<br>
  <a href="http://git.etherboot.org/?p=people/stefanha/gpxe.git;a=shortlog;h=refs/heads/ifgoto" moz-do-not-send="true">http://git.etherboot.org/?p=people/stefanha/gpxe.git;a=shortlog;h=refs/heads/ifgoto</a><br>
  </font></tt></p>
</blockquote>
<tt><br>
While more expensive in code size than 'exit' and 'loopif', it's not
nearly as complicated for the script developer as the script I offered
way above.&nbsp; Although 'exit' and 'loopif' example scripts could be
offered on the wiki, who needs an example of ': label', 'goto' and
'if'?&nbsp; How much burden should be on the script developer versus on
gPXE's size? :)<br>
<br>
</tt>
<blockquote type="cite" cite="mid:1268560704-12411-1-git-send-email-stefanha@gmail.com">
  <p><tt><font size="2">(Note that we don't have expression evaluation
in mainline gPXE, so the 'if' command is not very useful yet.)<br>
  </font></tt></p>
</blockquote>
<tt><br>
Also true for 'loopif' at this time.&nbsp; We also don't have strtol() and
we don't have "%lu".&nbsp; Heheh.<br>
<br>
</tt>
<blockquote type="cite" cite="mid:1268560704-12411-1-git-send-email-stefanha@gmail.com">
  <p><tt><font size="2">The if/goto approach is not as nice as the
control flow (if, while, for, and try) that Lynus Vaz developed for his
Summer of Code project, but I am going to compare code size to see what
the difference is.<br>
  <br>
Thoughts?</font></tt></p>
</blockquote>
<tt><br>
Whatever we go with, if anything, hopefully it's easy to re-implement
if the script/CLI parsing system is ever rewritten entirely.<br>
<br>
Thanks for this, Stefan.<br>
<br>
- Shao Miller<br>
</tt>
</body>
</html>