package proxy;

use diagnostics;
use strict;
use run_program;
use common;
use log;
use c;


sub main {
    my ($prefix, $in) = @_;
    my $proxy_cfg = {};
    my $config_file = "$prefix/usr/lib/wgetrc";

    # grab current config
    foreach (cat_($config_file)) {
      /http_proxy = (http:.*):(\d+)/ and ($proxy_cfg->{http_url}, $proxy_cfg->{http_port}) = ($1, $2);
      /ftp_proxy = (ftp:.*):(\d+)/ and ($proxy_cfg->{ftp_url}, $proxy_cfg->{ftp_port}) = ($1, $2);
      /http_user = (.*)/ and ($proxy_cfg->{login}) = $1;
      if (/http_passwd = (.*)/) {
        ($proxy_cfg->{passwd}) = $1;
        ($proxy_cfg->{passwd2}) = $1;
      }
    }
  begin:
    $::isWizard = 1;
    $::Wizard_no_previous = 1;
    $in->ask_okcancel(_("Proxy configuration"),
                      _("Welcome to the proxy configuration utility.\n\nHere, you'll be able to set up your http and ftp proxies\nwith or without login and password\n"
                       ), 1);

    # http proxy
  step_http_proxy:
    undef $::Wizard_no_previous;
    $proxy_cfg->{http_url} ||= "http://www.proxy.com/";
    $in->ask_from(_("Proxy configuration"),
		  _("Please fill in the http proxy informations\nLeave it blank if you don't want an http proxy"),
		  [ { label => _("URL"), val => \$proxy_cfg->{http_url} },
		    { label => _("port"), val => \$proxy_cfg->{http_port} }
		  ],
		  complete => sub {
		      if ($proxy_cfg->{http_url} && $proxy_cfg->{http_url} !~ /^http:/) {
			  $in->ask_warn('', _("Url should begin with 'http:'"));
			  return (1,0);
		      }
		      if ($proxy_cfg->{http_port} && $proxy_cfg->{http_port} !~ /^\d+$/) {
			  $in->ask_warn('', _("The port part should be numeric"));
			  return (1,1);
		      }
		      0;
		  }
		 ) or goto begin;

    # ftp proxy
    step_ftp_proxy:
    $proxy_cfg->{ftp_url} ||= "ftp://ftp.proxy.com/";
    $in->ask_from(_("Proxy configuration"),
		  _("Please fill in the ftp proxy informations\nLeave it blank if you don't want an ftp proxy"),
		  [ { label => _("URL"), val => \$proxy_cfg->{ftp_url} },
		    { label => _("port"), val => \$proxy_cfg->{ftp_port} }
		  ],
		  complete => sub {
		      if ($proxy_cfg->{ftp_url} && $proxy_cfg->{ftp_url} !~ /^ftp:/) {
			  $in->ask_warn('', _("Url should begin with 'ftp:'"));
			  return (1,0);
		      }
		      if ($proxy_cfg->{ftp_port} && $proxy_cfg->{ftp_port} !~ /^\d+$/) {
			  $in->ask_warn('', _("The port part should be numeric"));
			  return (1,1);
		      }
		      0;
		  }
		 ) or goto step_http_proxy;

    # proxy login/passwd
    step_login:
    $in->ask_from(_("Proxy configuration"),
		  _("Please enter proxy login and password, if any.\nLeave it blank if you don't want login/passwd"),
		  [ { label => _("login"), val => \$proxy_cfg->{login} },
		    {
		     label => _("password"), val => \$proxy_cfg->{passwd}, hidden => 1 },
		    {
		     label => _("re-type password"), val => \$proxy_cfg->{passwd2}, hidden => 1 }
		  ],
		  complete => sub {
		      if ($proxy_cfg->{passwd} ne $proxy_cfg->{passwd2}) {
			  $in->ask_warn('', _("The passwords don't match. Try again!"));
			  return(1,1);
		      }
		      0;
		  }
		 ) or goto step_ftp_proxy;
    # save config
    substInFile {
        s/^(http|ftp)_proxy.*\n//;
        eof and $_ .= "http_proxy = $proxy_cfg->{http_url}:$proxy_cfg->{http_port}
ftp_proxy = $proxy_cfg->{ftp_url}:$proxy_cfg->{ftp_port}\n";
    } $config_file;
    $proxy_cfg->{login} and substInFile {
        s/^http_(user|passwd).*\n//;
        eof and $_ .= "http_user = $proxy_cfg->{login}
http_passwd = $proxy_cfg->{passwd}\n" } $config_file;
    log::l("[drakproxy] Installation complete, exiting\n");
}

#---------------------------------------------
#                WONDERFULL pad
#---------------------------------------------
1;
esignWork'>user/animtim/designWork</option>
<option value='user/colin/rescue-systemd'>user/colin/rescue-systemd</option>
<option value='user/ennael/mga6'>user/ennael/mga6</option>
<option value='user/erwan/bug-13680'>user/erwan/bug-13680</option>
<option value='user/jibz/aarch64'>user/jibz/aarch64</option>
<option value='user/martinw/mga6'>user/martinw/mga6</option>
<option value='user/pterjan/arm64'>user/pterjan/arm64</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>Mageia Installer and base platform for many utilities</td><td class='sub right'>Thierry Vignaud [tv]</td></tr></table>
<table class='tabs'><tr><td>
<a href='/software/drakx/?h=drakx-installer-images-2.88'>summary</a><a href='/software/drakx/refs/?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>refs</a><a href='/software/drakx/log/?h=drakx-installer-images-2.88'>log</a><a href='/software/drakx/tree/?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>tree</a><a class='active' href='/software/drakx/commit/?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>commit</a><a href='/software/drakx/diff/?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>diff</a><a href='/software/drakx/stats/?h=drakx-installer-images-2.88'>stats</a></td><td class='form'><form class='right' method='get' action='/software/drakx/log/'>
<input type='hidden' name='h' value='drakx-installer-images-2.88'/><input type='hidden' name='id' value='98a18b797c63ea9baab31768ed720ad32c0004e8'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='h' value='drakx-installer-images-2.88'/><input type='hidden' name='id' value='98a18b797c63ea9baab31768ed720ad32c0004e8'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><table summary='commit info' class='commit-info'>
<tr><th>author</th><td>Guillaume Cottenceau &lt;gc@mandriva.com&gt;</td><td class='right'>2001-05-14 21:47:42 +0000</td></tr>
<tr><th>committer</th><td>Guillaume Cottenceau &lt;gc@mandriva.com&gt;</td><td class='right'>2001-05-14 21:47:42 +0000</td></tr>
<tr><th>commit</th><td colspan='2' class='sha1'><a href='/software/drakx/commit/?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>98a18b797c63ea9baab31768ed720ad32c0004e8</a> (<a href='/software/drakx/patch/?id=98a18b797c63ea9baab31768ed720ad32c0004e8'>patch</a>)</td></tr>
<tr><th>tree</th><td colspan='2' class='sha1'><a href='/software/drakx/tree/?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>2d8b0d9e845b332060ac668a429ef65ca4c47ed1</a></td></tr>
<tr><th>parent</th><td colspan='2' class='sha1'><a href='/software/drakx/commit/?h=drakx-installer-images-2.88&amp;id=12cf594c688f3bc3e0b26d35305d5d6db7036fc4'>12cf594c688f3bc3e0b26d35305d5d6db7036fc4</a> (<a href='/software/drakx/diff/?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8&amp;id2=12cf594c688f3bc3e0b26d35305d5d6db7036fc4'>diff</a>)</td></tr><tr><th>download</th><td colspan='2' class='sha1'><a href='/software/drakx/snapshot/drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar'>drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar</a><br/><a href='/software/drakx/snapshot/drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar.gz'>drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar.gz</a><br/><a href='/software/drakx/snapshot/drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar.bz2'>drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar.bz2</a><br/><a href='/software/drakx/snapshot/drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar.xz'>drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.tar.xz</a><br/><a href='/software/drakx/snapshot/drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.zip'>drakx-98a18b797c63ea9baab31768ed720ad32c0004e8.zip</a><br/></td></tr></table>
<div class='commit-subject'>i can compile slang and newt with dietlibc now</div><div class='commit-msg'></div><div class='diffstat-header'><a href='/software/drakx/diff/?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>Diffstat</a></div><table summary='diffstat' class='diffstat'><tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/software/drakx/diff/mdk-stage1/Makefile?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/Makefile</a></td><td class='right'>19</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.1%;'/><td class='rem' style='width: 0.2%;'/><td class='none' style='width: 99.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='upd'><a href='/software/drakx/diff/mdk-stage1/newt-frontend.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt-frontend.c</a></td><td class='right'>2</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 100.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/Makefile?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/Makefile</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/button.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/button.c</a></td><td class='right'>190</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/buttonbar.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/buttonbar.c</a></td><td class='right'>46</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/checkbox.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/checkbox.c</a></td><td class='right'>290</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/checkboxtree.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/checkboxtree.c</a></td><td class='right'>714</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/entry.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/entry.c</a></td><td class='right'>376</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/form.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/form.c</a></td><td class='right'>712</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/grid.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/grid.c</a></td><td class='right'>389</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/label.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/label.c</a></td><td class='right'>81</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/listbox.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/listbox.c</a></td><td class='right'>752</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 86.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/newt.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt.c</a></td><td class='right'>672</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/newt.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt.h</a></td><td class='right'>362</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/newt_pr.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt_pr.h</a></td><td class='right'>82</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/scale.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/scale.c</a></td><td class='right'>72</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/scrollbar.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/scrollbar.c</a></td><td class='right'>124</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/textbox.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/textbox.c</a></td><td class='right'>409</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/newt/windows.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/windows.c</a></td><td class='right'>275</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/Makefile?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/Makefile</a></td><td class='right'>48</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/_slang.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/_slang.h</a></td><td class='right'>743</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 86.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/config.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/config.h</a></td><td class='right'>163</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/jdmacros.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/jdmacros.h</a></td><td class='right'>53</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/keywhash.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/keywhash.c</a></td><td class='right'>190</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sl-feat.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sl-feat.h</a></td><td class='right'>60</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slang.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slang.c</a></td><td class='right'>5547</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 100.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 0.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slang.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slang.h</a></td><td class='right'>1930</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 34.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 65.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slarith.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarith.c</a></td><td class='right'>1656</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 29.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 70.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slarith.inc?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarith.inc</a></td><td class='right'>783</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 14.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 85.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slarray.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarray.c</a></td><td class='right'>3139</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 56.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 43.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slarrfun.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarrfun.c</a></td><td class='right'>464</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slarrfun.inc?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarrfun.inc</a></td><td class='right'>257</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slarrmis.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarrmis.c</a></td><td class='right'>38</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slassoc.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slassoc.c</a></td><td class='right'>713</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slbstr.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slbstr.c</a></td><td class='right'>615</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 11.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 88.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slclass.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slclass.c</a></td><td class='right'>1391</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 25.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 74.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slcmd.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcmd.c</a></td><td class='right'>351</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slcmplex.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcmplex.c</a></td><td class='right'>1142</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 20.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 79.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slcompat.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcompat.c</a></td><td class='right'>34</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slcurses.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcurses.c</a></td><td class='right'>972</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 17.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 82.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slcurses.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcurses.h</a></td><td class='right'>353</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sldisply.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sldisply.c</a></td><td class='right'>2596</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 46.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 53.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slerr.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slerr.c</a></td><td class='right'>181</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slerrno.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slerrno.c</a></td><td class='right'>219</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slgetkey.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slgetkey.c</a></td><td class='right'>306</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slimport.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slimport.c</a></td><td class='right'>281</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slinclud.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slinclud.h</a></td><td class='right'>26</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slintall.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slintall.c</a></td><td class='right'>27</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slistruc.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slistruc.c</a></td><td class='right'>218</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 96.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slkeymap.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slkeymap.c</a></td><td class='right'>596</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slkeypad.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slkeypad.c</a></td><td class='right'>163</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sllimits.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sllimits.h</a></td><td class='right'>64</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmalloc.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmalloc.c</a></td><td class='right'>165</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 3.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmath.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmath.c</a></td><td class='right'>565</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmemchr.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemchr.c</a></td><td class='right'>47</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmemcmp.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemcmp.c</a></td><td class='right'>76</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmemcpy.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemcpy.c</a></td><td class='right'>49</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmemset.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemset.c</a></td><td class='right'>39</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slmisc.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmisc.c</a></td><td class='right'>330</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slnspace.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slnspace.c</a></td><td class='right'>242</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slospath.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slospath.c</a></td><td class='right'>73</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 1.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 98.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slpack.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slpack.c</a></td><td class='right'>785</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 14.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 85.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slparse.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slparse.c</a></td><td class='right'>1970</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 35.5%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 64.5%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slpath.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slpath.c</a></td><td class='right'>344</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slposdir.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slposdir.c</a></td><td class='right'>1057</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 19.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 80.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slposio.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slposio.c</a></td><td class='right'>568</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.2%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.8%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slprepr.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slprepr.c</a></td><td class='right'>427</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 7.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 92.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slproc.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slproc.c</a></td><td class='right'>155</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 2.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 97.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slregexp.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slregexp.c</a></td><td class='right'>935</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 16.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 83.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slrline.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slrline.c</a></td><td class='right'>836</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 15.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 84.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slscanf.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slscanf.c</a></td><td class='right'>718</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 12.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 87.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slscroll.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slscroll.c</a></td><td class='right'>450</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 8.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 91.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slsearch.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slsearch.c</a></td><td class='right'>239</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 4.3%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 95.7%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slsignal.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slsignal.c</a></td><td class='right'>336</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 6.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 93.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slsmg.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slsmg.c</a></td><td class='right'>1584</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 28.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 71.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slstd.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstd.c</a></td><td class='right'>724</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 13.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 86.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slstdio.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstdio.c</a></td><td class='right'>1050</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 18.9%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 81.1%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slstring.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstring.c</a></td><td class='right'>546</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 9.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 90.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slstrops.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstrops.c</a></td><td class='right'>1686</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 30.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 69.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slstruct.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstruct.c</a></td><td class='right'>932</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 16.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 83.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sltermin.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltermin.c</a></td><td class='right'>1155</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 20.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 79.2%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sltime.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltime.c</a></td><td class='right'>310</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 5.6%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 94.4%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sltoken.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltoken.c</a></td><td class='right'>1702</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 30.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 69.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/sltypes.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltypes.c</a></td><td class='right'>966</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 17.4%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 82.6%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slutty.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slutty.c</a></td><td class='right'>596</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 10.7%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 89.3%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/software/drakx/diff/mdk-stage1/slang/slxstrng.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slxstrng.c</a></td><td class='right'>43</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 0.8%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 99.2%;'/></tr></table></td></tr>
</table><div class='diffstat-summary'>86 files changed, 52622 insertions, 13 deletions</div><table summary='diff' class='diff'><tr><td><div class='head'>diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile<br/>index 9a3ecae43..96eade486 100644<br/>--- a/<a href='/software/drakx/tree/mdk-stage1/Makefile?h=drakx-installer-images-2.88&amp;id=12cf594c688f3bc3e0b26d35305d5d6db7036fc4'>mdk-stage1/Makefile</a><br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/Makefile?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/Makefile</a></div><div class='hunk'>@@ -47,22 +47,17 @@ INITOBJS = $(subst .c,.o,$(INITSRC))</div><div class='ctx'> </div><div class='ctx'>  #- frontends</div><div class='ctx'> NEWT_FRONTEND_SRC = newt-frontend.c</div><div class='del'>-NEWT_FRONTEND_LIBS = /usr/lib/libnewt.a /usr/lib/libslang.a</div><div class='add'>+GLIBC_NEWT_FRONTEND_LIBS = newt/libnewt.a slang/libslang.a</div><div class='add'>+DIETLIBC_NEWT_FRONTEND_LIBS = $(subst .a,-DIET.a,$(GLIBC_NEWT_FRONTEND_LIBS))</div><div class='ctx'> </div><div class='ctx'> STDIO_FRONTEND_SRC = stdio-frontend.c</div><div class='del'>-STDIO_FRONTEND_LIBS =</div><div class='add'>+GLIBC_STDIO_FRONTEND_LIBS =</div><div class='add'>+DIETLIBC_STDIO_FRONTEND_LIBS =</div><div class='ctx'> </div><div class='ctx'> </div><div class='ctx'> FRONTEND_OBJS = $(subst .c,.o,$($(F)_FRONTEND_SRC))</div><div class='del'>-FRONTEND_LIBS = $($(F)_FRONTEND_LIBS)</div><div class='ctx'> </div><div class='del'>-FRONTEND_LINK = $(FRONTEND_OBJS) $(FRONTEND_LIBS)</div><div class='del'>-</div><div class='del'>-ifeq (DIETLIBC, $(L))</div><div class='del'>-ifeq (NEWT, $(F))</div><div class='del'>-FRONTEND_LINK = $(subst .c,.o,$(STDIO_FRONTEND_SRC)) $(STDIO_FRONTEND_LIBS)</div><div class='del'>-endif</div><div class='del'>-endif</div><div class='add'>+FRONTEND_LINK = $(FRONTEND_OBJS) $($(L)_$(F)_FRONTEND_LIBS)</div><div class='ctx'> </div><div class='ctx'> ifeq (i386, $(ARCH))</div><div class='ctx'> INSMOD = insmod-busybox</div><div class='hunk'>@@ -71,7 +66,7 @@ INSMOD = insmod-modutils</div><div class='ctx'> endif</div><div class='ctx'> </div><div class='ctx'> GLIBC_STAGE1_OWN_LIBS = $(INSMOD)/libinsmod.a mar/libmar.a bzlib/libbzlib.a</div><div class='del'>-DIETLIBC_STAGE1_OWN_LIBS = $(INSMOD)/libinsmod-DIET.a mar/libmar-DIET.a bzlib/libbzlib-DIET.a</div><div class='add'>+DIETLIBC_STAGE1_OWN_LIBS = $(subst .a,-DIET.a,$(GLIBC_STAGE1_OWN_LIBS))</div><div class='ctx'> STAGE1_OWN_LIBS = $($(L)_STAGE1_OWN_LIBS)</div><div class='ctx'> </div><div class='ctx'> </div><div class='hunk'>@@ -125,7 +120,7 @@ BINS += stage1-cdrom stage1-disk stage1-network</div><div class='ctx'> endif</div><div class='ctx'> </div><div class='ctx'> </div><div class='del'>-DIRS = dietlibc mar pci-resource bzlib $(INSMOD)</div><div class='add'>+DIRS = dietlibc mar pci-resource bzlib $(INSMOD) slang newt</div><div class='ctx'> ifeq (i386,$(ARCH))</div><div class='ctx'> DIRS += pcmcia</div><div class='ctx'> endif</div><div class='head'>diff --git a/mdk-stage1/newt-frontend.c b/mdk-stage1/newt-frontend.c<br/>index 85f56ec10..867a6d7f1 100644<br/>--- a/<a href='/software/drakx/tree/mdk-stage1/newt-frontend.c?h=drakx-installer-images-2.88&amp;id=12cf594c688f3bc3e0b26d35305d5d6db7036fc4'>mdk-stage1/newt-frontend.c</a><br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt-frontend.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt-frontend.c</a></div><div class='hunk'>@@ -33,7 +33,7 @@</div><div class='ctx'> #include &lt;sys/time.h&gt;</div><div class='ctx'> #include "stage1.h"</div><div class='ctx'> #include "log.h"</div><div class='del'>-#include "newt.h"</div><div class='add'>+#include "newt/newt.h"</div><div class='ctx'> </div><div class='ctx'> #include "frontend.h"</div><div class='ctx'> </div><div class='head'>diff --git a/mdk-stage1/newt/Makefile b/mdk-stage1/newt/Makefile<br/>new file mode 100644<br/>index 000000000..c4e6a7207<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/Makefile?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/Makefile</a></div><div class='hunk'>@@ -0,0 +1,49 @@</div><div class='add'>+ #******************************************************************************</div><div class='add'>+ #</div><div class='add'>+ # Guillaume Cottenceau (gc@mandrakesoft.com)</div><div class='add'>+ #</div><div class='add'>+ # Copyright 2000 MandrakeSoft</div><div class='add'>+ #</div><div class='add'>+ # This software may be freely redistributed under the terms of the GNU</div><div class='add'>+ # public license.</div><div class='add'>+ #</div><div class='add'>+ # You should have received a copy of the GNU General Public License</div><div class='add'>+ # along with this program; if not, write to the Free Software</div><div class='add'>+ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.</div><div class='add'>+ #</div><div class='add'>+ #*****************************************************************************</div><div class='add'>+</div><div class='add'>+top_dir = ..</div><div class='add'>+</div><div class='add'>+include $(top_dir)/Makefile.common</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+all: libnewt.a libnewt-DIET.a</div><div class='add'>+</div><div class='add'>+clean:</div><div class='add'>+	rm -f *.o *.a</div><div class='add'>+</div><div class='add'>+FLAGS = -Wall -Werror -Os -fomit-frame-pointer -DVERSION=\"0.50.19\" -c</div><div class='add'>+</div><div class='add'>+INCS = -I../slang</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+OBJS = newt.o button.o form.o checkbox.o entry.o label.o listbox.o scrollbar.o textbox.o scale.o grid.o windows.o buttonbar.o checkboxtree.o</div><div class='add'>+OBJS-DIET = $(subst .o,-DIET.o,$(OBJS))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+libnewt.a: $(OBJS)</div><div class='add'>+	ar -cru $@ $^</div><div class='add'>+	ranlib $@</div><div class='add'>+</div><div class='add'>+libnewt-DIET.a: $(OBJS-DIET)</div><div class='add'>+	ar -cru $@ $^</div><div class='add'>+	ranlib $@</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+$(OBJS): %.o: %.c</div><div class='add'>+	gcc $(FLAGS) $(GLIBC_INCLUDES) $(INCS) -c $&lt; -o $@</div><div class='add'>+</div><div class='add'>+$(OBJS-DIET): %-DIET.o: %.c</div><div class='add'>+	gcc $(FLAGS)  $(DIETLIBC_INCLUDES) $(INCS) -c $&lt; -o $@</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/newt/button.c b/mdk-stage1/newt/button.c<br/>new file mode 100644<br/>index 000000000..1ff360dc5<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/button.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/button.c</a></div><div class='hunk'>@@ -0,0 +1,190 @@</div><div class='add'>+#include &lt;slang.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct button {</div><div class='add'>+    char * text;</div><div class='add'>+    int compact;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void buttonDrawIt(newtComponent co, int active, int pushed);</div><div class='add'>+static void buttonDrawText(newtComponent co, int active, int pushed);</div><div class='add'>+</div><div class='add'>+static void buttonDraw(newtComponent c);</div><div class='add'>+static void buttonDestroy(newtComponent co);</div><div class='add'>+static struct eventResult buttonEvent(newtComponent c,</div><div class='add'>+				      struct event ev);</div><div class='add'>+static void buttonPlace(newtComponent co, int newLeft, int newTop);</div><div class='add'>+</div><div class='add'>+static struct componentOps buttonOps = {</div><div class='add'>+    buttonDraw,</div><div class='add'>+    buttonEvent,</div><div class='add'>+    buttonDestroy,</div><div class='add'>+    buttonPlace,</div><div class='add'>+    newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+static newtComponent createButton(int left, int row, const char * text, int compact) {</div><div class='add'>+    newtComponent co;</div><div class='add'>+    struct button * bu;</div><div class='add'>+</div><div class='add'>+    co = malloc(sizeof(*co));</div><div class='add'>+    bu = malloc(sizeof(struct button));</div><div class='add'>+    co-&gt;data = bu;</div><div class='add'>+</div><div class='add'>+    bu-&gt;text = strdup(text);</div><div class='add'>+    bu-&gt;compact = compact;</div><div class='add'>+    co-&gt;ops = &amp;buttonOps;</div><div class='add'>+</div><div class='add'>+    if (bu-&gt;compact) {</div><div class='add'>+	co-&gt;height = 1;</div><div class='add'>+	co-&gt;width = strlen(text) + 3;</div><div class='add'>+    } else {</div><div class='add'>+	co-&gt;height = 4;</div><div class='add'>+	co-&gt;width = strlen(text) + 5;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    co-&gt;top = row;</div><div class='add'>+    co-&gt;left = left;</div><div class='add'>+    co-&gt;takesFocus = 1;</div><div class='add'>+    co-&gt;isMapped = 0;</div><div class='add'>+</div><div class='add'>+    newtGotorc(co-&gt;top, co-&gt;left);</div><div class='add'>+</div><div class='add'>+    return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtCompactButton(int left, int row, const char * text) {</div><div class='add'>+    return createButton(left, row, text, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtButton(int left, int row, const char * text) {</div><div class='add'>+    return createButton(left, row, text, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void buttonDestroy(newtComponent co) {</div><div class='add'>+    struct button * bu = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    free(bu-&gt;text);</div><div class='add'>+    free(bu);</div><div class='add'>+    free(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void buttonPlace(newtComponent co, int newLeft, int newTop) {</div><div class='add'>+    co-&gt;top = newTop;</div><div class='add'>+    co-&gt;left = newLeft;</div><div class='add'>+</div><div class='add'>+    newtGotorc(co-&gt;top, co-&gt;left);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void buttonDraw(newtComponent co) {</div><div class='add'>+    buttonDrawIt(co, 0, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void buttonDrawIt(newtComponent co, int active, int pushed) {</div><div class='add'>+    struct button * bu = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (!co-&gt;isMapped) return;</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(NEWT_COLORSET_BUTTON);</div><div class='add'>+</div><div class='add'>+    if (bu-&gt;compact) {</div><div class='add'>+	if (active)</div><div class='add'>+	    SLsmg_set_color(NEWT_COLORSET_COMPACTBUTTON);</div><div class='add'>+	else</div><div class='add'>+	    SLsmg_set_color(NEWT_COLORSET_BUTTON);</div><div class='add'>+	newtGotorc(co-&gt;top+ pushed, co-&gt;left + 1 + pushed);</div><div class='add'>+	SLsmg_write_char('&lt;');</div><div class='add'>+	SLsmg_write_string(bu-&gt;text);</div><div class='add'>+	SLsmg_write_char('&gt;');</div><div class='add'>+    } else {</div><div class='add'>+	if (pushed) {</div><div class='add'>+	    SLsmg_set_color(NEWT_COLORSET_BUTTON);</div><div class='add'>+	    newtDrawBox(co-&gt;left + 1, co-&gt;top + 1, co-&gt;width - 1, 3, 0);</div><div class='add'>+</div><div class='add'>+	    SLsmg_set_color(NEWT_COLORSET_WINDOW);</div><div class='add'>+	    newtClearBox(co-&gt;left, co-&gt;top, co-&gt;width, 1);</div><div class='add'>+	    newtClearBox(co-&gt;left, co-&gt;top, 1, co-&gt;height);</div><div class='add'>+	} else {</div><div class='add'>+	    newtDrawBox(co-&gt;left, co-&gt;top, co-&gt;width - 1, 3, 1);</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	buttonDrawText(co, active, pushed);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void buttonDrawText(newtComponent co, int active, int pushed) {</div><div class='add'>+    struct button * bu = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (pushed) pushed = 1;</div><div class='add'>+</div><div class='add'>+    if (active)</div><div class='add'>+	SLsmg_set_color(NEWT_COLORSET_ACTBUTTON);</div><div class='add'>+    else</div><div class='add'>+	SLsmg_set_color(NEWT_COLORSET_BUTTON);</div><div class='add'>+</div><div class='add'>+    newtGotorc(co-&gt;top + 1 + pushed, co-&gt;left + 1 + pushed);</div><div class='add'>+    SLsmg_write_char(' ');</div><div class='add'>+    SLsmg_write_string(bu-&gt;text);</div><div class='add'>+    SLsmg_write_char(' ');</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult buttonEvent(newtComponent co,</div><div class='add'>+				      struct event ev) {</div><div class='add'>+    struct eventResult er;</div><div class='add'>+    struct button * bu = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (ev.when == EV_NORMAL) {</div><div class='add'>+	switch (ev.event) {</div><div class='add'>+	  case EV_FOCUS:</div><div class='add'>+	    buttonDrawIt(co, 1, 0);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case EV_UNFOCUS:</div><div class='add'>+	    buttonDrawIt(co, 0, 0);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case EV_KEYPRESS:</div><div class='add'>+	    if (ev.u.key == ' ' || ev.u.key == '\r') {</div><div class='add'>+		if (!bu-&gt;compact) {</div><div class='add'>+		    /* look pushed */</div><div class='add'>+		    buttonDrawIt(co, 1, 1);</div><div class='add'>+		    newtRefresh();</div><div class='add'>+		    newtDelay(150000);</div><div class='add'>+		    buttonDrawIt(co, 1, 0);</div><div class='add'>+		    newtRefresh();</div><div class='add'>+		    newtDelay(150000);</div><div class='add'>+		}</div><div class='add'>+</div><div class='add'>+		er.result = ER_EXITFORM;</div><div class='add'>+	    } else</div><div class='add'>+		er.result = ER_IGNORED;</div><div class='add'>+	    break;</div><div class='add'>+	  case EV_MOUSE:</div><div class='add'>+	      if (ev.u.mouse.type == MOUSE_BUTTON_DOWN &amp;&amp;</div><div class='add'>+		  co-&gt;top &lt;= ev.u.mouse.y &amp;&amp;</div><div class='add'>+		  co-&gt;top + co-&gt;height - !bu-&gt;compact &gt; ev.u.mouse.y &amp;&amp;</div><div class='add'>+		  co-&gt;left &lt;= ev.u.mouse.x &amp;&amp;</div><div class='add'>+		  co-&gt;left + co-&gt;width - !bu-&gt;compact &gt; ev.u.mouse.x) {</div><div class='add'>+		  if (!bu-&gt;compact) {</div><div class='add'>+		      buttonDrawIt(co, 1, 1);</div><div class='add'>+		      newtRefresh();</div><div class='add'>+		      newtDelay(150000);</div><div class='add'>+		      buttonDrawIt(co, 1, 0);</div><div class='add'>+		      newtRefresh();</div><div class='add'>+		      newtDelay(150000);</div><div class='add'>+		  }</div><div class='add'>+		  er.result = ER_EXITFORM;</div><div class='add'>+	      }</div><div class='add'>+	    break;</div><div class='add'>+	}</div><div class='add'>+    } else</div><div class='add'>+	er.result = ER_IGNORED;</div><div class='add'>+</div><div class='add'>+    return er;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/buttonbar.c b/mdk-stage1/newt/buttonbar.c<br/>new file mode 100644<br/>index 000000000..45473c9d2<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/buttonbar.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/buttonbar.c</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+</div><div class='add'>+/* if they try and pack more then 50 buttons, screw 'em */</div><div class='add'>+newtGrid newtButtonBarv(char * button1, newtComponent * b1comp, va_list args) {</div><div class='add'>+    newtGrid grid;</div><div class='add'>+    struct buttonInfo {</div><div class='add'>+	char * name;</div><div class='add'>+	newtComponent * compPtr;</div><div class='add'>+    } buttons[50];</div><div class='add'>+    int num;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    buttons[0].name = button1, buttons[0].compPtr = b1comp, num = 1;</div><div class='add'>+    while (1) {</div><div class='add'>+	buttons[num].name = va_arg(args, char *);</div><div class='add'>+	if (!buttons[num].name) break;</div><div class='add'>+	buttons[num].compPtr = va_arg(args, newtComponent *);</div><div class='add'>+	num++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    grid = newtCreateGrid(num, 1);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; num; i++) {</div><div class='add'>+	*buttons[i].compPtr = newtButton(-1, -1, buttons[i].name);</div><div class='add'>+	newtGridSetField(grid, i, 0, NEWT_GRID_COMPONENT, </div><div class='add'>+			 *buttons[i].compPtr,</div><div class='add'>+			 num ? 1 : 0, 0, 0, 0, 0, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtButtonBar(char * button1, newtComponent * b1comp, ...) {</div><div class='add'>+    va_list args;</div><div class='add'>+    newtGrid grid;</div><div class='add'>+</div><div class='add'>+    va_start(args, b1comp);</div><div class='add'>+</div><div class='add'>+    grid = newtButtonBarv(button1, b1comp, args);</div><div class='add'>+</div><div class='add'>+    va_end(args);</div><div class='add'>+ </div><div class='add'>+    return grid;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/checkbox.c b/mdk-stage1/newt/checkbox.c<br/>new file mode 100644<br/>index 000000000..eee514c98<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/checkbox.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/checkbox.c</a></div><div class='hunk'>@@ -0,0 +1,290 @@</div><div class='add'>+#include &lt;slang.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+enum type { CHECK, RADIO };</div><div class='add'>+</div><div class='add'>+struct checkbox {</div><div class='add'>+    char * text;</div><div class='add'>+    char * seq;</div><div class='add'>+    char * result;</div><div class='add'>+    newtComponent prevButton, lastButton;</div><div class='add'>+    enum type type;</div><div class='add'>+    char value;</div><div class='add'>+    int active, inactive;</div><div class='add'>+    const void * data;</div><div class='add'>+    int flags;</div><div class='add'>+    int hasFocus;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void makeActive(newtComponent co);</div><div class='add'>+</div><div class='add'>+static void cbDraw(newtComponent c);</div><div class='add'>+static void cbDestroy(newtComponent co);</div><div class='add'>+struct eventResult cbEvent(newtComponent co, struct event ev);</div><div class='add'>+</div><div class='add'>+static struct componentOps cbOps = {</div><div class='add'>+    cbDraw,</div><div class='add'>+    cbEvent,</div><div class='add'>+    cbDestroy,</div><div class='add'>+    newtDefaultPlaceHandler,</div><div class='add'>+    newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+newtComponent newtRadiobutton(int left, int top, const char * text, int isDefault,</div><div class='add'>+			      newtComponent prevButton) {</div><div class='add'>+    newtComponent co;</div><div class='add'>+    newtComponent curr;</div><div class='add'>+    struct checkbox * rb;</div><div class='add'>+    char initialValue;</div><div class='add'>+</div><div class='add'>+    if (isDefault)</div><div class='add'>+	initialValue = '*';</div><div class='add'>+    else</div><div class='add'>+	initialValue = ' ';</div><div class='add'>+</div><div class='add'>+    co = newtCheckbox(left, top, text, initialValue, " *", NULL);</div><div class='add'>+    rb = co-&gt;data;</div><div class='add'>+    rb-&gt;type = RADIO;</div><div class='add'>+</div><div class='add'>+    rb-&gt;prevButton = prevButton;</div><div class='add'>+</div><div class='add'>+    for (curr = co; curr; curr = rb-&gt;prevButton) {</div><div class='add'>+	rb = curr-&gt;data;</div><div class='add'>+	rb-&gt;lastButton = co;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtRadioGetCurrent(newtComponent setMember) {</div><div class='add'>+    struct checkbox * rb = setMember-&gt;data;</div><div class='add'>+</div><div class='add'>+    setMember = rb-&gt;lastButton;</div><div class='add'>+    rb = setMember-&gt;data;</div><div class='add'>+</div><div class='add'>+    while (rb &amp;&amp; rb-&gt;value != '*') {</div><div class='add'>+	setMember = rb-&gt;prevButton;</div><div class='add'>+	if (!setMember)</div><div class='add'>+	  return NULL;</div><div class='add'>+	rb = setMember-&gt;data;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return setMember;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char newtCheckboxGetValue(newtComponent co) {</div><div class='add'>+    struct checkbox * cb = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    return cb-&gt;value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCheckboxSetValue(newtComponent co, char value) {</div><div class='add'>+    struct checkbox * cb = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    *cb-&gt;result = value;</div><div class='add'>+    cbDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtCheckbox(int left, int top, const char * text, char defValue,</div><div class='add'>+			   const char * seq, char * result) {</div><div class='add'>+    newtComponent co;</div><div class='add'>+    struct checkbox * cb;</div><div class='add'>+</div><div class='add'>+    if (!seq) seq = " *";</div><div class='add'>+</div><div class='add'>+    co = malloc(sizeof(*co));</div><div class='add'>+    cb = malloc(sizeof(struct checkbox));</div><div class='add'>+    co-&gt;data = cb;</div><div class='add'>+    cb-&gt;flags = 0;</div><div class='add'>+    if (result)</div><div class='add'>+	cb-&gt;result = result;</div><div class='add'>+    else</div><div class='add'>+	cb-&gt;result = &amp;cb-&gt;value;</div><div class='add'>+</div><div class='add'>+    cb-&gt;text = strdup(text);</div><div class='add'>+    cb-&gt;seq = strdup(seq);</div><div class='add'>+    cb-&gt;type = CHECK;</div><div class='add'>+    cb-&gt;hasFocus = 0;</div><div class='add'>+    cb-&gt;inactive = COLORSET_CHECKBOX;</div><div class='add'>+    cb-&gt;active = COLORSET_ACTCHECKBOX;</div><div class='add'>+    defValue ? (*cb-&gt;result = defValue) : (*cb-&gt;result = cb-&gt;seq[0]);</div><div class='add'>+</div><div class='add'>+    co-&gt;ops = &amp;cbOps;</div><div class='add'>+</div><div class='add'>+    co-&gt;callback = NULL;</div><div class='add'>+    co-&gt;height = 1;</div><div class='add'>+    co-&gt;width = strlen(text) + 4;</div><div class='add'>+    co-&gt;top = top;</div><div class='add'>+    co-&gt;left = left;</div><div class='add'>+    co-&gt;takesFocus = 1;</div><div class='add'>+</div><div class='add'>+    return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCheckboxSetFlags(newtComponent co, int flags, enum newtFlagsSense sense) {</div><div class='add'>+    struct checkbox * cb = co-&gt;data;</div><div class='add'>+    int row, col;</div><div class='add'>+</div><div class='add'>+    cb-&gt;flags = newtSetFlags(cb-&gt;flags, flags, sense);</div><div class='add'>+</div><div class='add'>+    if (!(cb-&gt;flags &amp; NEWT_FLAG_DISABLED))</div><div class='add'>+	co-&gt;takesFocus = 1;</div><div class='add'>+    else</div><div class='add'>+	co-&gt;takesFocus = 0;</div><div class='add'>+</div><div class='add'>+    newtGetrc(&amp;row, &amp;col);</div><div class='add'>+    cbDraw(co);</div><div class='add'>+    newtGotorc(row, col);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void cbDraw(newtComponent c) {</div><div class='add'>+    struct checkbox * cb = c-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (c-&gt;top == -1 || !c-&gt;isMapped) return;</div><div class='add'>+</div><div class='add'>+    if (cb-&gt;flags &amp; NEWT_FLAG_DISABLED) {</div><div class='add'>+	cb-&gt;inactive = NEWT_COLORSET_DISENTRY;</div><div class='add'>+	cb-&gt;active = NEWT_COLORSET_DISENTRY;</div><div class='add'>+    } else {</div><div class='add'>+	cb-&gt;inactive = COLORSET_CHECKBOX;</div><div class='add'>+	cb-&gt;active = COLORSET_ACTCHECKBOX;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(cb-&gt;inactive);</div><div class='add'>+</div><div class='add'>+    newtGotorc(c-&gt;top, c-&gt;left);</div><div class='add'>+</div><div class='add'>+    switch (cb-&gt;type) {</div><div class='add'>+      case RADIO:</div><div class='add'>+	SLsmg_write_string("( ) ");</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case CHECK:</div><div class='add'>+	SLsmg_write_string("[ ] ");</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SLsmg_write_string(cb-&gt;text);</div><div class='add'>+</div><div class='add'>+    if (cb-&gt;hasFocus)</div><div class='add'>+	SLsmg_set_color(cb-&gt;active);</div><div class='add'>+</div><div class='add'>+    newtGotorc(c-&gt;top, c-&gt;left + 1);</div><div class='add'>+    SLsmg_write_char(*cb-&gt;result);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void cbDestroy(newtComponent co) {</div><div class='add'>+    struct checkbox * cb = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    free(cb-&gt;text);</div><div class='add'>+    free(cb-&gt;seq);</div><div class='add'>+    free(cb);</div><div class='add'>+    free(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct eventResult cbEvent(newtComponent co, struct event ev) {</div><div class='add'>+    struct checkbox * cb = co-&gt;data;</div><div class='add'>+    struct eventResult er;</div><div class='add'>+    const char * cur;</div><div class='add'>+</div><div class='add'>+    if (ev.when == EV_NORMAL) {</div><div class='add'>+	switch (ev.event) {</div><div class='add'>+	  case EV_FOCUS:</div><div class='add'>+	    cb-&gt;hasFocus = 1;</div><div class='add'>+	    cbDraw(co);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case EV_UNFOCUS:</div><div class='add'>+	    cb-&gt;hasFocus = 0;</div><div class='add'>+	    cbDraw(co);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case EV_KEYPRESS:</div><div class='add'>+	    if (ev.u.key == ' ') {</div><div class='add'>+		if (cb-&gt;type == RADIO) {</div><div class='add'>+		    makeActive(co);</div><div class='add'>+		} else if (cb-&gt;type == CHECK) {</div><div class='add'>+		    cur = strchr(cb-&gt;seq, *cb-&gt;result);</div><div class='add'>+		    if (!cur)</div><div class='add'>+			*cb-&gt;result = *cb-&gt;seq;</div><div class='add'>+		    else {</div><div class='add'>+			cur++;</div><div class='add'>+			if (! *cur)</div><div class='add'>+			    *cb-&gt;result = *cb-&gt;seq;</div><div class='add'>+			else</div><div class='add'>+			    *cb-&gt;result = *cur;</div><div class='add'>+		    }</div><div class='add'>+		    cbDraw(co);</div><div class='add'>+		    er.result = ER_SWALLOWED;</div><div class='add'>+</div><div class='add'>+		    if (co-&gt;callback)</div><div class='add'>+			co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+		} else {</div><div class='add'>+		    er.result = ER_IGNORED;</div><div class='add'>+		}</div><div class='add'>+	    } else if(ev.u.key == NEWT_KEY_ENTER) {</div><div class='add'>+		er.result = ER_IGNORED;</div><div class='add'>+	    } else {</div><div class='add'>+		er.result = ER_IGNORED;</div><div class='add'>+	    }</div><div class='add'>+	    break;</div><div class='add'>+   	  case EV_MOUSE:</div><div class='add'>+	    if (ev.u.mouse.type == MOUSE_BUTTON_DOWN) {</div><div class='add'>+		if (cb-&gt;type == RADIO) {</div><div class='add'>+		    makeActive(co);</div><div class='add'>+		} else if (cb-&gt;type == CHECK) {</div><div class='add'>+		    cur = strchr(cb-&gt;seq, *cb-&gt;result);</div><div class='add'>+		    if (!cur)</div><div class='add'>+			*cb-&gt;result = *cb-&gt;seq;</div><div class='add'>+		    else {</div><div class='add'>+			cur++;</div><div class='add'>+			if (! *cur)</div><div class='add'>+			    *cb-&gt;result = *cb-&gt;seq;</div><div class='add'>+			else</div><div class='add'>+			    *cb-&gt;result = *cur;</div><div class='add'>+		    }</div><div class='add'>+		    cbDraw(co);</div><div class='add'>+		    er.result = ER_SWALLOWED;</div><div class='add'>+</div><div class='add'>+		    if (co-&gt;callback)</div><div class='add'>+			co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+		}</div><div class='add'>+	    }</div><div class='add'>+	}</div><div class='add'>+    } else</div><div class='add'>+	er.result = ER_IGNORED;</div><div class='add'>+</div><div class='add'>+    return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void makeActive(newtComponent co) {</div><div class='add'>+    struct checkbox * cb = co-&gt;data;</div><div class='add'>+    struct checkbox * rb;</div><div class='add'>+    newtComponent curr;</div><div class='add'>+</div><div class='add'>+    /* find the one that's turned off */</div><div class='add'>+    curr = cb-&gt;lastButton;</div><div class='add'>+    rb = curr-&gt;data;</div><div class='add'>+    while (curr &amp;&amp; rb-&gt;value == rb-&gt;seq[0]) {</div><div class='add'>+	curr = rb-&gt;prevButton;</div><div class='add'>+	if (curr) rb = curr-&gt;data;</div><div class='add'>+    }</div><div class='add'>+    if (curr) {</div><div class='add'>+	rb-&gt;value = rb-&gt;seq[0];</div><div class='add'>+	cbDraw(curr);</div><div class='add'>+    }</div><div class='add'>+    cb-&gt;value = cb-&gt;seq[1];</div><div class='add'>+    cbDraw(co);</div><div class='add'>+</div><div class='add'>+    if (co-&gt;callback)</div><div class='add'>+	co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/checkboxtree.c b/mdk-stage1/newt/checkboxtree.c<br/>new file mode 100644<br/>index 000000000..b56bd1e9f<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/checkboxtree.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/checkboxtree.c</a></div><div class='hunk'>@@ -0,0 +1,714 @@</div><div class='add'>+#include &lt;slang.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct items {</div><div class='add'>+    char * text;</div><div class='add'>+    const void *data;</div><div class='add'>+    unsigned char selected;</div><div class='add'>+    struct items *next;</div><div class='add'>+    struct items *prev;</div><div class='add'>+    struct items *branch;</div><div class='add'>+    int flags;</div><div class='add'>+    int depth;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct CheckboxTree {</div><div class='add'>+    newtComponent sb;</div><div class='add'>+    int curWidth;	/* size of text w/o scrollbar or border*/</div><div class='add'>+    int curHeight;	/* size of text w/o border */</div><div class='add'>+    struct items * itemlist;</div><div class='add'>+    struct items ** flatList, ** currItem, ** firstItem;</div><div class='add'>+    int flatCount;</div><div class='add'>+    int flags;</div><div class='add'>+    int pad;</div><div class='add'>+    char * seq;</div><div class='add'>+    char * result;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void ctDraw(newtComponent c);</div><div class='add'>+static void ctDestroy(newtComponent co);</div><div class='add'>+static void ctPlace(newtComponent co, int newLeft, int newTop);</div><div class='add'>+struct eventResult ctEvent(newtComponent co, struct event ev);</div><div class='add'>+static void ctMapped(newtComponent co, int isMapped);</div><div class='add'>+static struct items * findItem(struct items * items, const void * data);</div><div class='add'>+static void buildFlatList(newtComponent co);</div><div class='add'>+static void doBuildFlatList(struct CheckboxTree * ct, struct items * item);</div><div class='add'>+enum countWhat { COUNT_EXPOSED=0, COUNT_SELECTED=1 };</div><div class='add'>+static int countItems(struct items * item, enum countWhat justExposed);</div><div class='add'>+</div><div class='add'>+static struct componentOps ctOps = {</div><div class='add'>+    ctDraw,</div><div class='add'>+    ctEvent,</div><div class='add'>+    ctDestroy,</div><div class='add'>+    ctPlace,</div><div class='add'>+    ctMapped,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+static int countItems(struct items * item, enum countWhat what) {</div><div class='add'>+    int count = 0;</div><div class='add'>+</div><div class='add'>+    while (item) {</div><div class='add'>+        if ((!item-&gt;branch &amp;&amp; item-&gt;selected == what) || (what == COUNT_EXPOSED))</div><div class='add'>+	    count++;</div><div class='add'>+	if (item-&gt;branch || (what == COUNT_EXPOSED &amp;&amp; item-&gt;selected))</div><div class='add'>+	    count += countItems(item-&gt;branch, what);</div><div class='add'>+	item = item-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return count;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void doBuildFlatList(struct CheckboxTree * ct, struct items * item) {</div><div class='add'>+    while (item) {</div><div class='add'>+    	ct-&gt;flatList[ct-&gt;flatCount++] = item;</div><div class='add'>+	if (item-&gt;branch &amp;&amp; item-&gt;selected) doBuildFlatList(ct, item-&gt;branch);</div><div class='add'>+	item = item-&gt;next;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void buildFlatList(newtComponent co) {</div><div class='add'>+    struct CheckboxTree * ct = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (ct-&gt;flatList) free(ct-&gt;flatList);</div><div class='add'>+    ct-&gt;flatCount = countItems(ct-&gt;itemlist, COUNT_EXPOSED);</div><div class='add'>+</div><div class='add'>+    ct-&gt;flatList = malloc(sizeof(*ct-&gt;flatList) * (ct-&gt;flatCount+1));</div><div class='add'>+    ct-&gt;flatCount = 0;</div><div class='add'>+    doBuildFlatList(ct, ct-&gt;itemlist);</div><div class='add'>+    ct-&gt;flatList[ct-&gt;flatCount] = NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtCheckboxTreeAddItem(newtComponent co, </div><div class='add'>+			    const char * text, const void * data,</div><div class='add'>+			    int flags, int index, ...) {</div><div class='add'>+    va_list argList;</div><div class='add'>+    int numIndexes;</div><div class='add'>+    int * indexes;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    va_start(argList, index);</div><div class='add'>+    numIndexes = 0;</div><div class='add'>+    i = index;</div><div class='add'>+    while (i != NEWT_ARG_LAST) {</div><div class='add'>+	numIndexes++;</div><div class='add'>+	i = va_arg(argList, int);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    va_end(argList);</div><div class='add'>+</div><div class='add'>+    indexes = alloca(sizeof(*indexes) * (numIndexes + 1));</div><div class='add'>+    va_start(argList, index);</div><div class='add'>+    numIndexes = 0;</div><div class='add'>+    i = index;</div><div class='add'>+    va_start(argList, index);</div><div class='add'>+    while (i != NEWT_ARG_LAST) {</div><div class='add'>+	indexes[numIndexes++] = i;</div><div class='add'>+	i = va_arg(argList, int);</div><div class='add'>+    }</div><div class='add'>+    va_end(argList);</div><div class='add'>+</div><div class='add'>+    indexes[numIndexes++] = NEWT_ARG_LAST;</div><div class='add'>+</div><div class='add'>+    return newtCheckboxTreeAddArray(co, text, data, flags, indexes);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int doFindItemPath(struct items * items, void * data, int * path, </div><div class='add'>+			  int * len) {</div><div class='add'>+    int where = 0;</div><div class='add'>+</div><div class='add'>+    while (items) {</div><div class='add'>+	if (items-&gt;data == data) {</div><div class='add'>+	    if (path) path[items-&gt;depth] = where;</div><div class='add'>+	    if (len) *len = items-&gt;depth + 1;</div><div class='add'>+	    return 1;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	if (items-&gt;branch &amp;&amp; doFindItemPath(items-&gt;branch, data, path, len)) {</div><div class='add'>+	    if (path) path[items-&gt;depth] = where;</div><div class='add'>+	    return 1;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	items = items-&gt;next;</div><div class='add'>+	where++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int * newtCheckboxTreeFindItem(newtComponent co, void * data) {</div><div class='add'>+    int len;</div><div class='add'>+    int * path;</div><div class='add'>+    struct CheckboxTree * ct = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (!doFindItemPath(ct-&gt;itemlist, data, NULL, &amp;len)) return NULL;</div><div class='add'>+</div><div class='add'>+    path = malloc(sizeof(*path) * (len + 1));</div><div class='add'>+    doFindItemPath(ct-&gt;itemlist, data, path, NULL);</div><div class='add'>+    path[len] = NEWT_ARG_LAST;</div><div class='add'>+</div><div class='add'>+    return path;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtCheckboxTreeAddArray(newtComponent co, </div><div class='add'>+			    const char * text, const void * data,</div><div class='add'>+			    int flags, int * indexes) {</div><div class='add'>+    struct items * curList, * newNode, * item = NULL;</div><div class='add'>+    struct items ** listPtr = NULL;</div><div class='add'>+    int i, index, numIndexes;</div><div class='add'>+    struct CheckboxTree * ct = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    numIndexes = 0;</div><div class='add'>+    while (indexes[numIndexes] != NEWT_ARG_LAST) numIndexes++;</div><div class='add'>+</div><div class='add'>+    if (!ct-&gt;itemlist) {</div><div class='add'>+	if (numIndexes &gt; 1) return -1;</div><div class='add'>+</div><div class='add'>+    	ct-&gt;itemlist = malloc(sizeof(*ct-&gt;itemlist));</div><div class='add'>+    	item = ct-&gt;itemlist;</div><div class='add'>+	item-&gt;prev = NULL;</div><div class='add'>+	item-&gt;next = NULL;</div><div class='add'>+    } else {</div><div class='add'>+	curList = ct-&gt;itemlist;</div><div class='add'>+	listPtr = &amp;ct-&gt;itemlist;</div><div class='add'>+</div><div class='add'>+	i = 0;</div><div class='add'>+	index = indexes[i];</div><div class='add'>+	while (i &lt; numIndexes) {</div><div class='add'>+	    item = curList;</div><div class='add'>+</div><div class='add'>+	    if (index == NEWT_ARG_APPEND) {</div><div class='add'>+	    	item = NULL;</div><div class='add'>+	    } else {</div><div class='add'>+		while (index &amp;&amp; item) </div><div class='add'>+		    item = item-&gt;next, index--;</div><div class='add'>+	    }</div><div class='add'>+</div><div class='add'>+	    i++;</div><div class='add'>+	    if (i &lt; numIndexes) {</div><div class='add'>+		curList = item-&gt;branch;</div><div class='add'>+		listPtr = &amp;item-&gt;branch;</div><div class='add'>+		if (!curList &amp;&amp; (i + 1 != numIndexes)) return -1;</div><div class='add'>+</div><div class='add'>+		index = indexes[i];</div><div class='add'>+	    }</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	if (!curList) { 			/* create a new branch */</div><div class='add'>+	    item = malloc(sizeof(*curList-&gt;prev));</div><div class='add'>+	    item-&gt;next = item-&gt;prev = NULL;</div><div class='add'>+	    *listPtr = item;</div><div class='add'>+	} else if (!item) {			/* append to end */</div><div class='add'>+	    item = curList;</div><div class='add'>+	    while (item-&gt;next) item = item-&gt;next;</div><div class='add'>+	    item-&gt;next = malloc(sizeof(*curList-&gt;prev));</div><div class='add'>+	    item-&gt;next-&gt;prev = item;</div><div class='add'>+	    item = item-&gt;next;</div><div class='add'>+	    item-&gt;next = NULL;</div><div class='add'>+	} else { </div><div class='add'>+	    newNode = malloc(sizeof(*newNode));</div><div class='add'>+	    newNode-&gt;prev = item-&gt;prev;</div><div class='add'>+	    newNode-&gt;next = item;</div><div class='add'>+</div><div class='add'>+	    if (item-&gt;prev) item-&gt;prev-&gt;next = newNode;</div><div class='add'>+	    item-&gt;prev = newNode;</div><div class='add'>+	    item = newNode;</div><div class='add'>+	    if (!item-&gt;prev) *listPtr = item;</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+    	</div><div class='add'>+    item-&gt;text = strdup(text);</div><div class='add'>+    item-&gt;data = data;</div><div class='add'>+    if (flags &amp; NEWT_FLAG_SELECTED) {</div><div class='add'>+    	item-&gt;selected = 1;</div><div class='add'>+    } else {</div><div class='add'>+	item-&gt;selected = 0;</div><div class='add'>+    }</div><div class='add'>+    item-&gt;flags = flags;</div><div class='add'>+    item-&gt;branch = NULL;</div><div class='add'>+    item-&gt;depth = numIndexes - 1;</div><div class='add'>+</div><div class='add'>+    i = 4 + (3 * item-&gt;depth);</div><div class='add'>+</div><div class='add'>+    if ((strlen(text) + i + ct-&gt;pad) &gt; co-&gt;width) {</div><div class='add'>+	co-&gt;width = strlen(text) + i + ct-&gt;pad;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct items * findItem(struct items * items, const void * data) {</div><div class='add'>+    struct items * i;</div><div class='add'>+</div><div class='add'>+    while (items) {</div><div class='add'>+	if (items-&gt;data == data) return items;</div><div class='add'>+    	if (items-&gt;branch) {</div><div class='add'>+	    i = findItem(items-&gt;branch, data);</div><div class='add'>+	    if (i) return i;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	items = items-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void listSelected(struct items * items, int * num, const void ** list, int seqindex) {</div><div class='add'>+    while (items) {</div><div class='add'>+	    if ((seqindex ? items-&gt;selected==seqindex : items-&gt;selected) &amp;&amp; !items-&gt;branch)</div><div class='add'>+	    list[(*num)++] = (void *) items-&gt;data;</div><div class='add'>+	if (items-&gt;branch)</div><div class='add'>+	    listSelected(items-&gt;branch, num, list, seqindex);</div><div class='add'>+	items = items-&gt;next;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+const void ** newtCheckboxTreeGetSelection(newtComponent co, int *numitems)</div><div class='add'>+{</div><div class='add'>+    return newtCheckboxTreeGetMultiSelection(co, numitems, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+const void ** newtCheckboxTreeGetMultiSelection(newtComponent co, int *numitems, char seqnum)</div><div class='add'>+{</div><div class='add'>+    struct CheckboxTree * ct;</div><div class='add'>+    const void **retval;</div><div class='add'>+    int seqindex=0;</div><div class='add'>+</div><div class='add'>+    if(!co || !numitems) return NULL;</div><div class='add'>+</div><div class='add'>+    ct = co-&gt;data;</div><div class='add'>+	</div><div class='add'>+    if (seqnum) {</div><div class='add'>+	    while( ct-&gt;seq[seqindex] &amp;&amp; ( ct-&gt;seq[seqindex] != seqnum )) seqindex++;</div><div class='add'>+    } else {</div><div class='add'>+	    seqindex = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *numitems = countItems(ct-&gt;itemlist, (seqindex ? seqindex : COUNT_SELECTED));</div><div class='add'>+    if (!*numitems) return NULL;</div><div class='add'>+    </div><div class='add'>+    retval = malloc(*numitems * sizeof(void *));</div><div class='add'>+    *numitems = 0;</div><div class='add'>+    listSelected(ct-&gt;itemlist, numitems, retval, seqindex);</div><div class='add'>+</div><div class='add'>+    return retval;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtCheckboxTree(int left, int top, int height, int flags) {</div><div class='add'>+	return newtCheckboxTreeMulti(left, top, height, NULL, flags);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtCheckboxTreeMulti(int left, int top, int height, char *seq, int flags) {</div><div class='add'>+    newtComponent co;</div><div class='add'>+    struct CheckboxTree * ct;</div><div class='add'>+</div><div class='add'>+    co = malloc(sizeof(*co));</div><div class='add'>+    ct = malloc(sizeof(struct CheckboxTree));</div><div class='add'>+    co-&gt;callback = NULL;</div><div class='add'>+    co-&gt;data = ct;</div><div class='add'>+    co-&gt;ops = &amp;ctOps;</div><div class='add'>+    co-&gt;takesFocus = 1;</div><div class='add'>+    co-&gt;height = height;</div><div class='add'>+    co-&gt;width = 0;</div><div class='add'>+    co-&gt;isMapped = 0;</div><div class='add'>+    ct-&gt;itemlist = NULL;</div><div class='add'>+    ct-&gt;firstItem = NULL;</div><div class='add'>+    ct-&gt;currItem = NULL;</div><div class='add'>+    ct-&gt;flatList = NULL;</div><div class='add'>+	if (seq)</div><div class='add'>+	  ct-&gt;seq = strdup(seq);</div><div class='add'>+	else</div><div class='add'>+	  ct-&gt;seq = strdup(" *");</div><div class='add'>+    if (flags &amp; NEWT_FLAG_SCROLL) {</div><div class='add'>+	ct-&gt;sb = newtVerticalScrollbar(left, top, height,</div><div class='add'>+				       COLORSET_LISTBOX, COLORSET_ACTLISTBOX);</div><div class='add'>+	ct-&gt;pad = 2;</div><div class='add'>+    } else {</div><div class='add'>+	ct-&gt;sb = NULL;</div><div class='add'>+	ct-&gt;pad = 0;</div><div class='add'>+    }</div><div class='add'>+    </div><div class='add'>+    return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ctMapped(newtComponent co, int isMapped) {</div><div class='add'>+    struct CheckboxTree * ct = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    co-&gt;isMapped = isMapped;</div><div class='add'>+    if (ct-&gt;sb)</div><div class='add'>+	ct-&gt;sb-&gt;ops-&gt;mapped(ct-&gt;sb, isMapped);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ctPlace(newtComponent co, int newLeft, int newTop) {</div><div class='add'>+    struct CheckboxTree * ct = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    co-&gt;top = newTop;</div><div class='add'>+    co-&gt;left = newLeft;</div><div class='add'>+</div><div class='add'>+    if (ct-&gt;sb)</div><div class='add'>+	ct-&gt;sb-&gt;ops-&gt;place(ct-&gt;sb, co-&gt;left + co-&gt;width - 1, co-&gt;top);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int ctSetItem(newtComponent co, struct items *item, enum newtFlagsSense sense)</div><div class='add'>+{</div><div class='add'>+    struct CheckboxTree * ct = co-&gt;data;</div><div class='add'>+    struct items * currItem;</div><div class='add'>+    struct items * firstItem;</div><div class='add'>+    </div><div class='add'>+    if (!item)</div><div class='add'>+	return 1;</div><div class='add'>+    </div><div class='add'>+    switch(sense) {</div><div class='add'>+	case NEWT_FLAGS_RESET:</div><div class='add'>+	    item-&gt;selected = 0;</div><div class='add'>+	    break;</div><div class='add'>+	case NEWT_FLAGS_SET:</div><div class='add'>+	    item-&gt;selected = 1;</div><div class='add'>+	    break;</div><div class='add'>+	case NEWT_FLAGS_TOGGLE:</div><div class='add'>+	    if (item-&gt;branch)</div><div class='add'>+	      item-&gt;selected = !item-&gt;selected;</div><div class='add'>+	    else {</div><div class='add'>+		    item-&gt;selected++;</div><div class='add'>+		    if (item-&gt;selected==strlen(ct-&gt;seq))</div><div class='add'>+		      item-&gt;selected = 0;</div><div class='add'>+	    }</div><div class='add'>+	    break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (item-&gt;branch) {</div><div class='add'>+    	currItem = *ct-&gt;currItem;</div><div class='add'>+	firstItem = *ct-&gt;firstItem;</div><div class='add'>+</div><div class='add'>+    	buildFlatList(co);</div><div class='add'>+</div><div class='add'>+    	ct-&gt;currItem = ct-&gt;flatList;</div><div class='add'>+	while (*ct-&gt;currItem != currItem) ct-&gt;currItem++;</div><div class='add'>+</div><div class='add'>+    	ct-&gt;firstItem = ct-&gt;flatList;</div><div class='add'>+    	if (ct-&gt;flatCount &gt; co-&gt;height) {</div><div class='add'>+		struct items ** last = ct-&gt;flatList + ct-&gt;flatCount - co-&gt;height;</div><div class='add'>+		while (*ct-&gt;firstItem != firstItem &amp;&amp; ct-&gt;firstItem != last)</div><div class='add'>+		    ct-&gt;firstItem++;</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ctSetItems(struct items *item, int selected)</div><div class='add'>+{</div><div class='add'>+    for (; item; item = item-&gt;next) {</div><div class='add'>+	if (!item-&gt;branch)</div><div class='add'>+	    item-&gt;selected = selected;</div><div class='add'>+	else</div><div class='add'>+	    ctSetItems(item-&gt;branch, selected);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ctDraw(newtComponent co) {</div><div class='add'>+    struct CheckboxTree * ct = co-&gt;data;</div><div class='add'>+    struct items ** item; </div><div class='add'>+    int i, j;</div><div class='add'>+    char * spaces = NULL;</div><div class='add'>+    int currRow = -1;</div><div class='add'>+</div><div class='add'>+    if (!co-&gt;isMapped) return ;</div><div class='add'>+</div><div class='add'>+    if (!ct-&gt;firstItem) {</div><div class='add'>+	buildFlatList(co);</div><div class='add'>+	ct-&gt;firstItem = ct-&gt;currItem = ct-&gt;flatList;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    item = ct-&gt;firstItem;</div><div class='add'>+    </div><div class='add'>+    i = 0;</div><div class='add'>+    while (*item &amp;&amp; i &lt; co-&gt;height) {</div><div class='add'>+	newtGotorc(co-&gt;top + i, co-&gt;left);</div><div class='add'>+	if (*item == *ct-&gt;currItem) {</div><div class='add'>+	    SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX);</div><div class='add'>+	    currRow = co-&gt;top + i;</div><div class='add'>+	} else</div><div class='add'>+	    SLsmg_set_color(NEWT_COLORSET_LISTBOX);</div><div class='add'>+</div><div class='add'>+	for (j = 0; j &lt; (*item)-&gt;depth; j++)</div><div class='add'>+	    SLsmg_write_string("   ");</div><div class='add'>+</div><div class='add'>+	if ((*item)-&gt;branch) {</div><div class='add'>+	    if ((*item)-&gt;selected) </div><div class='add'>+		SLsmg_write_string("&lt;-&gt; ");</div><div class='add'>+	    else</div><div class='add'>+		SLsmg_write_string("&lt;+&gt; ");</div><div class='add'>+	} else {</div><div class='add'>+	    char tmp[5];</div><div class='add'>+	    snprintf(tmp,5,"[%c] ",ct-&gt;seq[(*item)-&gt;selected]);</div><div class='add'>+	    SLsmg_write_string(tmp);</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	SLsmg_write_nstring((*item)-&gt;text, co-&gt;width - 4 - </div><div class='add'>+					   (3 * (*item)-&gt;depth));</div><div class='add'>+	item++;</div><div class='add'>+	i++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* There could be empty lines left (i.e. if the user closes an expanded</div><div class='add'>+       list which is the last thing in the tree, and whose elements are</div><div class='add'>+       displayed at the bottom of the screen */</div><div class='add'>+    if (i &lt; co-&gt;height) {</div><div class='add'>+	spaces = alloca(co-&gt;width);</div><div class='add'>+	memset(spaces, ' ', co-&gt;width);</div><div class='add'>+	SLsmg_set_color(NEWT_COLORSET_LISTBOX);</div><div class='add'>+    }</div><div class='add'>+    while (i &lt; co-&gt;height) {</div><div class='add'>+	newtGotorc(co-&gt;top + i, co-&gt;left);</div><div class='add'>+	SLsmg_write_nstring(spaces, co-&gt;width);</div><div class='add'>+	i++;</div><div class='add'>+    }</div><div class='add'>+    </div><div class='add'>+    if(ct-&gt;sb) {</div><div class='add'>+	newtScrollbarSet(ct-&gt;sb, ct-&gt;currItem - ct-&gt;flatList, </div><div class='add'>+			 ct-&gt;flatCount - 1);</div><div class='add'>+	ct-&gt;sb-&gt;ops-&gt;draw(ct-&gt;sb);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newtGotorc(currRow, co-&gt;left + 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ctDestroy(newtComponent co) {</div><div class='add'>+    struct CheckboxTree * ct = co-&gt;data;</div><div class='add'>+    struct items * item, * nextitem;</div><div class='add'>+</div><div class='add'>+    nextitem = item = ct-&gt;itemlist;</div><div class='add'>+</div><div class='add'>+    while (item != NULL) {</div><div class='add'>+	nextitem = item-&gt;next;</div><div class='add'>+	free(item-&gt;text);</div><div class='add'>+	free(item);</div><div class='add'>+	item = nextitem;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(ct-&gt;seq);</div><div class='add'>+    free(ct);</div><div class='add'>+    free(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct eventResult ctEvent(newtComponent co, struct event ev) {</div><div class='add'>+    struct CheckboxTree * ct = co-&gt;data;</div><div class='add'>+    struct eventResult er;</div><div class='add'>+    struct items ** listEnd, ** lastItem;</div><div class='add'>+    int key, selnum = 1;</div><div class='add'>+</div><div class='add'>+    er.result = ER_IGNORED;</div><div class='add'>+</div><div class='add'>+    if(ev.when == EV_EARLY || ev.when == EV_LATE) {</div><div class='add'>+	return er;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch(ev.event) {</div><div class='add'>+    case EV_KEYPRESS:</div><div class='add'>+	key = ev.u.key;</div><div class='add'>+	if (key == (char) key &amp;&amp; key != ' ') {</div><div class='add'>+	    for (selnum = 0; ct-&gt;seq[selnum]; selnum++)</div><div class='add'>+	    if (key == ct-&gt;seq[selnum])</div><div class='add'>+		break;</div><div class='add'>+	    if (!ct-&gt;seq[selnum])</div><div class='add'>+		switch (key) {</div><div class='add'>+		case '-': selnum = 0; break;</div><div class='add'>+		case '+':</div><div class='add'>+		case '*': selnum = 1; break;</div><div class='add'>+		}</div><div class='add'>+	    if (ct-&gt;seq[selnum])</div><div class='add'>+		key = '*';</div><div class='add'>+	}</div><div class='add'>+	switch(key) {</div><div class='add'>+	case ' ':</div><div class='add'>+	case NEWT_KEY_ENTER:</div><div class='add'>+	    ctSetItem(co, *ct-&gt;currItem, NEWT_FLAGS_TOGGLE);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    if (!(*ct-&gt;currItem)-&gt;branch || (*ct-&gt;currItem)-&gt;selected)</div><div class='add'>+		key = NEWT_KEY_DOWN;</div><div class='add'>+	    else</div><div class='add'>+		key = '*';</div><div class='add'>+	    break;</div><div class='add'>+	case '*':</div><div class='add'>+	    if ((*ct-&gt;currItem)-&gt;branch) {</div><div class='add'>+		ctSetItems((*ct-&gt;currItem)-&gt;branch, selnum);</div><div class='add'>+		if (!(*ct-&gt;currItem)-&gt;selected)</div><div class='add'>+		    key = NEWT_KEY_DOWN;</div><div class='add'>+	    } else {</div><div class='add'>+		(*ct-&gt;currItem)-&gt;selected = selnum;</div><div class='add'>+		key = NEWT_KEY_DOWN;</div><div class='add'>+	    }</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+	}</div><div class='add'>+	switch (key) {</div><div class='add'>+	case '*':</div><div class='add'>+	    ctDraw(co);</div><div class='add'>+	    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    return er;</div><div class='add'>+	case NEWT_KEY_HOME:</div><div class='add'>+	    ct-&gt;currItem = ct-&gt;flatList;</div><div class='add'>+	    ct-&gt;firstItem = ct-&gt;flatList;</div><div class='add'>+	    ctDraw(co);</div><div class='add'>+	    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    return er;</div><div class='add'>+	case NEWT_KEY_END:</div><div class='add'>+	    ct-&gt;currItem = ct-&gt;flatList + ct-&gt;flatCount - 1;</div><div class='add'>+	    if (ct-&gt;flatCount &lt;= co-&gt;height)</div><div class='add'>+		ct-&gt;firstItem = ct-&gt;flatList;</div><div class='add'>+	    else</div><div class='add'>+		ct-&gt;firstItem = ct-&gt;flatList + ct-&gt;flatCount - co-&gt;height;</div><div class='add'>+	    ctDraw(co);</div><div class='add'>+	    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    return er;</div><div class='add'>+	case NEWT_KEY_DOWN:</div><div class='add'>+	    if (ev.u.key != NEWT_KEY_DOWN) {</div><div class='add'>+		if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+		if (strlen(ct-&gt;seq) != 2) {</div><div class='add'>+		    ctDraw(co);</div><div class='add'>+		    return er;</div><div class='add'>+		}</div><div class='add'>+	    }</div><div class='add'>+	    if ((ct-&gt;currItem - ct-&gt;flatList + 1) &lt; ct-&gt;flatCount) {</div><div class='add'>+		ct-&gt;currItem++;</div><div class='add'>+</div><div class='add'>+		if (ct-&gt;currItem - ct-&gt;firstItem &gt;= co-&gt;height) </div><div class='add'>+		    ct-&gt;firstItem++;</div><div class='add'>+</div><div class='add'>+		ctDraw(co);</div><div class='add'>+	    } else if (ev.u.key != NEWT_KEY_DOWN)</div><div class='add'>+	        ctDraw(co);</div><div class='add'>+	    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    return er;</div><div class='add'>+	case NEWT_KEY_UP:</div><div class='add'>+	    if (ct-&gt;currItem != ct-&gt;flatList) {</div><div class='add'>+		ct-&gt;currItem--;</div><div class='add'>+</div><div class='add'>+		if (ct-&gt;currItem &lt; ct-&gt;firstItem)</div><div class='add'>+		    ct-&gt;firstItem = ct-&gt;currItem;</div><div class='add'>+		    </div><div class='add'>+		ctDraw(co);</div><div class='add'>+	    }</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    return er;</div><div class='add'>+	case NEWT_KEY_PGUP:</div><div class='add'>+	    if (ct-&gt;firstItem - co-&gt;height &lt; ct-&gt;flatList) {</div><div class='add'>+	    	ct-&gt;firstItem = ct-&gt;currItem = ct-&gt;flatList;</div><div class='add'>+	    } else {</div><div class='add'>+		ct-&gt;currItem -= co-&gt;height;</div><div class='add'>+		ct-&gt;firstItem -= co-&gt;height;</div><div class='add'>+	    }</div><div class='add'>+</div><div class='add'>+	    ctDraw(co);</div><div class='add'>+	    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    return er;</div><div class='add'>+	case NEWT_KEY_PGDN:</div><div class='add'>+	    listEnd = ct-&gt;flatList + ct-&gt;flatCount - 1;</div><div class='add'>+	    lastItem = ct-&gt;firstItem + co-&gt;height - 1;</div><div class='add'>+</div><div class='add'>+	    if (lastItem + co-&gt;height &gt; listEnd) {</div><div class='add'>+	    	ct-&gt;firstItem = listEnd - co-&gt;height + 1;</div><div class='add'>+		ct-&gt;currItem = listEnd;</div><div class='add'>+	    } else {</div><div class='add'>+	    	ct-&gt;currItem += co-&gt;height;</div><div class='add'>+		ct-&gt;firstItem += co-&gt;height;</div><div class='add'>+	    }</div><div class='add'>+</div><div class='add'>+	    ctDraw(co);</div><div class='add'>+	    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    return er;</div><div class='add'>+	}</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+    case EV_FOCUS:</div><div class='add'>+	ctDraw(co);</div><div class='add'>+	er.result = ER_SWALLOWED;</div><div class='add'>+	break;</div><div class='add'>+	</div><div class='add'>+    case EV_UNFOCUS:</div><div class='add'>+	ctDraw(co);</div><div class='add'>+	er.result = ER_SWALLOWED;</div><div class='add'>+	break;</div><div class='add'>+    default:</div><div class='add'>+	break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+const void * newtCheckboxTreeGetCurrent(newtComponent co) {</div><div class='add'>+    struct CheckboxTree * ct = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (!ct-&gt;currItem) return NULL;</div><div class='add'>+    return (*ct-&gt;currItem)-&gt;data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCheckboxTreeSetEntry(newtComponent co, const void * data, const char * text)</div><div class='add'>+{</div><div class='add'>+    struct CheckboxTree * ct;</div><div class='add'>+    struct items * item;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    if (!co) return;</div><div class='add'>+    ct = co-&gt;data;</div><div class='add'>+    item = findItem(ct-&gt;itemlist, data);</div><div class='add'>+    if (!item) return;</div><div class='add'>+</div><div class='add'>+    free(item-&gt;text);</div><div class='add'>+    item-&gt;text = strdup(text);</div><div class='add'>+</div><div class='add'>+    i = 4 + (3 * item-&gt;depth);</div><div class='add'>+</div><div class='add'>+    if ((strlen(text) + i + ct-&gt;pad) &gt; co-&gt;width) {</div><div class='add'>+	co-&gt;width = strlen(text) + i + ct-&gt;pad;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    ctDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char newtCheckboxTreeGetEntryValue(newtComponent co, const void * data)</div><div class='add'>+{</div><div class='add'>+    struct CheckboxTree * ct;</div><div class='add'>+    struct items * item;</div><div class='add'>+</div><div class='add'>+    if (!co) return -1;</div><div class='add'>+    ct = co-&gt;data;</div><div class='add'>+    item = findItem(ct-&gt;itemlist, data);</div><div class='add'>+    if (!item) return -1;</div><div class='add'>+    if (item-&gt;branch)</div><div class='add'>+	return item-&gt;selected ? NEWT_CHECKBOXTREE_EXPANDED : NEWT_CHECKBOXTREE_COLLAPSED;</div><div class='add'>+    else</div><div class='add'>+	return ct-&gt;seq[item-&gt;selected];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCheckboxTreeSetEntryValue(newtComponent co, const void * data, char value)</div><div class='add'>+{</div><div class='add'>+    struct CheckboxTree * ct;</div><div class='add'>+    struct items * item;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    if (!co) return;</div><div class='add'>+    ct = co-&gt;data;</div><div class='add'>+    item = findItem(ct-&gt;itemlist, data);</div><div class='add'>+    if (!item || item-&gt;branch) return;</div><div class='add'>+</div><div class='add'>+    for(i = 0; ct-&gt;seq[i]; i++)</div><div class='add'>+	if (value == ct-&gt;seq[i])</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+    if (!ct-&gt;seq[i]) return;</div><div class='add'>+    item-&gt;selected = i;</div><div class='add'>+</div><div class='add'>+    ctDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/newt/entry.c b/mdk-stage1/newt/entry.c<br/>new file mode 100644<br/>index 000000000..154edba71<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/entry.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/entry.c</a></div><div class='hunk'>@@ -0,0 +1,376 @@</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+#include &lt;slang.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct entry {</div><div class='add'>+    int flags;</div><div class='add'>+    char * buf;</div><div class='add'>+    char ** resultPtr;</div><div class='add'>+    int bufAlloced;</div><div class='add'>+    int bufUsed;		/* amount of the buffer that's been used */</div><div class='add'>+    int cursorPosition; 	/* cursor *in the string* on on screen */</div><div class='add'>+    int firstChar;		/* first character position being shown */</div><div class='add'>+    newtEntryFilter filter;</div><div class='add'>+    void * filterData;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void entryDraw(newtComponent co);</div><div class='add'>+static void entryDestroy(newtComponent co);</div><div class='add'>+static struct eventResult entryEvent(newtComponent co,</div><div class='add'>+			             struct event ev);</div><div class='add'>+</div><div class='add'>+static struct eventResult entryHandleKey(newtComponent co, int key);</div><div class='add'>+</div><div class='add'>+static struct componentOps entryOps = {</div><div class='add'>+    entryDraw,</div><div class='add'>+    entryEvent,</div><div class='add'>+    entryDestroy,</div><div class='add'>+    newtDefaultPlaceHandler,</div><div class='add'>+    newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+void newtEntrySet(newtComponent co, const char * value, int cursorAtEnd) {</div><div class='add'>+    struct entry * en = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    if ((strlen(value) + 1) &gt; (unsigned int)en-&gt;bufAlloced) {</div><div class='add'>+	free(en-&gt;buf);</div><div class='add'>+	en-&gt;bufAlloced = strlen(value) + 1;</div><div class='add'>+	en-&gt;buf = malloc(en-&gt;bufAlloced);</div><div class='add'>+	if (en-&gt;resultPtr) *en-&gt;resultPtr = en-&gt;buf;</div><div class='add'>+    }</div><div class='add'>+    memset(en-&gt;buf, 0, en-&gt;bufAlloced);		/* clear the buffer */</div><div class='add'>+    strcpy(en-&gt;buf, value);</div><div class='add'>+    en-&gt;bufUsed = strlen(value);</div><div class='add'>+    en-&gt;firstChar = 0;</div><div class='add'>+    if (cursorAtEnd)</div><div class='add'>+	en-&gt;cursorPosition = en-&gt;bufUsed;</div><div class='add'>+    else</div><div class='add'>+	en-&gt;cursorPosition = 0;</div><div class='add'>+</div><div class='add'>+    entryDraw(co);</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+newtComponent newtEntry(int left, int top, const char * initialValue, int width,</div><div class='add'>+			char ** resultPtr, int flags) {</div><div class='add'>+    newtComponent co;</div><div class='add'>+    struct entry * en;</div><div class='add'>+</div><div class='add'>+    co = malloc(sizeof(*co));</div><div class='add'>+    en = malloc(sizeof(struct entry));</div><div class='add'>+    co-&gt;data = en;</div><div class='add'>+</div><div class='add'>+    co-&gt;top = top;</div><div class='add'>+    co-&gt;left = left;</div><div class='add'>+    co-&gt;height = 1;</div><div class='add'>+    co-&gt;width = width;</div><div class='add'>+    co-&gt;isMapped = 0;</div><div class='add'>+    co-&gt;callback = NULL;</div><div class='add'>+</div><div class='add'>+    co-&gt;ops = &amp;entryOps;</div><div class='add'>+</div><div class='add'>+    en-&gt;flags = flags;</div><div class='add'>+    en-&gt;cursorPosition = 0;</div><div class='add'>+    en-&gt;firstChar = 0;</div><div class='add'>+    en-&gt;bufUsed = 0;</div><div class='add'>+    en-&gt;bufAlloced = width + 1;</div><div class='add'>+    en-&gt;filter = NULL;</div><div class='add'>+</div><div class='add'>+    if (!(en-&gt;flags &amp; NEWT_FLAG_DISABLED))</div><div class='add'>+	co-&gt;takesFocus = 1;</div><div class='add'>+    else</div><div class='add'>+	co-&gt;takesFocus = 0;</div><div class='add'>+</div><div class='add'>+    if (initialValue &amp;&amp; strlen(initialValue) &gt; (unsigned int)width) {</div><div class='add'>+	en-&gt;bufAlloced = strlen(initialValue) + 1;</div><div class='add'>+    }</div><div class='add'>+    en-&gt;buf = malloc(en-&gt;bufAlloced);</div><div class='add'>+    en-&gt;resultPtr = resultPtr;</div><div class='add'>+    if (en-&gt;resultPtr) *en-&gt;resultPtr = en-&gt;buf;</div><div class='add'>+</div><div class='add'>+    memset(en-&gt;buf, 0, en-&gt;bufAlloced);</div><div class='add'>+    if (initialValue) {</div><div class='add'>+	strcpy(en-&gt;buf, initialValue);</div><div class='add'>+	en-&gt;bufUsed = strlen(initialValue);</div><div class='add'>+	en-&gt;cursorPosition = en-&gt;bufUsed;</div><div class='add'>+    } else {</div><div class='add'>+	*en-&gt;buf = '\0';</div><div class='add'>+	en-&gt;bufUsed = 0;</div><div class='add'>+	en-&gt;cursorPosition = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void entryDraw(newtComponent co) {</div><div class='add'>+    struct entry * en = co-&gt;data;</div><div class='add'>+    int i;</div><div class='add'>+    char * chptr;</div><div class='add'>+    int len;</div><div class='add'>+</div><div class='add'>+    if (!co-&gt;isMapped) return;</div><div class='add'>+</div><div class='add'>+    if (en-&gt;flags &amp; NEWT_FLAG_DISABLED)</div><div class='add'>+	SLsmg_set_color(NEWT_COLORSET_DISENTRY);</div><div class='add'>+    else</div><div class='add'>+	SLsmg_set_color(NEWT_COLORSET_ENTRY);</div><div class='add'>+</div><div class='add'>+    if (en-&gt;flags &amp; NEWT_FLAG_HIDDEN) {</div><div class='add'>+	newtGotorc(co-&gt;top, co-&gt;left);</div><div class='add'>+	for (i = 0; i &lt; co-&gt;width; i++)</div><div class='add'>+	    SLsmg_write_char('_');</div><div class='add'>+	newtGotorc(co-&gt;top, co-&gt;left);</div><div class='add'>+</div><div class='add'>+	return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newtGotorc(co-&gt;top, co-&gt;left);</div><div class='add'>+</div><div class='add'>+    if (en-&gt;cursorPosition &lt; en-&gt;firstChar) {</div><div class='add'>+	/* scroll to the left */</div><div class='add'>+	en-&gt;firstChar = en-&gt;cursorPosition;</div><div class='add'>+    } else if ((en-&gt;firstChar + co-&gt;width) &lt;= en-&gt;cursorPosition) {</div><div class='add'>+	/* scroll to the right */</div><div class='add'>+	en-&gt;firstChar = en-&gt;cursorPosition - co-&gt;width + 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    chptr = en-&gt;buf + en-&gt;firstChar;</div><div class='add'>+</div><div class='add'>+    if (en-&gt;flags &amp; NEWT_FLAG_PASSWORD) {</div><div class='add'>+	char *tmpptr, *p;</div><div class='add'>+</div><div class='add'>+	tmpptr = alloca(strlen(chptr+2));</div><div class='add'>+	strcpy(tmpptr, chptr);</div><div class='add'>+	for (p = tmpptr; *p; p++)</div><div class='add'>+	    *p = '*';</div><div class='add'>+	chptr = tmpptr;</div><div class='add'>+    }			</div><div class='add'>+</div><div class='add'>+    len = strlen(chptr);</div><div class='add'>+</div><div class='add'>+    if (len &lt;= co-&gt;width) {</div><div class='add'>+	i = len;</div><div class='add'>+	SLsmg_write_string(chptr);</div><div class='add'>+	while (i &lt; co-&gt;width) {</div><div class='add'>+	    SLsmg_write_char('_');</div><div class='add'>+	    i++;</div><div class='add'>+	}</div><div class='add'>+    } else {</div><div class='add'>+	SLsmg_write_nstring(chptr, co-&gt;width);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (en-&gt;flags &amp; NEWT_FLAG_HIDDEN)</div><div class='add'>+	newtGotorc(co-&gt;top, co-&gt;left);</div><div class='add'>+    else</div><div class='add'>+	newtGotorc(co-&gt;top, co-&gt;left + (en-&gt;cursorPosition - en-&gt;firstChar));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtEntrySetFlags(newtComponent co, int flags, enum newtFlagsSense sense) {</div><div class='add'>+    struct entry * en = co-&gt;data;</div><div class='add'>+    int row, col;</div><div class='add'>+</div><div class='add'>+    en-&gt;flags = newtSetFlags(en-&gt;flags, flags, sense);</div><div class='add'>+</div><div class='add'>+    if (!(en-&gt;flags &amp; NEWT_FLAG_DISABLED))</div><div class='add'>+	co-&gt;takesFocus = 1;</div><div class='add'>+    else</div><div class='add'>+	co-&gt;takesFocus = 0;</div><div class='add'>+</div><div class='add'>+    newtGetrc(&amp;row, &amp;col);</div><div class='add'>+    entryDraw(co);</div><div class='add'>+    newtGotorc(row, col);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void entryDestroy(newtComponent co) {</div><div class='add'>+    struct entry * en = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    free(en-&gt;buf);</div><div class='add'>+    free(en);</div><div class='add'>+    free(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult entryEvent(newtComponent co,</div><div class='add'>+				     struct event ev) {</div><div class='add'>+    struct entry * en = co-&gt;data;</div><div class='add'>+    struct eventResult er;</div><div class='add'>+    int ch;</div><div class='add'>+</div><div class='add'>+    if (ev.when == EV_NORMAL) {</div><div class='add'>+	switch (ev.event) {</div><div class='add'>+	case EV_FOCUS:</div><div class='add'>+	    newtCursorOn();</div><div class='add'>+	    if (en-&gt;flags &amp; NEWT_FLAG_HIDDEN)</div><div class='add'>+		newtGotorc(co-&gt;top, co-&gt;left);</div><div class='add'>+	    else</div><div class='add'>+		newtGotorc(co-&gt;top, co-&gt;left +</div><div class='add'>+			   (en-&gt;cursorPosition - en-&gt;firstChar));</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	case EV_UNFOCUS:</div><div class='add'>+	    newtCursorOff();</div><div class='add'>+	    newtGotorc(0, 0);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    if (co-&gt;callback)</div><div class='add'>+		co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	case EV_KEYPRESS:</div><div class='add'>+	    ch = ev.u.key;</div><div class='add'>+	    if (en-&gt;filter)</div><div class='add'>+		ch = en-&gt;filter(co, en-&gt;filterData, ch, en-&gt;cursorPosition);</div><div class='add'>+	    if (ch) er = entryHandleKey(co, ch);</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	case EV_MOUSE:</div><div class='add'>+	    if ((ev.u.mouse.type == MOUSE_BUTTON_DOWN) &amp;&amp;</div><div class='add'>+		(en-&gt;flags ^ NEWT_FLAG_HIDDEN)) {</div><div class='add'>+		if (strlen(en-&gt;buf) &gt;= ev.u.mouse.x - co-&gt;left) {</div><div class='add'>+		    en-&gt;cursorPosition = ev.u.mouse.x - co-&gt;left;</div><div class='add'>+		    newtGotorc(co-&gt;top,</div><div class='add'>+			       co-&gt;left +(en-&gt;cursorPosition - en-&gt;firstChar));</div><div class='add'>+		} else {</div><div class='add'>+		    en-&gt;cursorPosition = strlen(en-&gt;buf);</div><div class='add'>+		    newtGotorc(co-&gt;top,</div><div class='add'>+			       co-&gt;left +(en-&gt;cursorPosition - en-&gt;firstChar));</div><div class='add'>+		}</div><div class='add'>+	    }</div><div class='add'>+	    break;</div><div class='add'>+	}</div><div class='add'>+    } else</div><div class='add'>+	er.result = ER_IGNORED;</div><div class='add'>+</div><div class='add'>+    return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult entryHandleKey(newtComponent co, int key) {</div><div class='add'>+    struct entry * en = co-&gt;data;</div><div class='add'>+    struct eventResult er;</div><div class='add'>+    char * chptr, * insPoint;</div><div class='add'>+</div><div class='add'>+    er.result = ER_SWALLOWED;</div><div class='add'>+    switch (key) {</div><div class='add'>+      case '\r':				/* Return */</div><div class='add'>+	if (en-&gt;flags &amp; NEWT_FLAG_RETURNEXIT) {</div><div class='add'>+	    er.result = ER_EXITFORM;</div><div class='add'>+	} else {</div><div class='add'>+	    er.result = ER_NEXTCOMP;</div><div class='add'>+	}</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '\001':				/* ^A */</div><div class='add'>+      case NEWT_KEY_HOME:</div><div class='add'>+	en-&gt;cursorPosition = 0;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '\005':				/* ^E */</div><div class='add'>+      case NEWT_KEY_END:</div><div class='add'>+	en-&gt;cursorPosition = en-&gt;bufUsed;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '\013':				/* ^K */</div><div class='add'>+	en-&gt;bufUsed = en-&gt;cursorPosition;</div><div class='add'>+	memset(en-&gt;buf + en-&gt;bufUsed, 0, en-&gt;bufAlloced - en-&gt;bufUsed);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '\002':				/* ^B */</div><div class='add'>+      case NEWT_KEY_LEFT:</div><div class='add'>+	if (en-&gt;cursorPosition)</div><div class='add'>+	    en-&gt;cursorPosition--;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '\004':</div><div class='add'>+      case NEWT_KEY_DELETE:</div><div class='add'>+	chptr = en-&gt;buf + en-&gt;cursorPosition;</div><div class='add'>+	if (*chptr) {</div><div class='add'>+	    chptr++;</div><div class='add'>+	    while (*chptr) {</div><div class='add'>+		*(chptr - 1) = *chptr;</div><div class='add'>+		chptr++;</div><div class='add'>+	    }</div><div class='add'>+	    *(chptr - 1) = '\0';</div><div class='add'>+	    en-&gt;bufUsed--;</div><div class='add'>+	}</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case NEWT_KEY_BKSPC:</div><div class='add'>+	if (en-&gt;cursorPosition) {</div><div class='add'>+	    /* if this isn't true, there's nothing to erase */</div><div class='add'>+	    chptr = en-&gt;buf + en-&gt;cursorPosition;</div><div class='add'>+	    en-&gt;bufUsed--;</div><div class='add'>+	    en-&gt;cursorPosition--;</div><div class='add'>+	    while (*chptr) {</div><div class='add'>+		*(chptr - 1) = *chptr;</div><div class='add'>+		chptr++;</div><div class='add'>+	    }</div><div class='add'>+	    *(chptr - 1) = '\0';</div><div class='add'>+	}</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '\006':				/* ^B */</div><div class='add'>+      case NEWT_KEY_RIGHT:</div><div class='add'>+	if (en-&gt;cursorPosition &lt; en-&gt;bufUsed)</div><div class='add'>+	    en-&gt;cursorPosition++;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	if ((key &gt;= 0x20 &amp;&amp; key &lt;= 0x7e) || (key &gt;= 0xa0 &amp;&amp; key &lt;= 0xff)) {</div><div class='add'>+	    if (!(en-&gt;flags &amp; NEWT_FLAG_SCROLL) &amp;&amp; en-&gt;bufUsed &gt;= co-&gt;width) {</div><div class='add'>+		SLtt_beep();</div><div class='add'>+		break;</div><div class='add'>+	    }</div><div class='add'>+</div><div class='add'>+	    if ((en-&gt;bufUsed + 1) == en-&gt;bufAlloced) {</div><div class='add'>+		en-&gt;bufAlloced += 20;</div><div class='add'>+		en-&gt;buf = realloc(en-&gt;buf, en-&gt;bufAlloced);</div><div class='add'>+		if (en-&gt;resultPtr) *en-&gt;resultPtr = en-&gt;buf;</div><div class='add'>+		memset(en-&gt;buf + en-&gt;bufUsed + 1, 0, 20);</div><div class='add'>+	    }</div><div class='add'>+</div><div class='add'>+	    if (en-&gt;cursorPosition == en-&gt;bufUsed) {</div><div class='add'>+		en-&gt;bufUsed++;</div><div class='add'>+	    } else {</div><div class='add'>+		/* insert the new character */</div><div class='add'>+</div><div class='add'>+		/* chptr is the last character in the string */</div><div class='add'>+		chptr = (en-&gt;buf + en-&gt;bufUsed) - 1;</div><div class='add'>+		if ((en-&gt;bufUsed + 1) == en-&gt;bufAlloced) {</div><div class='add'>+		    /* this string fills the buffer, so clip it */</div><div class='add'>+		    chptr--;</div><div class='add'>+		} else</div><div class='add'>+		    en-&gt;bufUsed++;</div><div class='add'>+</div><div class='add'>+		insPoint = en-&gt;buf + en-&gt;cursorPosition;</div><div class='add'>+</div><div class='add'>+		while (chptr &gt;= insPoint) {</div><div class='add'>+		    *(chptr + 1) = *chptr;</div><div class='add'>+		    chptr--;</div><div class='add'>+		}</div><div class='add'>+</div><div class='add'>+	    }</div><div class='add'>+</div><div class='add'>+	    en-&gt;buf[en-&gt;cursorPosition++] = key;</div><div class='add'>+	} else {</div><div class='add'>+	    er.result = ER_IGNORED;</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    entryDraw(co);</div><div class='add'>+</div><div class='add'>+    return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char * newtEntryGetValue(newtComponent co) {</div><div class='add'>+    struct entry * en = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    return en-&gt;buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtEntrySetFilter(newtComponent co, newtEntryFilter filter, void * data) {</div><div class='add'>+    struct entry * en = co-&gt;data;</div><div class='add'>+    en-&gt;filter = filter;</div><div class='add'>+    en-&gt;filterData = data;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/form.c b/mdk-stage1/newt/form.c<br/>new file mode 100644<br/>index 000000000..4ad465e38<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/form.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/form.c</a></div><div class='hunk'>@@ -0,0 +1,712 @@</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+#include &lt;slang.h&gt;</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/****************************************************************************</div><div class='add'>+    These forms handle vertical scrolling of components with a height of 1</div><div class='add'>+</div><div class='add'>+    Horizontal scrolling won't work, and scrolling large widgets will fail</div><div class='add'>+    miserably. It shouldn't be too hard to fix either of those if anyone</div><div class='add'>+    cares to. I only use scrolling for listboxes and text boxes though so</div><div class='add'>+    I didn't bother.</div><div class='add'>+*****************************************************************************/</div><div class='add'>+</div><div class='add'>+struct element {</div><div class='add'>+    int top, left;		/* Actual, not virtual. These are translated */</div><div class='add'>+    newtComponent co;		/* into actual through vertOffset */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct fdInfo {</div><div class='add'>+    int fd;</div><div class='add'>+    int flags;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct form {</div><div class='add'>+    int numCompsAlloced;</div><div class='add'>+    struct element * elements;</div><div class='add'>+    int numComps;</div><div class='add'>+    int currComp;</div><div class='add'>+    int fixedHeight;</div><div class='add'>+    int flags;</div><div class='add'>+    int vertOffset;</div><div class='add'>+    newtComponent vertBar, exitComp;</div><div class='add'>+    const char * help;</div><div class='add'>+    int numRows;</div><div class='add'>+    int * hotKeys;</div><div class='add'>+    int numHotKeys;</div><div class='add'>+    int background;</div><div class='add'>+    int beenSet;</div><div class='add'>+    int numFds;</div><div class='add'>+    struct fdInfo * fds;</div><div class='add'>+    int maxFd;</div><div class='add'>+    int timer;    /* in milliseconds */</div><div class='add'>+    struct timeval lastTimeout;</div><div class='add'>+    void * helpTag;</div><div class='add'>+    newtCallback helpCb;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void gotoComponent(struct form * form, int newComp);</div><div class='add'>+static struct eventResult formEvent(newtComponent co, struct event ev);</div><div class='add'>+static struct eventResult sendEvent(newtComponent comp, struct event ev);</div><div class='add'>+static void formPlace(newtComponent co, int left, int top);</div><div class='add'>+</div><div class='add'>+/* Global, ick */</div><div class='add'>+static newtCallback helpCallback;</div><div class='add'>+</div><div class='add'>+/* this isn't static as grid.c tests against it to find forms */</div><div class='add'>+struct componentOps formOps = {</div><div class='add'>+    newtDrawForm,</div><div class='add'>+    formEvent,</div><div class='add'>+    newtFormDestroy,</div><div class='add'>+    formPlace,</div><div class='add'>+    newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+static inline int componentFits(newtComponent co, int compNum) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+    struct element * el = form-&gt;elements + compNum;</div><div class='add'>+</div><div class='add'>+    if ((co-&gt;top + form-&gt;vertOffset) &gt; el-&gt;top) return 0;</div><div class='add'>+    if ((co-&gt;top + form-&gt;vertOffset + co-&gt;height) &lt;</div><div class='add'>+	    (el-&gt;top + el-&gt;co-&gt;height)) return 0;</div><div class='add'>+</div><div class='add'>+    return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtForm(newtComponent vertBar, void * help, int flags) {</div><div class='add'>+    newtComponent co;</div><div class='add'>+    struct form * form;</div><div class='add'>+</div><div class='add'>+    co = malloc(sizeof(*co));</div><div class='add'>+    form = malloc(sizeof(*form));</div><div class='add'>+    co-&gt;data = form;</div><div class='add'>+    co-&gt;width = 0;</div><div class='add'>+    co-&gt;height = 0;</div><div class='add'>+    co-&gt;top = -1;</div><div class='add'>+    co-&gt;left = -1;</div><div class='add'>+    co-&gt;isMapped = 0;</div><div class='add'>+</div><div class='add'>+    co-&gt;takesFocus = 0;			/* we may have 0 components */</div><div class='add'>+    co-&gt;ops = &amp;formOps;</div><div class='add'>+</div><div class='add'>+    form-&gt;help = help;</div><div class='add'>+    form-&gt;flags = flags;</div><div class='add'>+    form-&gt;numCompsAlloced = 5;</div><div class='add'>+    form-&gt;numComps = 0;</div><div class='add'>+    form-&gt;currComp = -1;</div><div class='add'>+    form-&gt;vertOffset = 0;</div><div class='add'>+    form-&gt;fixedHeight = 0;</div><div class='add'>+    form-&gt;numRows = 0;</div><div class='add'>+    form-&gt;numFds = 0;</div><div class='add'>+    form-&gt;maxFd = 0;</div><div class='add'>+    form-&gt;fds = NULL;</div><div class='add'>+    form-&gt;beenSet = 0;</div><div class='add'>+    form-&gt;elements = malloc(sizeof(*(form-&gt;elements)) * form-&gt;numCompsAlloced);</div><div class='add'>+</div><div class='add'>+    form-&gt;background = COLORSET_WINDOW;</div><div class='add'>+    form-&gt;hotKeys = malloc(sizeof(int));</div><div class='add'>+    form-&gt;numHotKeys = 0;</div><div class='add'>+    form-&gt;timer = 0;</div><div class='add'>+    form-&gt;lastTimeout.tv_sec = form-&gt;lastTimeout.tv_usec = 0;</div><div class='add'>+    if (!(form-&gt;flags &amp; NEWT_FLAG_NOF12)) {</div><div class='add'>+	newtFormAddHotKey(co, NEWT_KEY_F12);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (vertBar)</div><div class='add'>+	form-&gt;vertBar = vertBar;</div><div class='add'>+    else</div><div class='add'>+	form-&gt;vertBar = NULL;</div><div class='add'>+</div><div class='add'>+    form-&gt;helpTag = help;</div><div class='add'>+    form-&gt;helpCb = helpCallback;</div><div class='add'>+</div><div class='add'>+    return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtFormGetCurrent(newtComponent co) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    return form-&gt;elements[form-&gt;currComp].co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormSetCurrent(newtComponent co, newtComponent subco) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+    int i, new;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; form-&gt;numComps; i++) {</div><div class='add'>+	 if (form-&gt;elements[i].co == subco) break;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (form-&gt;elements[i].co != subco) return;</div><div class='add'>+    new = i;</div><div class='add'>+</div><div class='add'>+    if (co-&gt;isMapped &amp;&amp; !componentFits(co, new)) {</div><div class='add'>+	gotoComponent(form, -1);</div><div class='add'>+	form-&gt;vertOffset = form-&gt;elements[new].top - co-&gt;top - 1;</div><div class='add'>+	if (form-&gt;vertOffset &gt; (form-&gt;numRows - co-&gt;height))</div><div class='add'>+	    form-&gt;vertOffset = form-&gt;numRows - co-&gt;height;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    gotoComponent(form, new);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormSetTimer(newtComponent co, int millisecs) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    form-&gt;timer = millisecs;</div><div class='add'>+    form-&gt;lastTimeout.tv_usec = 0;</div><div class='add'>+    form-&gt;lastTimeout.tv_sec = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormSetHeight(newtComponent co, int height) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    form-&gt;fixedHeight = 1;</div><div class='add'>+    co-&gt;height = height;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormSetWidth(newtComponent co, int width) {</div><div class='add'>+    co-&gt;width = width;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormAddComponent(newtComponent co, newtComponent newco) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    co-&gt;takesFocus = 1;</div><div class='add'>+</div><div class='add'>+    if (form-&gt;numCompsAlloced == form-&gt;numComps) {</div><div class='add'>+	form-&gt;numCompsAlloced += 5;</div><div class='add'>+	form-&gt;elements = realloc(form-&gt;elements,</div><div class='add'>+			    sizeof(*(form-&gt;elements)) * form-&gt;numCompsAlloced);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* we grab real values for these a bit later */</div><div class='add'>+    form-&gt;elements[form-&gt;numComps].left = -2;</div><div class='add'>+    form-&gt;elements[form-&gt;numComps].top = -2;</div><div class='add'>+    form-&gt;elements[form-&gt;numComps].co = newco;</div><div class='add'>+</div><div class='add'>+    if (newco-&gt;takesFocus &amp;&amp; form-&gt;currComp == -1)</div><div class='add'>+	form-&gt;currComp = form-&gt;numComps;</div><div class='add'>+</div><div class='add'>+    form-&gt;numComps++;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormAddComponents(newtComponent co, ...) {</div><div class='add'>+    va_list ap;</div><div class='add'>+    newtComponent subco;</div><div class='add'>+</div><div class='add'>+    va_start(ap, co);</div><div class='add'>+</div><div class='add'>+    while ((subco = va_arg(ap, newtComponent)))</div><div class='add'>+	newtFormAddComponent(co, subco);</div><div class='add'>+</div><div class='add'>+    va_end(ap);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void formPlace(newtComponent co, int left, int top) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+    int vertDelta, horizDelta;</div><div class='add'>+    struct element * el;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    newtFormSetSize(co);</div><div class='add'>+</div><div class='add'>+    vertDelta = top - co-&gt;top;</div><div class='add'>+    horizDelta = left - co-&gt;left;</div><div class='add'>+    co-&gt;top = top;</div><div class='add'>+    co-&gt;left = left;</div><div class='add'>+</div><div class='add'>+    for (i = 0, el = form-&gt;elements; i &lt; form-&gt;numComps; i++, el++) {</div><div class='add'>+	el-&gt;co-&gt;top += vertDelta;</div><div class='add'>+	el-&gt;top += vertDelta;</div><div class='add'>+	el-&gt;co-&gt;left += horizDelta;</div><div class='add'>+	el-&gt;left += horizDelta;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtDrawForm(newtComponent co) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+    struct element * el;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    newtFormSetSize(co);</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(form-&gt;background);</div><div class='add'>+    newtClearBox(co-&gt;left, co-&gt;top, co-&gt;width, co-&gt;height);</div><div class='add'>+    for (i = 0, el = form-&gt;elements; i &lt; form-&gt;numComps; i++, el++) {</div><div class='add'>+	/* the scrollbar *always* fits somewhere */</div><div class='add'>+	if (el-&gt;co == form-&gt;vertBar) {</div><div class='add'>+	    el-&gt;co-&gt;ops-&gt;mapped(el-&gt;co, 1);</div><div class='add'>+	    el-&gt;co-&gt;ops-&gt;draw(el-&gt;co);</div><div class='add'>+	} else {</div><div class='add'>+	    /* only draw it if it'll fit on the screen vertically */</div><div class='add'>+	    if (componentFits(co, i)) {</div><div class='add'>+		el-&gt;co-&gt;top = el-&gt;top - form-&gt;vertOffset;</div><div class='add'>+		el-&gt;co-&gt;ops-&gt;mapped(el-&gt;co, 1);</div><div class='add'>+		el-&gt;co-&gt;ops-&gt;draw(el-&gt;co);</div><div class='add'>+	    } else {</div><div class='add'>+		el-&gt;co-&gt;ops-&gt;mapped(el-&gt;co, 0);</div><div class='add'>+	    }</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (form-&gt;vertBar)</div><div class='add'>+	newtScrollbarSet(form-&gt;vertBar, form-&gt;vertOffset,</div><div class='add'>+			 form-&gt;numRows - co-&gt;height);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult formEvent(newtComponent co, struct event ev) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+    newtComponent subco = form-&gt;elements[form-&gt;currComp].co;</div><div class='add'>+    int new, wrap = 0;</div><div class='add'>+    struct eventResult er;</div><div class='add'>+    int dir = 0, page = 0;</div><div class='add'>+    int i, num, found;</div><div class='add'>+    struct element * el;</div><div class='add'>+</div><div class='add'>+    er.result = ER_IGNORED;</div><div class='add'>+    if (!form-&gt;numComps) return er;</div><div class='add'>+</div><div class='add'>+    subco = form-&gt;elements[form-&gt;currComp].co;</div><div class='add'>+</div><div class='add'>+    switch (ev.when) {</div><div class='add'>+      case EV_EARLY:</div><div class='add'>+	  if (ev.event == EV_KEYPRESS) {</div><div class='add'>+	    if (ev.u.key == NEWT_KEY_TAB) {</div><div class='add'>+		er.result = ER_SWALLOWED;</div><div class='add'>+		dir = 1;</div><div class='add'>+		wrap = 1;</div><div class='add'>+	    } else if (ev.u.key == NEWT_KEY_UNTAB) {</div><div class='add'>+		er.result = ER_SWALLOWED;</div><div class='add'>+		dir = -1;</div><div class='add'>+		wrap = 1;</div><div class='add'>+	    }</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	if (form-&gt;numComps) {</div><div class='add'>+	    i = form-&gt;currComp;</div><div class='add'>+	    num = 0;</div><div class='add'>+	    while (er.result == ER_IGNORED &amp;&amp; num != form-&gt;numComps ) {</div><div class='add'>+		er = form-&gt;elements[i].co-&gt;ops-&gt;event(form-&gt;elements[i].co, ev);</div><div class='add'>+</div><div class='add'>+		num++;</div><div class='add'>+		i++;</div><div class='add'>+		if (i == form-&gt;numComps) i = 0;</div><div class='add'>+	    }</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case EV_NORMAL:</div><div class='add'>+	  if (ev.event == EV_MOUSE) {</div><div class='add'>+	      found = 0;</div><div class='add'>+	      for (i = 0, el = form-&gt;elements; i &lt; form-&gt;numComps; i++, el++) {</div><div class='add'>+		  if ((el-&gt;co-&gt;top &lt;= ev.u.mouse.y) &amp;&amp;</div><div class='add'>+		      (el-&gt;co-&gt;top + el-&gt;co-&gt;height &gt; ev.u.mouse.y) &amp;&amp;</div><div class='add'>+		      (el-&gt;co-&gt;left &lt;= ev.u.mouse.x) &amp;&amp;</div><div class='add'>+		      (el-&gt;co-&gt;left + el-&gt;co-&gt;width &gt; ev.u.mouse.x)) {</div><div class='add'>+		      found = 1;</div><div class='add'>+		      if (el-&gt;co-&gt;takesFocus) {</div><div class='add'>+			  gotoComponent(form, i);</div><div class='add'>+			  subco = form-&gt;elements[form-&gt;currComp].co;</div><div class='add'>+		      }</div><div class='add'>+		  }</div><div class='add'>+		  /* If we did not find a co to send this event to, we</div><div class='add'>+		     should just swallow the event here. */</div><div class='add'>+	      }</div><div class='add'>+	      if (!found) {</div><div class='add'>+		  er.result = ER_SWALLOWED;</div><div class='add'>+</div><div class='add'>+		  return er;</div><div class='add'>+	      }</div><div class='add'>+	  }</div><div class='add'>+	er = subco-&gt;ops-&gt;event(subco, ev);</div><div class='add'>+	switch (er.result) {</div><div class='add'>+	  case ER_NEXTCOMP:</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    dir = 1;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case ER_EXITFORM:</div><div class='add'>+	    form-&gt;exitComp = subco;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  default:</div><div class='add'>+	    break;</div><div class='add'>+	}</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case EV_LATE:</div><div class='add'>+	er = subco-&gt;ops-&gt;event(subco, ev);</div><div class='add'>+</div><div class='add'>+	if (er.result == ER_IGNORED) {</div><div class='add'>+	    switch (ev.u.key) {</div><div class='add'>+	      case NEWT_KEY_UP:</div><div class='add'>+	      case NEWT_KEY_LEFT:</div><div class='add'>+	      case NEWT_KEY_BKSPC:</div><div class='add'>+		er.result = ER_SWALLOWED;</div><div class='add'>+		dir = -1;</div><div class='add'>+		break;</div><div class='add'>+</div><div class='add'>+	      case NEWT_KEY_DOWN:</div><div class='add'>+	      case NEWT_KEY_RIGHT:</div><div class='add'>+		er.result = ER_SWALLOWED;</div><div class='add'>+		dir = 1;</div><div class='add'>+		break;</div><div class='add'>+</div><div class='add'>+	     case NEWT_KEY_PGUP:</div><div class='add'>+		er.result = ER_SWALLOWED;</div><div class='add'>+		dir = -1;</div><div class='add'>+		page = 1;</div><div class='add'>+		break;</div><div class='add'>+</div><div class='add'>+	     case NEWT_KEY_PGDN:</div><div class='add'>+		er.result = ER_SWALLOWED;</div><div class='add'>+		dir = 1;</div><div class='add'>+		page = 1;</div><div class='add'>+		break;</div><div class='add'>+	    }</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (dir) {</div><div class='add'>+	new = form-&gt;currComp;</div><div class='add'>+</div><div class='add'>+	if (page) {</div><div class='add'>+	    new += dir * co-&gt;height;</div><div class='add'>+	    if (new &lt; 0)</div><div class='add'>+		new = 0;</div><div class='add'>+	    else if (new &gt;= form-&gt;numComps)</div><div class='add'>+		new = (form-&gt;numComps - 1);</div><div class='add'>+</div><div class='add'>+	    while (!form-&gt;elements[new].co-&gt;takesFocus)</div><div class='add'>+		new = new - dir;</div><div class='add'>+	} else {</div><div class='add'>+	    do {</div><div class='add'>+		new += dir;</div><div class='add'>+</div><div class='add'>+		if (wrap) {</div><div class='add'>+		    if (new &lt; 0)</div><div class='add'>+			new = form-&gt;numComps - 1;</div><div class='add'>+		    else if (new &gt;= form-&gt;numComps)</div><div class='add'>+			new = 0;</div><div class='add'>+		} else if (new &lt; 0 || new &gt;= form-&gt;numComps)</div><div class='add'>+		    return er;</div><div class='add'>+	    } while (!form-&gt;elements[new].co-&gt;takesFocus);</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	/* make sure this component is visible */</div><div class='add'>+	if (!componentFits(co, new)) {</div><div class='add'>+	    gotoComponent(form, -1);</div><div class='add'>+</div><div class='add'>+	    if (dir &lt; 0) {</div><div class='add'>+		/* make the new component the first one */</div><div class='add'>+		form-&gt;vertOffset = form-&gt;elements[new].top - co-&gt;top;</div><div class='add'>+	    } else {</div><div class='add'>+		/* make the new component the last one */</div><div class='add'>+		form-&gt;vertOffset = (form-&gt;elements[new].top +</div><div class='add'>+					form-&gt;elements[new].co-&gt;height) -</div><div class='add'>+				    (co-&gt;top + co-&gt;height);</div><div class='add'>+	    }</div><div class='add'>+</div><div class='add'>+	    if (form-&gt;vertOffset &lt; 0) form-&gt;vertOffset = 0;</div><div class='add'>+	    if (form-&gt;vertOffset &gt; (form-&gt;numRows - co-&gt;height))</div><div class='add'>+		form-&gt;vertOffset = form-&gt;numRows - co-&gt;height;</div><div class='add'>+</div><div class='add'>+	    newtDrawForm(co);</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	gotoComponent(form, new);</div><div class='add'>+	er.result = ER_SWALLOWED;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* this also destroys all of the components on the form */</div><div class='add'>+void newtFormDestroy(newtComponent co) {</div><div class='add'>+    newtComponent subco;</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    /* first, destroy all of the components */</div><div class='add'>+    for (i = 0; i &lt; form-&gt;numComps; i++) {</div><div class='add'>+	subco = form-&gt;elements[i].co;</div><div class='add'>+	if (subco-&gt;ops-&gt;destroy) {</div><div class='add'>+	    subco-&gt;ops-&gt;destroy(subco);</div><div class='add'>+	} else {</div><div class='add'>+	    if (subco-&gt;data) free(subco-&gt;data);</div><div class='add'>+	    free(subco);</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (form-&gt;hotKeys) free(form-&gt;hotKeys);</div><div class='add'>+</div><div class='add'>+    free(form-&gt;elements);</div><div class='add'>+    free(form);</div><div class='add'>+    free(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtRunForm(newtComponent co) {</div><div class='add'>+    struct newtExitStruct es;</div><div class='add'>+</div><div class='add'>+    newtFormRun(co, &amp;es);</div><div class='add'>+    if (es.reason == NEWT_EXIT_HOTKEY) {</div><div class='add'>+	if (es.u.key == NEWT_KEY_F12) {</div><div class='add'>+	    es.reason = NEWT_EXIT_COMPONENT;</div><div class='add'>+	    es.u.co = co;</div><div class='add'>+	} else {</div><div class='add'>+	    return NULL;</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return es.u.co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormAddHotKey(newtComponent co, int key) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    form-&gt;numHotKeys++;</div><div class='add'>+    form-&gt;hotKeys = realloc(form-&gt;hotKeys, sizeof(int) * form-&gt;numHotKeys);</div><div class='add'>+    form-&gt;hotKeys[form-&gt;numHotKeys - 1] = key;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormSetSize(newtComponent co) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+    int delta, i;</div><div class='add'>+    struct element * el;</div><div class='add'>+</div><div class='add'>+    if (form-&gt;beenSet) return;</div><div class='add'>+</div><div class='add'>+    form-&gt;beenSet = 1;</div><div class='add'>+</div><div class='add'>+    if (!form-&gt;numComps) return;</div><div class='add'>+</div><div class='add'>+    co-&gt;width = 0;</div><div class='add'>+    if (!form-&gt;fixedHeight) co-&gt;height = 0;</div><div class='add'>+</div><div class='add'>+    co-&gt;top = form-&gt;elements[0].co-&gt;top;</div><div class='add'>+    co-&gt;left = form-&gt;elements[0].co-&gt;left;</div><div class='add'>+    for (i = 0, el = form-&gt;elements; i &lt; form-&gt;numComps; i++, el++) {</div><div class='add'>+	if (el-&gt;co-&gt;ops == &amp;formOps)</div><div class='add'>+	    newtFormSetSize(el-&gt;co);</div><div class='add'>+</div><div class='add'>+ 	el-&gt;left = el-&gt;co-&gt;left;</div><div class='add'>+ 	el-&gt;top = el-&gt;co-&gt;top;</div><div class='add'>+</div><div class='add'>+	if (co-&gt;left &gt; el-&gt;co-&gt;left) {</div><div class='add'>+	    delta = co-&gt;left - el-&gt;co-&gt;left;</div><div class='add'>+	    co-&gt;left -= delta;</div><div class='add'>+	    co-&gt;width += delta;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	if (co-&gt;top &gt; el-&gt;co-&gt;top) {</div><div class='add'>+	    delta = co-&gt;top - el-&gt;co-&gt;top;</div><div class='add'>+	    co-&gt;top -= delta;</div><div class='add'>+	    if (!form-&gt;fixedHeight)</div><div class='add'>+		co-&gt;height += delta;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	if ((co-&gt;left + co-&gt;width) &lt; (el-&gt;co-&gt;left + el-&gt;co-&gt;width))</div><div class='add'>+	    co-&gt;width = (el-&gt;co-&gt;left + el-&gt;co-&gt;width) - co-&gt;left;</div><div class='add'>+</div><div class='add'>+	if (!form-&gt;fixedHeight) {</div><div class='add'>+	    if ((co-&gt;top + co-&gt;height) &lt; (el-&gt;co-&gt;top + el-&gt;co-&gt;height))</div><div class='add'>+		co-&gt;height = (el-&gt;co-&gt;top + el-&gt;co-&gt;height) - co-&gt;top;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	if ((el-&gt;co-&gt;top + el-&gt;co-&gt;height - co-&gt;top) &gt; form-&gt;numRows) {</div><div class='add'>+	    form-&gt;numRows = el-&gt;co-&gt;top + el-&gt;co-&gt;height - co-&gt;top;</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormRun(newtComponent co, struct newtExitStruct * es) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+    struct event ev;</div><div class='add'>+    struct eventResult er;</div><div class='add'>+    int key, i, max;</div><div class='add'>+    int done = 0;</div><div class='add'>+    fd_set readSet, writeSet;</div><div class='add'>+    struct timeval nextTimeout, now, timeout;</div><div class='add'>+</div><div class='add'>+    newtFormSetSize(co);</div><div class='add'>+    /* draw all of the components */</div><div class='add'>+    newtDrawForm(co);</div><div class='add'>+</div><div class='add'>+    if (form-&gt;currComp == -1) {</div><div class='add'>+	gotoComponent(form, 0);</div><div class='add'>+    } else</div><div class='add'>+	gotoComponent(form, form-&gt;currComp);</div><div class='add'>+</div><div class='add'>+    while (!done) {</div><div class='add'>+	newtRefresh();</div><div class='add'>+</div><div class='add'>+	FD_ZERO(&amp;readSet);</div><div class='add'>+	FD_ZERO(&amp;writeSet);</div><div class='add'>+	FD_SET(0, &amp;readSet);</div><div class='add'>+	max = form-&gt;maxFd;</div><div class='add'>+</div><div class='add'>+	for (i = 0; i &lt; form-&gt;numFds; i++) {</div><div class='add'>+	    if (form-&gt;fds[i].flags &amp; NEWT_FD_READ)</div><div class='add'>+		FD_SET(form-&gt;fds[i].fd, &amp;readSet);</div><div class='add'>+	    if (form-&gt;fds[i].flags &amp; NEWT_FD_WRITE)</div><div class='add'>+		FD_SET(form-&gt;fds[i].fd, &amp;writeSet);</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	if (form-&gt;timer) {</div><div class='add'>+	    /* Calculate when we next need to return with a timeout. Do</div><div class='add'>+	       this inside the loop in case a callback resets the timer. */</div><div class='add'>+	    if (!form-&gt;lastTimeout.tv_sec &amp;&amp; !form-&gt;lastTimeout.tv_usec)</div><div class='add'>+		gettimeofday(&amp;form-&gt;lastTimeout, NULL);</div><div class='add'>+</div><div class='add'>+	    nextTimeout.tv_sec = form-&gt;lastTimeout.tv_sec + </div><div class='add'>+		    (form-&gt;timer / 1000);</div><div class='add'>+	    nextTimeout.tv_usec = form-&gt;lastTimeout.tv_usec + </div><div class='add'>+				    (form-&gt;timer % 1000) * 1000;</div><div class='add'>+</div><div class='add'>+	    gettimeofday(&amp;now, 0);</div><div class='add'>+</div><div class='add'>+	    if (now.tv_sec &gt; nextTimeout.tv_sec) {</div><div class='add'>+		timeout.tv_sec = timeout.tv_usec = 0;</div><div class='add'>+	    } else if (now.tv_sec == nextTimeout.tv_sec) {</div><div class='add'>+		timeout.tv_sec = 0;</div><div class='add'>+		if (now.tv_usec &gt; nextTimeout.tv_usec)</div><div class='add'>+		    timeout.tv_usec = 0;</div><div class='add'>+		else</div><div class='add'>+		    timeout.tv_usec = nextTimeout.tv_usec - now.tv_usec;</div><div class='add'>+	    } else if (now.tv_sec &lt; nextTimeout.tv_sec) {</div><div class='add'>+		timeout.tv_sec = nextTimeout.tv_sec - now.tv_sec;</div><div class='add'>+		if (now.tv_usec &gt; nextTimeout.tv_usec)</div><div class='add'>+		    timeout.tv_sec--,</div><div class='add'>+		    timeout.tv_usec = nextTimeout.tv_usec + 1000000 -</div><div class='add'>+					now.tv_usec;</div><div class='add'>+		else </div><div class='add'>+		    timeout.tv_usec = nextTimeout.tv_usec - now.tv_usec;</div><div class='add'>+	    }</div><div class='add'>+	} else {</div><div class='add'>+	    timeout.tv_sec = timeout.tv_usec = 0;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	i = select(max + 1, &amp;readSet, &amp;writeSet, NULL, </div><div class='add'>+			form-&gt;timer ? &amp;timeout : NULL);</div><div class='add'>+	if (i &lt; 0) continue;	/* ?? What should we do here? */</div><div class='add'>+</div><div class='add'>+	if (i == 0) {</div><div class='add'>+	    done = 1;</div><div class='add'>+	    es-&gt;reason = NEWT_EXIT_TIMER;</div><div class='add'>+	    gettimeofday(&amp;form-&gt;lastTimeout, NULL);</div><div class='add'>+	} else</div><div class='add'>+	{</div><div class='add'>+	    if (FD_ISSET(0, &amp;readSet)) {</div><div class='add'>+</div><div class='add'>+		key = newtGetKey();</div><div class='add'>+</div><div class='add'>+		if (key == NEWT_KEY_RESIZE) {</div><div class='add'>+		    /* newtResizeScreen(1); */</div><div class='add'>+		    continue;</div><div class='add'>+		}</div><div class='add'>+</div><div class='add'>+		for (i = 0; i &lt; form-&gt;numHotKeys; i++) {</div><div class='add'>+		    if (form-&gt;hotKeys[i] == key) {</div><div class='add'>+			es-&gt;reason = NEWT_EXIT_HOTKEY;</div><div class='add'>+			es-&gt;u.key = key;</div><div class='add'>+			done = 1;</div><div class='add'>+			break;</div><div class='add'>+		    }</div><div class='add'>+		}</div><div class='add'>+</div><div class='add'>+		if (key == NEWT_KEY_F1 &amp;&amp; form-&gt;helpTag &amp;&amp; form-&gt;helpCb)</div><div class='add'>+		    form-&gt;helpCb(co, form-&gt;helpTag);</div><div class='add'>+</div><div class='add'>+		if (!done) {</div><div class='add'>+		    ev.event = EV_KEYPRESS;</div><div class='add'>+		    ev.u.key = key;</div><div class='add'>+</div><div class='add'>+		    er = sendEvent(co, ev);</div><div class='add'>+</div><div class='add'>+		    if (er.result == ER_EXITFORM) {</div><div class='add'>+			done = 1;</div><div class='add'>+			es-&gt;reason = NEWT_EXIT_COMPONENT;</div><div class='add'>+			es-&gt;u.co = form-&gt;exitComp;</div><div class='add'>+		    }</div><div class='add'>+		}</div><div class='add'>+	    } else {</div><div class='add'>+		es-&gt;reason = NEWT_EXIT_FDREADY;</div><div class='add'>+		done = 1;</div><div class='add'>+	    }</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+    newtRefresh();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult sendEvent(newtComponent co, struct event ev) {</div><div class='add'>+    struct eventResult er;</div><div class='add'>+</div><div class='add'>+    ev.when = EV_EARLY;</div><div class='add'>+    er = co-&gt;ops-&gt;event(co, ev);</div><div class='add'>+</div><div class='add'>+    if (er.result == ER_IGNORED) {</div><div class='add'>+	ev.when = EV_NORMAL;</div><div class='add'>+	er = co-&gt;ops-&gt;event(co, ev);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (er.result == ER_IGNORED) {</div><div class='add'>+	ev.when = EV_LATE;</div><div class='add'>+	er = co-&gt;ops-&gt;event(co, ev);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void gotoComponent(struct form * form, int newComp) {</div><div class='add'>+    struct event ev;</div><div class='add'>+</div><div class='add'>+    if (form-&gt;currComp != -1) {</div><div class='add'>+	ev.event = EV_UNFOCUS;</div><div class='add'>+	sendEvent(form-&gt;elements[form-&gt;currComp].co, ev);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    form-&gt;currComp = newComp;</div><div class='add'>+</div><div class='add'>+    if (form-&gt;currComp != -1) {</div><div class='add'>+	ev.event = EV_FOCUS;</div><div class='add'>+	ev.when = EV_NORMAL;</div><div class='add'>+	sendEvent(form-&gt;elements[form-&gt;currComp].co, ev);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtComponentAddCallback(newtComponent co, newtCallback f, void * data) {</div><div class='add'>+    co-&gt;callback = f;</div><div class='add'>+    co-&gt;callbackData = data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtComponentTakesFocus(newtComponent co, int val) {</div><div class='add'>+    co-&gt;takesFocus = val;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormSetBackground(newtComponent co, int color) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    form-&gt;background = color;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFormWatchFd(newtComponent co, int fd, int fdFlags) {</div><div class='add'>+    struct form * form = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    form-&gt;fds = realloc(form-&gt;fds, (form-&gt;numFds + 1) * sizeof(*form-&gt;fds));</div><div class='add'>+    form-&gt;fds[form-&gt;numFds].fd = fd;</div><div class='add'>+    form-&gt;fds[form-&gt;numFds++].flags = fdFlags;</div><div class='add'>+    if (form-&gt;maxFd &lt; fd) form-&gt;maxFd = fd;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtSetHelpCallback(newtCallback cb) {</div><div class='add'>+    helpCallback = cb;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/grid.c b/mdk-stage1/newt/grid.c<br/>new file mode 100644<br/>index 000000000..433011396<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/grid.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/grid.c</a></div><div class='hunk'>@@ -0,0 +1,389 @@</div><div class='add'>+#include &lt;alloca.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct gridField {</div><div class='add'>+    enum newtGridElement type;</div><div class='add'>+    union {</div><div class='add'>+	newtGrid grid;</div><div class='add'>+	newtComponent co;</div><div class='add'>+    } u;</div><div class='add'>+    int padLeft, padTop, padRight, padBottom;</div><div class='add'>+    int anchor;</div><div class='add'>+    int flags;</div><div class='add'>+}; </div><div class='add'>+</div><div class='add'>+struct grid_s {</div><div class='add'>+    int rows, cols;</div><div class='add'>+    int width, height;		/* totals, -1 means unknown */</div><div class='add'>+    struct gridField ** fields;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* this is a bit of a hack */</div><div class='add'>+extern struct componentOps formOps[];</div><div class='add'>+</div><div class='add'>+newtGrid newtCreateGrid(int cols, int rows) {</div><div class='add'>+    newtGrid grid;</div><div class='add'>+</div><div class='add'>+    grid = malloc(sizeof(*grid));</div><div class='add'>+    grid-&gt;rows = rows;</div><div class='add'>+    grid-&gt;cols = cols;</div><div class='add'>+</div><div class='add'>+    grid-&gt;fields = malloc(sizeof(*grid-&gt;fields) * cols);</div><div class='add'>+    while (cols--) {</div><div class='add'>+	grid-&gt;fields[cols] = malloc(sizeof(**(grid-&gt;fields)) * rows);</div><div class='add'>+	memset(grid-&gt;fields[cols], 0, sizeof(**(grid-&gt;fields)) * rows);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    grid-&gt;width = grid-&gt;height = -1;</div><div class='add'>+</div><div class='add'>+    return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridSetField(newtGrid grid, int col, int row, </div><div class='add'>+		      enum newtGridElement type, void * val, int padLeft,</div><div class='add'>+		      int padTop, int padRight, int padBottom, int anchor,</div><div class='add'>+		      int flags) {</div><div class='add'>+    struct gridField * field = &amp;grid-&gt;fields[col][row];</div><div class='add'>+</div><div class='add'>+    if (field-&gt;type == NEWT_GRID_SUBGRID) </div><div class='add'>+	newtGridFree(field-&gt;u.grid, 1);</div><div class='add'>+</div><div class='add'>+    field-&gt;type = type;</div><div class='add'>+    field-&gt;u.co = (void *) val;</div><div class='add'>+</div><div class='add'>+    field-&gt;padLeft = padLeft;</div><div class='add'>+    field-&gt;padRight = padRight;</div><div class='add'>+    field-&gt;padTop = padTop;</div><div class='add'>+    field-&gt;padBottom = padBottom;</div><div class='add'>+    field-&gt;anchor = anchor;</div><div class='add'>+    field-&gt;flags = flags;</div><div class='add'>+</div><div class='add'>+    grid-&gt;width = grid-&gt;height = -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void distSpace(int extra, int items, int * list) {</div><div class='add'>+    int all, some, i;</div><div class='add'>+</div><div class='add'>+    all = extra / items;</div><div class='add'>+    some = extra % items;</div><div class='add'>+    for (i = 0; i &lt; items; i++) {</div><div class='add'>+	list[i] += all;</div><div class='add'>+	if (some) {</div><div class='add'>+	    list[i]++;</div><div class='add'>+	    some--;</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void shuffleGrid(newtGrid grid, int left, int top, int set) {</div><div class='add'>+    struct gridField * field;</div><div class='add'>+    int row, col;</div><div class='add'>+    int i, j;</div><div class='add'>+    int minWidth, minHeight;</div><div class='add'>+    int * widths, * heights;</div><div class='add'>+    int thisLeft, thisTop;</div><div class='add'>+    int x, y, remx, remy;</div><div class='add'>+</div><div class='add'>+    widths = alloca(sizeof(*widths) * grid-&gt;cols);</div><div class='add'>+    memset(widths, 0, sizeof(*widths) * grid-&gt;cols);</div><div class='add'>+    heights = alloca(sizeof(*heights) * grid-&gt;rows);</div><div class='add'>+    memset(heights, 0, sizeof(*heights) * grid-&gt;rows);</div><div class='add'>+</div><div class='add'>+    minWidth = 0;</div><div class='add'>+    for (row = 0; row &lt; grid-&gt;rows; row++) {</div><div class='add'>+	i = 0;</div><div class='add'>+	for (col = 0; col &lt; grid-&gt;cols; col++) {</div><div class='add'>+	    field = &amp;grid-&gt;fields[col][row];</div><div class='add'>+	    if (field-&gt;type == NEWT_GRID_SUBGRID) {</div><div class='add'>+		/* we'll have to redo this later */</div><div class='add'>+		if (field-&gt;u.grid-&gt;width == -1) </div><div class='add'>+		    shuffleGrid(field-&gt;u.grid, left, top, 0);</div><div class='add'>+		j = field-&gt;u.grid-&gt;width;</div><div class='add'>+	    } else if (field-&gt;type == NEWT_GRID_COMPONENT) {</div><div class='add'>+		if (field-&gt;u.co-&gt;ops == formOps)</div><div class='add'>+		    newtFormSetSize(field-&gt;u.co);</div><div class='add'>+		j = field-&gt;u.co-&gt;width;</div><div class='add'>+	    } else </div><div class='add'>+		j = 0;</div><div class='add'>+</div><div class='add'>+	    j += field-&gt;padLeft + field-&gt;padRight;</div><div class='add'>+</div><div class='add'>+	    if (j &gt; widths[col]) widths[col] = j;</div><div class='add'>+	    i += widths[col];</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	if (i &gt; minWidth) minWidth = i;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    minHeight = 0;</div><div class='add'>+    for (col = 0; col &lt; grid-&gt;cols; col++) {</div><div class='add'>+	i = 0;</div><div class='add'>+	for (row = 0; row &lt; grid-&gt;rows; row++) {</div><div class='add'>+	    field = &amp;grid-&gt;fields[col][row];</div><div class='add'>+	    if (field-&gt;type == NEWT_GRID_SUBGRID) {</div><div class='add'>+		/* we'll have to redo this later */</div><div class='add'>+		if (field-&gt;u.grid-&gt;height == -1) </div><div class='add'>+		    shuffleGrid(field-&gt;u.grid, 0, 0, 0);</div><div class='add'>+		j = field-&gt;u.grid-&gt;height;</div><div class='add'>+	    } else if (field-&gt;type == NEWT_GRID_COMPONENT){</div><div class='add'>+		j = field-&gt;u.co-&gt;height;</div><div class='add'>+	    } else </div><div class='add'>+		j = 0;</div><div class='add'>+</div><div class='add'>+	    j += field-&gt;padTop + field-&gt;padBottom;</div><div class='add'>+</div><div class='add'>+	    if (j &gt; heights[row]) heights[row] = j;</div><div class='add'>+	    i += heights[row];</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	if (i &gt; minHeight) minHeight = i;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* this catches the -1 case */</div><div class='add'>+    if (grid-&gt;width &lt; minWidth) grid-&gt;width = minWidth;		/* ack! */</div><div class='add'>+    if (grid-&gt;height &lt; minHeight) grid-&gt;height = minHeight;	/* ditto! */</div><div class='add'>+</div><div class='add'>+    if (!set) return;</div><div class='add'>+</div><div class='add'>+    distSpace(grid-&gt;width - minWidth, grid-&gt;cols, widths);</div><div class='add'>+    distSpace(grid-&gt;height - minHeight, grid-&gt;rows, heights);</div><div class='add'>+</div><div class='add'>+    thisTop = top;</div><div class='add'>+    for (row = 0; row &lt; grid-&gt;rows; row++) {</div><div class='add'>+	i = 0;</div><div class='add'>+	thisLeft = left;</div><div class='add'>+	for (col = 0; col &lt; grid-&gt;cols; col++) {</div><div class='add'>+	    field = &amp;grid-&gt;fields[col][row];</div><div class='add'>+</div><div class='add'>+	    if (field-&gt;type == NEWT_GRID_EMPTY) continue;</div><div class='add'>+</div><div class='add'>+	    x = thisLeft + field-&gt;padLeft;</div><div class='add'>+	    remx = widths[col] - field-&gt;padLeft - field-&gt;padRight;</div><div class='add'>+	    y = thisTop + field-&gt;padTop;</div><div class='add'>+	    remy = heights[row] - field-&gt;padTop - field-&gt;padBottom;</div><div class='add'>+</div><div class='add'>+	    if (field-&gt;type == NEWT_GRID_SUBGRID) {</div><div class='add'>+		remx -= field-&gt;u.grid-&gt;width;</div><div class='add'>+		remy -= field-&gt;u.grid-&gt;height;</div><div class='add'>+	    } else if (field-&gt;type == NEWT_GRID_COMPONENT) {</div><div class='add'>+		remx -= field-&gt;u.co-&gt;width;</div><div class='add'>+		remy -= field-&gt;u.co-&gt;height;</div><div class='add'>+	    }</div><div class='add'>+</div><div class='add'>+	    if (!(field-&gt;flags &amp; NEWT_GRID_FLAG_GROWX)) {</div><div class='add'>+		if (field-&gt;anchor &amp; NEWT_ANCHOR_RIGHT)</div><div class='add'>+		    x += remx;</div><div class='add'>+		else if (!(field-&gt;anchor &amp; NEWT_ANCHOR_LEFT))</div><div class='add'>+		    x += (remx / 2);</div><div class='add'>+	    }</div><div class='add'>+	 </div><div class='add'>+	    if (!(field-&gt;flags &amp; NEWT_GRID_FLAG_GROWY)) {</div><div class='add'>+		if (field-&gt;anchor &amp; NEWT_ANCHOR_BOTTOM)</div><div class='add'>+		    y += remx;</div><div class='add'>+		else if (!(field-&gt;anchor &amp; NEWT_ANCHOR_TOP))</div><div class='add'>+		    y += (remy / 2);</div><div class='add'>+	    }</div><div class='add'>+</div><div class='add'>+	    if (field-&gt;type == NEWT_GRID_SUBGRID) {</div><div class='add'>+		if (field-&gt;flags &amp; NEWT_GRID_FLAG_GROWX)</div><div class='add'>+		    field-&gt;u.grid-&gt;width = widths[col] - field-&gt;padLeft </div><div class='add'>+						- field-&gt;padRight;</div><div class='add'>+		if (field-&gt;flags &amp; NEWT_GRID_FLAG_GROWY)</div><div class='add'>+		    field-&gt;u.grid-&gt;height = heights[col] - field-&gt;padTop</div><div class='add'>+						- field-&gt;padBottom;</div><div class='add'>+</div><div class='add'>+		shuffleGrid(field-&gt;u.grid, x, y, 1);</div><div class='add'>+	    } else if (field-&gt;type == NEWT_GRID_COMPONENT) {</div><div class='add'>+		field-&gt;u.co-&gt;ops-&gt;place(field-&gt;u.co, x, y);</div><div class='add'>+	    }</div><div class='add'>+</div><div class='add'>+	    thisLeft += widths[col];</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	thisTop += heights[row];</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridPlace(newtGrid grid, int left, int top) {</div><div class='add'>+    shuffleGrid(grid, left, top, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridFree(newtGrid grid, int recurse) {</div><div class='add'>+    int row, col;</div><div class='add'>+</div><div class='add'>+    for (col = 0; col &lt; grid-&gt;cols; col++) {</div><div class='add'>+	if (recurse) {</div><div class='add'>+	    for (row = 0; row &lt; grid-&gt;rows; row++) {</div><div class='add'>+		if (grid-&gt;fields[col][row].type == NEWT_GRID_SUBGRID)</div><div class='add'>+		    newtGridFree(grid-&gt;fields[col][row].u.grid, 1);</div><div class='add'>+	    }</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	free(grid-&gt;fields[col]);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(grid-&gt;fields);</div><div class='add'>+    free(grid);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridGetSize(newtGrid grid, int * width, int * height) {</div><div class='add'>+    if (grid-&gt;width == -1 || grid-&gt;height == -1) {</div><div class='add'>+	grid-&gt;width = grid-&gt;height = -1;</div><div class='add'>+	shuffleGrid(grid, 0, 0, 1);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *width = grid-&gt;width;</div><div class='add'>+    *height = grid-&gt;height;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridWrappedWindow(newtGrid grid, char * title) {</div><div class='add'>+    int width, height, offset = 0;</div><div class='add'>+</div><div class='add'>+    newtGridGetSize(grid, &amp;width, &amp;height);</div><div class='add'>+    if (width &lt; strlen(title) + 2) {</div><div class='add'>+	offset = ((strlen(title) + 2) - width) / 2; </div><div class='add'>+	width = strlen(title) + 2;</div><div class='add'>+    }</div><div class='add'>+    newtCenteredWindow(width + 2, height + 2, title);</div><div class='add'>+    newtGridPlace(grid, 1 + offset, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridWrappedWindowAt(newtGrid grid, char * title, int left, int top) {</div><div class='add'>+    int width, height;</div><div class='add'>+</div><div class='add'>+    newtGridGetSize(grid, &amp;width, &amp;height);</div><div class='add'>+    newtOpenWindow(left, top, width + 2, height + 2, title);</div><div class='add'>+    newtGridPlace(grid, 1, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGridAddComponentsToForm(newtGrid grid, newtComponent form, </div><div class='add'>+				 int recurse) {</div><div class='add'>+    int row, col;</div><div class='add'>+</div><div class='add'>+    for (col = 0; col &lt; grid-&gt;cols; col++) {</div><div class='add'>+	for (row = 0; row &lt; grid-&gt;rows; row++) {</div><div class='add'>+	    if (grid-&gt;fields[col][row].type == NEWT_GRID_SUBGRID &amp;&amp; recurse)</div><div class='add'>+		newtGridAddComponentsToForm(grid-&gt;fields[col][row].u.grid,</div><div class='add'>+					    form, 1);</div><div class='add'>+	    else if (grid-&gt;fields[col][row].type == NEWT_GRID_COMPONENT)</div><div class='add'>+		newtFormAddComponent(form, grid-&gt;fields[col][row].u.co);</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* this handles up to 50 items */</div><div class='add'>+static newtGrid stackem(int isVert, enum newtGridElement type1, void * what1,</div><div class='add'>+			va_list args, int close) {</div><div class='add'>+    struct item {</div><div class='add'>+	enum newtGridElement type;</div><div class='add'>+	void * what;</div><div class='add'>+    } items[50];</div><div class='add'>+    int i, num;</div><div class='add'>+    newtGrid grid;</div><div class='add'>+    </div><div class='add'>+    items[0].type = type1, items[0].what = what1, num = 1;</div><div class='add'>+    while (1) {</div><div class='add'>+	items[num].type = va_arg(args, enum newtGridElement);</div><div class='add'>+	if (items[num].type == NEWT_GRID_EMPTY) break;</div><div class='add'>+</div><div class='add'>+	items[num].what = va_arg(args, void *);</div><div class='add'>+	num++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    grid = newtCreateGrid(isVert ? 1 : num, isVert ? num : 1);</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; num; i++) {</div><div class='add'>+	newtGridSetField(grid, isVert ? 0 : i, isVert ? i : 0, </div><div class='add'>+			 items[i].type, items[i].what,</div><div class='add'>+			 close ? 0 : (i ? (isVert ? 0 : 1) : 0),</div><div class='add'>+			 close ? 0 : (i ? (isVert ? 1 : 0) : 0), 0, 0, 0, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtGridHCloseStacked(enum newtGridElement type1, void * what1, ...) {</div><div class='add'>+    va_list args;</div><div class='add'>+    newtGrid grid;</div><div class='add'>+</div><div class='add'>+    va_start(args, what1);</div><div class='add'>+</div><div class='add'>+    grid = stackem(0, type1, what1, args, 1);</div><div class='add'>+</div><div class='add'>+    va_start(args, what1);</div><div class='add'>+</div><div class='add'>+    return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtGridVCloseStacked(enum newtGridElement type1, void * what1, ...) {</div><div class='add'>+    va_list args;</div><div class='add'>+    newtGrid grid;</div><div class='add'>+</div><div class='add'>+    va_start(args, what1);</div><div class='add'>+</div><div class='add'>+    grid = stackem(1, type1, what1, args, 1);</div><div class='add'>+</div><div class='add'>+    va_start(args, what1);</div><div class='add'>+</div><div class='add'>+    return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtGridVStacked(enum newtGridElement type1, void * what1, ...) {</div><div class='add'>+    va_list args;</div><div class='add'>+    newtGrid grid;</div><div class='add'>+</div><div class='add'>+    va_start(args, what1);</div><div class='add'>+</div><div class='add'>+    grid = stackem(1, type1, what1, args, 0);</div><div class='add'>+</div><div class='add'>+    va_start(args, what1);</div><div class='add'>+</div><div class='add'>+    return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtGridHStacked(enum newtGridElement type1, void * what1, ...) {</div><div class='add'>+    va_list args;</div><div class='add'>+    newtGrid grid;</div><div class='add'>+</div><div class='add'>+    va_start(args, what1);</div><div class='add'>+</div><div class='add'>+    grid = stackem(0, type1, what1, args, 0);</div><div class='add'>+</div><div class='add'>+    va_start(args, what1);</div><div class='add'>+</div><div class='add'>+    return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtGridBasicWindow(newtComponent text, newtGrid middle,</div><div class='add'>+			     newtGrid buttons) {</div><div class='add'>+    newtGrid grid;</div><div class='add'>+</div><div class='add'>+    grid = newtCreateGrid(1, 3);</div><div class='add'>+    newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text,</div><div class='add'>+		     0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);</div><div class='add'>+    newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, middle,</div><div class='add'>+		     0, 1, 0, 0, 0, 0);</div><div class='add'>+    newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttons,</div><div class='add'>+		     0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX);</div><div class='add'>+</div><div class='add'>+    return grid;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtGrid newtGridSimpleWindow(newtComponent text, newtComponent middle,</div><div class='add'>+			     newtGrid buttons) {</div><div class='add'>+    newtGrid grid;</div><div class='add'>+</div><div class='add'>+    grid = newtCreateGrid(1, 3);</div><div class='add'>+    newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text,</div><div class='add'>+		     0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);</div><div class='add'>+    newtGridSetField(grid, 0, 1, NEWT_GRID_COMPONENT, middle,</div><div class='add'>+		     0, 1, 0, 0, 0, 0);</div><div class='add'>+    newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttons,</div><div class='add'>+		     0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX);</div><div class='add'>+</div><div class='add'>+    return grid;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/label.c b/mdk-stage1/newt/label.c<br/>new file mode 100644<br/>index 000000000..f1a9cebbf<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/label.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/label.c</a></div><div class='hunk'>@@ -0,0 +1,81 @@</div><div class='add'>+#include &lt;slang.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct label {</div><div class='add'>+    char * text;</div><div class='add'>+    int length;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void labelDraw(newtComponent co);</div><div class='add'>+static void labelDestroy(newtComponent co);</div><div class='add'>+</div><div class='add'>+static struct componentOps labelOps = {</div><div class='add'>+    labelDraw,</div><div class='add'>+    newtDefaultEventHandler,</div><div class='add'>+    labelDestroy,</div><div class='add'>+    newtDefaultPlaceHandler,</div><div class='add'>+    newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+newtComponent newtLabel(int left, int top, const char * text) {</div><div class='add'>+    newtComponent co;</div><div class='add'>+    struct label * la;</div><div class='add'>+</div><div class='add'>+    co = malloc(sizeof(*co));</div><div class='add'>+    la = malloc(sizeof(struct label));</div><div class='add'>+    co-&gt;data = la;</div><div class='add'>+</div><div class='add'>+    co-&gt;ops = &amp;labelOps;</div><div class='add'>+</div><div class='add'>+    co-&gt;height = 1;</div><div class='add'>+    co-&gt;width = strlen(text);</div><div class='add'>+    co-&gt;top = top;</div><div class='add'>+    co-&gt;left = left;</div><div class='add'>+    co-&gt;takesFocus = 0;</div><div class='add'>+</div><div class='add'>+    la-&gt;length = strlen(text);</div><div class='add'>+    la-&gt;text = strdup(text);</div><div class='add'>+</div><div class='add'>+    return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtLabelSetText(newtComponent co, const char * text) {</div><div class='add'>+    int newLength;</div><div class='add'>+    struct label * la = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    newLength = strlen(text);</div><div class='add'>+    if (newLength &lt;= la-&gt;length) {</div><div class='add'>+	memset(la-&gt;text, ' ', la-&gt;length);</div><div class='add'>+	memcpy(la-&gt;text, text, newLength);</div><div class='add'>+    } else {</div><div class='add'>+	free(la-&gt;text);</div><div class='add'>+	la-&gt;text = strdup(text);</div><div class='add'>+	la-&gt;length = newLength;</div><div class='add'>+	co-&gt;width = newLength;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    labelDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void labelDraw(newtComponent co) {</div><div class='add'>+    struct label * la = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (co-&gt;isMapped == -1) return;</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(COLORSET_LABEL);</div><div class='add'>+</div><div class='add'>+    newtGotorc(co-&gt;top, co-&gt;left);</div><div class='add'>+    SLsmg_write_string(la-&gt;text);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void labelDestroy(newtComponent co) {</div><div class='add'>+    struct label * la = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    free(la-&gt;text);</div><div class='add'>+    free(la);</div><div class='add'>+    free(co);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/listbox.c b/mdk-stage1/newt/listbox.c<br/>new file mode 100644<br/>index 000000000..ef276aeb4<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/listbox.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/listbox.c</a></div><div class='hunk'>@@ -0,0 +1,752 @@</div><div class='add'>+/* This goofed-up box whacked into shape by Elliot Lee &lt;sopwith@cuc.edu&gt;</div><div class='add'>+   (from the original listbox by Erik Troan &lt;ewt@redhat.com&gt;)</div><div class='add'>+   and contributed to newt for use under the LGPL license.</div><div class='add'>+   Copyright (C) 1996, 1997 Elliot Lee */</div><div class='add'>+</div><div class='add'>+#include &lt;slang.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* Linked list of items in the listbox */</div><div class='add'>+struct items {</div><div class='add'>+    char * text;</div><div class='add'>+    const void *data;</div><div class='add'>+    unsigned char isSelected;</div><div class='add'>+    struct items *next;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Holds all the relevant information for this listbox */</div><div class='add'>+struct listbox {</div><div class='add'>+    newtComponent sb;   /* Scrollbar on right side of listbox */</div><div class='add'>+    int curWidth;	/* size of text w/o scrollbar or border*/</div><div class='add'>+    int curHeight;	/* size of text w/o border */</div><div class='add'>+    int sbAdjust;</div><div class='add'>+    int bdxAdjust, bdyAdjust;</div><div class='add'>+    int numItems, numSelected;</div><div class='add'>+    int userHasSetWidth;</div><div class='add'>+    int currItem, startShowItem; /* startShowItem is the first item displayed</div><div class='add'>+				   on the screen */</div><div class='add'>+    int isActive; /* If we handle key events all the time, it seems</div><div class='add'>+		     to do things even when they are supposed to be for</div><div class='add'>+		     another button/whatever */</div><div class='add'>+    struct items *boxItems;</div><div class='add'>+    int grow;</div><div class='add'>+    int flags; /* flags for this listbox, right now just</div><div class='add'>+		  NEWT_FLAG_RETURNEXIT */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void listboxDraw(newtComponent co);</div><div class='add'>+static void listboxDestroy(newtComponent co);</div><div class='add'>+static struct eventResult listboxEvent(newtComponent co, struct event ev);</div><div class='add'>+static void newtListboxRealSetCurrent(newtComponent co);</div><div class='add'>+static void listboxPlace(newtComponent co, int newLeft, int newTop);</div><div class='add'>+static inline void updateWidth(newtComponent co, struct listbox * li,</div><div class='add'>+				int maxField);</div><div class='add'>+static void listboxMapped(newtComponent co, int isMapped);</div><div class='add'>+</div><div class='add'>+static struct componentOps listboxOps = {</div><div class='add'>+    listboxDraw,</div><div class='add'>+    listboxEvent,</div><div class='add'>+    listboxDestroy,</div><div class='add'>+    listboxPlace,</div><div class='add'>+    listboxMapped,</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void listboxMapped(newtComponent co, int isMapped) {</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    co-&gt;isMapped = isMapped;</div><div class='add'>+    if (li-&gt;sb)</div><div class='add'>+	li-&gt;sb-&gt;ops-&gt;mapped(li-&gt;sb, isMapped);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void listboxPlace(newtComponent co, int newLeft, int newTop) {</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    co-&gt;top = newTop;</div><div class='add'>+    co-&gt;left = newLeft;</div><div class='add'>+</div><div class='add'>+    if (li-&gt;sb)</div><div class='add'>+	li-&gt;sb-&gt;ops-&gt;place(li-&gt;sb, co-&gt;left + co-&gt;width - li-&gt;bdxAdjust - 1,</div><div class='add'>+			   co-&gt;top);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtListbox(int left, int top, int height, int flags) {</div><div class='add'>+    newtComponent co, sb;</div><div class='add'>+    struct listbox * li;</div><div class='add'>+</div><div class='add'>+    if (!(co = malloc(sizeof(*co))))</div><div class='add'>+	return NULL;</div><div class='add'>+</div><div class='add'>+    if (!(li = malloc(sizeof(struct listbox)))) {</div><div class='add'>+	free(co);</div><div class='add'>+	return NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    li-&gt;boxItems = NULL;</div><div class='add'>+    li-&gt;numItems = 0;</div><div class='add'>+    li-&gt;currItem = 0;</div><div class='add'>+    li-&gt;numSelected = 0;</div><div class='add'>+    li-&gt;isActive = 0;</div><div class='add'>+    li-&gt;userHasSetWidth = 0;</div><div class='add'>+    li-&gt;startShowItem = 0;</div><div class='add'>+    li-&gt;sbAdjust = 0;</div><div class='add'>+    li-&gt;bdxAdjust = 0;</div><div class='add'>+    li-&gt;bdyAdjust = 0;</div><div class='add'>+    li-&gt;flags = flags &amp; (NEWT_FLAG_RETURNEXIT | NEWT_FLAG_BORDER |</div><div class='add'>+			 NEWT_FLAG_MULTIPLE);</div><div class='add'>+</div><div class='add'>+    if (li-&gt;flags &amp; NEWT_FLAG_BORDER) {</div><div class='add'>+	li-&gt;bdxAdjust = 2;</div><div class='add'>+	li-&gt;bdyAdjust = 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    co-&gt;height = height;</div><div class='add'>+    li-&gt;curHeight = co-&gt;height - (2 * li-&gt;bdyAdjust);</div><div class='add'>+</div><div class='add'>+    if (height) {</div><div class='add'>+	li-&gt;grow = 0;</div><div class='add'>+	if (flags &amp; NEWT_FLAG_SCROLL) {</div><div class='add'>+	    sb = newtVerticalScrollbar(left, top + li-&gt;bdyAdjust,</div><div class='add'>+					li-&gt;curHeight,</div><div class='add'>+					COLORSET_LISTBOX, COLORSET_ACTLISTBOX);</div><div class='add'>+	    li-&gt;sbAdjust = 3;</div><div class='add'>+	} else {</div><div class='add'>+	    sb = NULL;</div><div class='add'>+	}</div><div class='add'>+    } else {</div><div class='add'>+	li-&gt;grow = 1;</div><div class='add'>+	sb = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    li-&gt;sb = sb;</div><div class='add'>+    co-&gt;data = li;</div><div class='add'>+    co-&gt;isMapped = 0;</div><div class='add'>+    co-&gt;left = left;</div><div class='add'>+    co-&gt;top = top;</div><div class='add'>+    co-&gt;ops = &amp;listboxOps;</div><div class='add'>+    co-&gt;takesFocus = 1;</div><div class='add'>+    co-&gt;callback = NULL;</div><div class='add'>+</div><div class='add'>+    updateWidth(co, li, 5);</div><div class='add'>+</div><div class='add'>+    return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static inline void updateWidth(newtComponent co, struct listbox * li,</div><div class='add'>+				int maxField) {</div><div class='add'>+    li-&gt;curWidth = maxField;</div><div class='add'>+    co-&gt;width = li-&gt;curWidth + li-&gt;sbAdjust + 2 * li-&gt;bdxAdjust;</div><div class='add'>+</div><div class='add'>+    if (li-&gt;sb)</div><div class='add'>+	li-&gt;sb-&gt;left = co-&gt;left + co-&gt;width - li-&gt;bdxAdjust - 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxSetCurrentByKey(newtComponent co, void * key) {</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+    struct items * item;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    item = li-&gt;boxItems, i = 0;</div><div class='add'>+    while (item &amp;&amp; item-&gt;data != key)</div><div class='add'>+	item = item-&gt;next, i++;</div><div class='add'>+</div><div class='add'>+    if (item)</div><div class='add'>+	newtListboxSetCurrent(co, i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxSetCurrent(newtComponent co, int num)</div><div class='add'>+{</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (num &gt;= li-&gt;numItems)</div><div class='add'>+	li-&gt;currItem = li-&gt;numItems - 1;</div><div class='add'>+    else if (num &lt; 0)</div><div class='add'>+	li-&gt;currItem = 0;</div><div class='add'>+    else</div><div class='add'>+	li-&gt;currItem = num;</div><div class='add'>+</div><div class='add'>+    if (li-&gt;currItem &lt; li-&gt;startShowItem)</div><div class='add'>+	li-&gt;startShowItem = li-&gt;currItem;</div><div class='add'>+    else if (li-&gt;currItem - li-&gt;startShowItem &gt; li-&gt;curHeight - 1)</div><div class='add'>+	li-&gt;startShowItem = li-&gt;currItem - li-&gt;curHeight + 1;</div><div class='add'>+    if (li-&gt;startShowItem + li-&gt;curHeight &gt; li-&gt;numItems)</div><div class='add'>+	li-&gt;startShowItem = li-&gt;numItems - li-&gt;curHeight;</div><div class='add'>+    if(li-&gt;startShowItem &lt; 0)</div><div class='add'>+	li-&gt;startShowItem = 0;</div><div class='add'>+</div><div class='add'>+    newtListboxRealSetCurrent(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void newtListboxRealSetCurrent(newtComponent co)</div><div class='add'>+{</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    if(li-&gt;sb)</div><div class='add'>+	newtScrollbarSet(li-&gt;sb, li-&gt;currItem + 1, li-&gt;numItems);</div><div class='add'>+    listboxDraw(co);</div><div class='add'>+    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxSetWidth(newtComponent co, int width) {</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    co-&gt;width = width;</div><div class='add'>+    li-&gt;curWidth = co-&gt;width - li-&gt;sbAdjust - 2 * li-&gt;bdxAdjust;</div><div class='add'>+    li-&gt;userHasSetWidth = 1;</div><div class='add'>+    if (li-&gt;sb) li-&gt;sb-&gt;left = co-&gt;width + co-&gt;left - 1;</div><div class='add'>+    listboxDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void * newtListboxGetCurrent(newtComponent co) {</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+    int i;</div><div class='add'>+    struct items *item;</div><div class='add'>+</div><div class='add'>+    for(i = 0, item = li-&gt;boxItems; item != NULL &amp;&amp; i &lt; li-&gt;currItem;</div><div class='add'>+	i++, item = item-&gt;next);</div><div class='add'>+</div><div class='add'>+    if (item)</div><div class='add'>+	return (void *)item-&gt;data;</div><div class='add'>+    else</div><div class='add'>+	return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxSelectItem(newtComponent co, const void * key,</div><div class='add'>+	enum newtFlagsSense sense)</div><div class='add'>+{</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+    int i;</div><div class='add'>+    struct items * item;</div><div class='add'>+</div><div class='add'>+    item = li-&gt;boxItems, i = 0;</div><div class='add'>+    while (item &amp;&amp; item-&gt;data != key)</div><div class='add'>+	item = item-&gt;next, i++;</div><div class='add'>+</div><div class='add'>+    if (!item) return;</div><div class='add'>+</div><div class='add'>+    if (item-&gt;isSelected)</div><div class='add'>+	li-&gt;numSelected--;</div><div class='add'>+</div><div class='add'>+    switch(sense) {</div><div class='add'>+	case NEWT_FLAGS_RESET:</div><div class='add'>+		item-&gt;isSelected = 0; break;</div><div class='add'>+	case NEWT_FLAGS_SET:</div><div class='add'>+		item-&gt;isSelected = 1; break;</div><div class='add'>+	case NEWT_FLAGS_TOGGLE:</div><div class='add'>+		item-&gt;isSelected = !item-&gt;isSelected;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (item-&gt;isSelected)</div><div class='add'>+	li-&gt;numSelected++;</div><div class='add'>+</div><div class='add'>+    listboxDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxClearSelection(newtComponent co)</div><div class='add'>+{</div><div class='add'>+    struct items *item;</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    for(item = li-&gt;boxItems; item != NULL;</div><div class='add'>+	item = item-&gt;next)</div><div class='add'>+	item-&gt;isSelected = 0;</div><div class='add'>+    li-&gt;numSelected = 0;</div><div class='add'>+    listboxDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Free the returned array after use, but NOT the values in the array */</div><div class='add'>+void ** newtListboxGetSelection(newtComponent co, int *numitems)</div><div class='add'>+{</div><div class='add'>+    struct listbox * li;</div><div class='add'>+    int i;</div><div class='add'>+    void **retval;</div><div class='add'>+    struct items *item;</div><div class='add'>+</div><div class='add'>+    if(!co || !numitems) return NULL;</div><div class='add'>+</div><div class='add'>+    li = co-&gt;data;</div><div class='add'>+    if(!li || !li-&gt;numSelected) return NULL;</div><div class='add'>+</div><div class='add'>+    retval = malloc(li-&gt;numSelected * sizeof(void *));</div><div class='add'>+    for(i = 0, item = li-&gt;boxItems; item != NULL;</div><div class='add'>+	item = item-&gt;next)</div><div class='add'>+	if(item-&gt;isSelected)</div><div class='add'>+	    retval[i++] = (void *)item-&gt;data;</div><div class='add'>+    *numitems = li-&gt;numSelected;</div><div class='add'>+    return retval;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxSetEntry(newtComponent co, int num, const char * text) {</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+    int i;</div><div class='add'>+    struct items *item;</div><div class='add'>+</div><div class='add'>+    for(i = 0, item = li-&gt;boxItems; item != NULL &amp;&amp; i &lt; num;</div><div class='add'>+	i++, item = item-&gt;next);</div><div class='add'>+</div><div class='add'>+    if(!item)</div><div class='add'>+	return;</div><div class='add'>+    else {</div><div class='add'>+	free(item-&gt;text);</div><div class='add'>+	item-&gt;text = strdup(text);</div><div class='add'>+    }</div><div class='add'>+    if (li-&gt;userHasSetWidth == 0 &amp;&amp; strlen(text) &gt; li-&gt;curWidth) {</div><div class='add'>+	updateWidth(co, li, strlen(text));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (num &gt;= li-&gt;startShowItem &amp;&amp; num &lt;= li-&gt;startShowItem + co-&gt;height)</div><div class='add'>+	listboxDraw(co);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxSetData(newtComponent co, int num, void * data) {</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+    int i;</div><div class='add'>+    struct items *item;</div><div class='add'>+</div><div class='add'>+    for(i = 0, item = li-&gt;boxItems; item != NULL &amp;&amp; i &lt; num;</div><div class='add'>+	i++, item = item-&gt;next);</div><div class='add'>+</div><div class='add'>+    item-&gt;data = data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtListboxAppendEntry(newtComponent co, const char * text,</div><div class='add'>+	                const void * data) {</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+    struct items *item;</div><div class='add'>+</div><div class='add'>+    if(li-&gt;boxItems) {</div><div class='add'>+	for (item = li-&gt;boxItems; item-&gt;next != NULL; item = item-&gt;next);</div><div class='add'>+</div><div class='add'>+	item = item-&gt;next = malloc(sizeof(struct items));</div><div class='add'>+    } else {</div><div class='add'>+	item = li-&gt;boxItems = malloc(sizeof(struct items));</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!li-&gt;userHasSetWidth &amp;&amp; text &amp;&amp; (strlen(text) &gt; li-&gt;curWidth))</div><div class='add'>+	updateWidth(co, li, strlen(text));</div><div class='add'>+</div><div class='add'>+    item-&gt;text = strdup(text); item-&gt;data = data; item-&gt;next = NULL;</div><div class='add'>+    item-&gt;isSelected = 0;</div><div class='add'>+</div><div class='add'>+    if (li-&gt;grow)</div><div class='add'>+	co-&gt;height++, li-&gt;curHeight++;</div><div class='add'>+    li-&gt;numItems++;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtListboxInsertEntry(newtComponent co, const char * text,</div><div class='add'>+	                   const void * data, void * key) {</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+    struct items *item, *t;</div><div class='add'>+</div><div class='add'>+    if (li-&gt;boxItems) {</div><div class='add'>+	if (key) {</div><div class='add'>+	    item = li-&gt;boxItems;</div><div class='add'>+	    while (item &amp;&amp; item-&gt;data != key) item = item-&gt;next;</div><div class='add'>+</div><div class='add'>+	    if (!item) return 1;</div><div class='add'>+</div><div class='add'>+	    t = item-&gt;next;</div><div class='add'>+	    item = item-&gt;next = malloc(sizeof(struct items));</div><div class='add'>+	    item-&gt;next = t;</div><div class='add'>+	} else {</div><div class='add'>+	    t = li-&gt;boxItems;</div><div class='add'>+	    item = li-&gt;boxItems = malloc(sizeof(struct items));</div><div class='add'>+	    item-&gt;next = t;</div><div class='add'>+	}</div><div class='add'>+    } else if (key) {</div><div class='add'>+	return 1;</div><div class='add'>+    } else {</div><div class='add'>+	item = li-&gt;boxItems = malloc(sizeof(struct items));</div><div class='add'>+	item-&gt;next = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!li-&gt;userHasSetWidth &amp;&amp; text &amp;&amp; (strlen(text) &gt; li-&gt;curWidth))</div><div class='add'>+	updateWidth(co, li, strlen(text));</div><div class='add'>+</div><div class='add'>+    item-&gt;text = strdup(text?text:"(null)"); item-&gt;data = data;</div><div class='add'>+    item-&gt;isSelected = 0;</div><div class='add'>+</div><div class='add'>+    if (li-&gt;sb)</div><div class='add'>+	li-&gt;sb-&gt;left = co-&gt;left + co-&gt;width - li-&gt;bdxAdjust - 1;</div><div class='add'>+    li-&gt;numItems++;</div><div class='add'>+</div><div class='add'>+    listboxDraw(co);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtListboxDeleteEntry(newtComponent co, void * key) {</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+    int widest = 0, t;</div><div class='add'>+    struct items *item, *item2 = NULL;</div><div class='add'>+    int num;</div><div class='add'>+</div><div class='add'>+    if (li-&gt;boxItems == NULL || li-&gt;numItems &lt;= 0)</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+    num = 0;</div><div class='add'>+</div><div class='add'>+    item2 = NULL, item = li-&gt;boxItems;</div><div class='add'>+    while (item &amp;&amp; item-&gt;data != key) {</div><div class='add'>+	item2 = item;</div><div class='add'>+	item = item-&gt;next;</div><div class='add'>+	num++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (!item)</div><div class='add'>+	return -1;</div><div class='add'>+</div><div class='add'>+    if (item2)</div><div class='add'>+	item2-&gt;next = item-&gt;next;</div><div class='add'>+    else</div><div class='add'>+	li-&gt;boxItems = item-&gt;next;</div><div class='add'>+</div><div class='add'>+    free(item-&gt;text);</div><div class='add'>+    free(item);</div><div class='add'>+    li-&gt;numItems--;</div><div class='add'>+</div><div class='add'>+    if (!li-&gt;userHasSetWidth) {</div><div class='add'>+	widest = 0;</div><div class='add'>+	for (item = li-&gt;boxItems; item != NULL; item = item-&gt;next)</div><div class='add'>+	    if ((t = strlen(item-&gt;text)) &gt; widest) widest = t;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (li-&gt;currItem &gt;= num)</div><div class='add'>+	li-&gt;currItem--;</div><div class='add'>+</div><div class='add'>+    if (!li-&gt;userHasSetWidth) {</div><div class='add'>+	updateWidth(co, li, widest);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    listboxDraw(co);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtListboxClear(newtComponent co)</div><div class='add'>+{</div><div class='add'>+    struct listbox * li;</div><div class='add'>+    struct items *anitem, *nextitem;</div><div class='add'>+    if(co == NULL || (li = co-&gt;data) == NULL)</div><div class='add'>+	return;</div><div class='add'>+    for(anitem = li-&gt;boxItems; anitem != NULL; anitem = nextitem) {</div><div class='add'>+	nextitem = anitem-&gt;next;</div><div class='add'>+	free(anitem-&gt;text);</div><div class='add'>+	free(anitem);</div><div class='add'>+    }</div><div class='add'>+    li-&gt;numItems = li-&gt;numSelected = li-&gt;currItem = li-&gt;startShowItem = 0;</div><div class='add'>+    li-&gt;boxItems = NULL;</div><div class='add'>+    if (!li-&gt;userHasSetWidth)</div><div class='add'>+	updateWidth(co, li, 5);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* If you don't want to get back the text, pass in NULL for the ptr-ptr. Same</div><div class='add'>+   goes for the data. */</div><div class='add'>+void newtListboxGetEntry(newtComponent co, int num, char **text, void **data) {</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+    int i;</div><div class='add'>+    struct items *item;</div><div class='add'>+</div><div class='add'>+    if (!li-&gt;boxItems || num &gt;= li-&gt;numItems) {</div><div class='add'>+	if(text)</div><div class='add'>+	    *text = NULL;</div><div class='add'>+	if(data)</div><div class='add'>+	    *data = NULL;</div><div class='add'>+	return;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    i = 0;</div><div class='add'>+    item = li-&gt;boxItems;</div><div class='add'>+    while (item &amp;&amp; i &lt; num) {</div><div class='add'>+	i++, item = item-&gt;next;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (item) {</div><div class='add'>+	if (text)</div><div class='add'>+	    *text = item-&gt;text;</div><div class='add'>+	if (data)</div><div class='add'>+	    *data = (void *)item-&gt;data;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void listboxDraw(newtComponent co)</div><div class='add'>+{</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+    struct items *item;</div><div class='add'>+    int i, j;</div><div class='add'>+</div><div class='add'>+    if (!co-&gt;isMapped) return ;</div><div class='add'>+</div><div class='add'>+    if(li-&gt;flags &amp; NEWT_FLAG_BORDER) {</div><div class='add'>+      if(li-&gt;isActive)</div><div class='add'>+	  SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX);</div><div class='add'>+      else</div><div class='add'>+          SLsmg_set_color(NEWT_COLORSET_LISTBOX);</div><div class='add'>+</div><div class='add'>+      newtDrawBox(co-&gt;left, co-&gt;top, co-&gt;width, co-&gt;height, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if(li-&gt;sb)</div><div class='add'>+	li-&gt;sb-&gt;ops-&gt;draw(li-&gt;sb);</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(NEWT_COLORSET_LISTBOX);</div><div class='add'>+</div><div class='add'>+    for(i = 0, item = li-&gt;boxItems; item != NULL &amp;&amp; i &lt; li-&gt;startShowItem;</div><div class='add'>+	i++, item = item-&gt;next);</div><div class='add'>+</div><div class='add'>+    j = i;</div><div class='add'>+</div><div class='add'>+    for (i = 0; item != NULL &amp;&amp; i &lt; li-&gt;curHeight; i++, item = item-&gt;next) {</div><div class='add'>+	if (!item-&gt;text) continue;</div><div class='add'>+</div><div class='add'>+	newtGotorc(co-&gt;top + i + li-&gt;bdyAdjust, co-&gt;left + li-&gt;bdxAdjust);</div><div class='add'>+	if(j + i == li-&gt;currItem) {</div><div class='add'>+	    if(item-&gt;isSelected)</div><div class='add'>+		SLsmg_set_color(NEWT_COLORSET_ACTSELLISTBOX);</div><div class='add'>+	    else</div><div class='add'>+		SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX);</div><div class='add'>+	} else if(item-&gt;isSelected)</div><div class='add'>+	    SLsmg_set_color(NEWT_COLORSET_SELLISTBOX);</div><div class='add'>+	else</div><div class='add'>+	    SLsmg_set_color(NEWT_COLORSET_LISTBOX);</div><div class='add'>+</div><div class='add'>+	SLsmg_write_nstring(item-&gt;text, li-&gt;curWidth);</div><div class='add'>+</div><div class='add'>+    }</div><div class='add'>+    newtGotorc(co-&gt;top + (li-&gt;currItem - li-&gt;startShowItem), co-&gt;left);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult listboxEvent(newtComponent co, struct event ev) {</div><div class='add'>+    struct eventResult er;</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+    struct items *item;</div><div class='add'>+    int i;</div><div class='add'>+    </div><div class='add'>+    er.result = ER_IGNORED;</div><div class='add'>+</div><div class='add'>+    if(ev.when == EV_EARLY || ev.when == EV_LATE) {</div><div class='add'>+	return er;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    switch(ev.event) {</div><div class='add'>+      case EV_KEYPRESS:</div><div class='add'>+	if (!li-&gt;isActive) break;</div><div class='add'>+</div><div class='add'>+	switch(ev.u.key) {</div><div class='add'>+	  case ' ':</div><div class='add'>+	    if(!(li-&gt;flags &amp; NEWT_FLAG_MULTIPLE)) break;</div><div class='add'>+	    newtListboxSelectItem(co, li-&gt;boxItems[li-&gt;currItem].data,</div><div class='add'>+				  NEWT_FLAGS_TOGGLE);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    /* We don't break here, because it is cool to be able to</div><div class='add'>+	       hold space to select a bunch of items in a list at once */</div><div class='add'>+</div><div class='add'>+	  case NEWT_KEY_DOWN:</div><div class='add'>+	    if(li-&gt;numItems &lt;= 0) break;</div><div class='add'>+	    if(li-&gt;currItem &lt; li-&gt;numItems - 1) {</div><div class='add'>+		li-&gt;currItem++;</div><div class='add'>+		if(li-&gt;currItem &gt; (li-&gt;startShowItem + li-&gt;curHeight - 1)) {</div><div class='add'>+		    li-&gt;startShowItem = li-&gt;currItem - li-&gt;curHeight + 1;</div><div class='add'>+		    if(li-&gt;startShowItem + li-&gt;curHeight &gt; li-&gt;numItems)</div><div class='add'>+			li-&gt;startShowItem = li-&gt;numItems - li-&gt;curHeight;</div><div class='add'>+		}</div><div class='add'>+		if(li-&gt;sb)</div><div class='add'>+		    newtScrollbarSet(li-&gt;sb, li-&gt;currItem + 1, li-&gt;numItems);</div><div class='add'>+		listboxDraw(co);</div><div class='add'>+	    }</div><div class='add'>+	    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case NEWT_KEY_ENTER:</div><div class='add'>+	    if(li-&gt;numItems &lt;= 0) break;</div><div class='add'>+	    if(li-&gt;flags &amp; NEWT_FLAG_RETURNEXIT)</div><div class='add'>+		er.result = ER_EXITFORM;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case NEWT_KEY_UP:</div><div class='add'>+	    if(li-&gt;numItems &lt;= 0) break;</div><div class='add'>+	    if(li-&gt;currItem &gt; 0) {</div><div class='add'>+		li-&gt;currItem--;</div><div class='add'>+		if(li-&gt;currItem &lt; li-&gt;startShowItem)</div><div class='add'>+		    li-&gt;startShowItem = li-&gt;currItem;</div><div class='add'>+		if(li-&gt;sb)</div><div class='add'>+		    newtScrollbarSet(li-&gt;sb, li-&gt;currItem + 1, li-&gt;numItems);</div><div class='add'>+		listboxDraw(co);</div><div class='add'>+	    }</div><div class='add'>+	    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case NEWT_KEY_PGUP:</div><div class='add'>+	    if(li-&gt;numItems &lt;= 0) break;</div><div class='add'>+	    li-&gt;startShowItem -= li-&gt;curHeight - 1;</div><div class='add'>+	    if(li-&gt;startShowItem &lt; 0)</div><div class='add'>+		li-&gt;startShowItem = 0;</div><div class='add'>+	    li-&gt;currItem -= li-&gt;curHeight - 1;</div><div class='add'>+	    if(li-&gt;currItem &lt; 0)</div><div class='add'>+		li-&gt;currItem = 0;</div><div class='add'>+	    newtListboxRealSetCurrent(co);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case NEWT_KEY_PGDN:</div><div class='add'>+	    if(li-&gt;numItems &lt;= 0) break;</div><div class='add'>+	    li-&gt;startShowItem += li-&gt;curHeight;</div><div class='add'>+	    if(li-&gt;startShowItem &gt; (li-&gt;numItems - li-&gt;curHeight)) {</div><div class='add'>+		li-&gt;startShowItem = li-&gt;numItems - li-&gt;curHeight;</div><div class='add'>+	    }</div><div class='add'>+	    li-&gt;currItem += li-&gt;curHeight;</div><div class='add'>+	    if(li-&gt;currItem &gt;= li-&gt;numItems) {</div><div class='add'>+		li-&gt;currItem = li-&gt;numItems - 1;</div><div class='add'>+	    }</div><div class='add'>+	    newtListboxRealSetCurrent(co);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case NEWT_KEY_HOME:</div><div class='add'>+	    if(li-&gt;numItems &lt;= 0) break;</div><div class='add'>+	    newtListboxSetCurrent(co, 0);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case NEWT_KEY_END:</div><div class='add'>+	    if(li-&gt;numItems &lt;= 0) break;</div><div class='add'>+	    li-&gt;startShowItem = li-&gt;numItems - li-&gt;curHeight;</div><div class='add'>+	    if(li-&gt;startShowItem &lt; 0)</div><div class='add'>+		li-&gt;startShowItem = 0;</div><div class='add'>+	    li-&gt;currItem = li-&gt;numItems - 1;</div><div class='add'>+	    newtListboxRealSetCurrent(co);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+	  default:</div><div class='add'>+	      if (li-&gt;numItems &lt;= 0) break;</div><div class='add'>+              if (ev.u.key &lt; NEWT_KEY_EXTRA_BASE &amp;&amp; isalpha(ev.u.key)) {</div><div class='add'>+		  for(i = 0, item = li-&gt;boxItems; item != NULL &amp;&amp;</div><div class='add'>+			  i &lt; li-&gt;currItem; i++, item = item-&gt;next);</div><div class='add'>+</div><div class='add'>+		  if (item &amp;&amp; item-&gt;text &amp;&amp; (toupper(*item-&gt;text) == toupper(ev.u.key))) {</div><div class='add'>+		      item = item-&gt;next;</div><div class='add'>+		      i++;</div><div class='add'>+		  } else { </div><div class='add'>+		      item = li-&gt;boxItems;</div><div class='add'>+		      i = 0;</div><div class='add'>+		  }</div><div class='add'>+		  while (item &amp;&amp; item-&gt;text &amp;&amp;</div><div class='add'>+			 toupper(*item-&gt;text) != toupper(ev.u.key)) {</div><div class='add'>+		      item = item-&gt;next;</div><div class='add'>+		      i++;</div><div class='add'>+		  }</div><div class='add'>+		  if (item) {</div><div class='add'>+		      li-&gt;currItem = i;</div><div class='add'>+		      if(li-&gt;currItem &lt; li-&gt;startShowItem ||</div><div class='add'>+			 li-&gt;currItem &gt; li-&gt;startShowItem)</div><div class='add'>+			  li-&gt;startShowItem =</div><div class='add'>+			      li-&gt;currItem &gt; li-&gt;numItems - li-&gt;curHeight ?</div><div class='add'>+			      li-&gt;startShowItem = li-&gt;numItems - li-&gt;curHeight :</div><div class='add'>+			      li-&gt;currItem;</div><div class='add'>+		      if(li-&gt;sb)</div><div class='add'>+			  newtScrollbarSet(li-&gt;sb, li-&gt;currItem + 1, li-&gt;numItems);</div><div class='add'>+		      newtListboxRealSetCurrent(co);</div><div class='add'>+		      er.result = ER_SWALLOWED;</div><div class='add'>+		  }</div><div class='add'>+	      }</div><div class='add'>+	}</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case EV_FOCUS:</div><div class='add'>+	li-&gt;isActive = 1;</div><div class='add'>+	listboxDraw(co);</div><div class='add'>+	er.result = ER_SWALLOWED;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case EV_UNFOCUS:</div><div class='add'>+	li-&gt;isActive = 0;</div><div class='add'>+	listboxDraw(co);</div><div class='add'>+	er.result = ER_SWALLOWED;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case EV_MOUSE:</div><div class='add'>+	  /* if this mouse click was within the listbox, make the current</div><div class='add'>+	     item the item clicked on. */</div><div class='add'>+	/* Up scroll arrow */</div><div class='add'>+	if (li-&gt;sb &amp;&amp;</div><div class='add'>+	    ev.u.mouse.x == co-&gt;left + co-&gt;width - li-&gt;bdxAdjust - 1 &amp;&amp;</div><div class='add'>+	    ev.u.mouse.y == co-&gt;top + li-&gt;bdyAdjust) {</div><div class='add'>+	    if(li-&gt;numItems &lt;= 0) break;</div><div class='add'>+	    if(li-&gt;currItem &gt; 0) {</div><div class='add'>+		li-&gt;currItem--;</div><div class='add'>+		if(li-&gt;currItem &lt; li-&gt;startShowItem)</div><div class='add'>+		    li-&gt;startShowItem = li-&gt;currItem;</div><div class='add'>+		if(li-&gt;sb)</div><div class='add'>+		    newtScrollbarSet(li-&gt;sb, li-&gt;currItem + 1, li-&gt;numItems);</div><div class='add'>+		listboxDraw(co);</div><div class='add'>+	    }</div><div class='add'>+	    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+	}</div><div class='add'>+	/* Down scroll arrow */</div><div class='add'>+	if (li-&gt;sb &amp;&amp;</div><div class='add'>+	    ev.u.mouse.x == co-&gt;left + co-&gt;width - li-&gt;bdxAdjust - 1 &amp;&amp;</div><div class='add'>+	    ev.u.mouse.y == co-&gt;top + co-&gt;height - li-&gt;bdyAdjust - 1) {</div><div class='add'>+	    if(li-&gt;numItems &lt;= 0) break;</div><div class='add'>+	    if(li-&gt;currItem &lt; li-&gt;numItems - 1) {</div><div class='add'>+		li-&gt;currItem++;</div><div class='add'>+		if(li-&gt;currItem &gt; (li-&gt;startShowItem + li-&gt;curHeight - 1)) {</div><div class='add'>+		    li-&gt;startShowItem = li-&gt;currItem - li-&gt;curHeight + 1;</div><div class='add'>+		    if(li-&gt;startShowItem + li-&gt;curHeight &gt; li-&gt;numItems)</div><div class='add'>+			li-&gt;startShowItem = li-&gt;numItems - li-&gt;curHeight;</div><div class='add'>+		}</div><div class='add'>+		if(li-&gt;sb)</div><div class='add'>+		    newtScrollbarSet(li-&gt;sb, li-&gt;currItem + 1, li-&gt;numItems);</div><div class='add'>+		listboxDraw(co);</div><div class='add'>+	    }</div><div class='add'>+	    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+	}</div><div class='add'>+	if ((ev.u.mouse.y &gt;= co-&gt;top + li-&gt;bdyAdjust) &amp;&amp;</div><div class='add'>+	    (ev.u.mouse.y &lt;= co-&gt;top + co-&gt;height - (li-&gt;bdyAdjust * 2)) &amp;&amp;</div><div class='add'>+	    (ev.u.mouse.x &gt;= co-&gt;left + li-&gt;bdxAdjust) &amp;&amp;</div><div class='add'>+	    (ev.u.mouse.x &lt;= co-&gt;left + co-&gt;width + (li-&gt;bdxAdjust * 2))) {</div><div class='add'>+	    li-&gt;currItem = li-&gt;startShowItem +</div><div class='add'>+		(ev.u.mouse.y - li-&gt;bdyAdjust - co-&gt;top);</div><div class='add'>+	    newtListboxRealSetCurrent(co);</div><div class='add'>+	    listboxDraw(co);</div><div class='add'>+	    if(co-&gt;callback) co-&gt;callback(co, co-&gt;callbackData);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void listboxDestroy(newtComponent co) {</div><div class='add'>+    struct listbox * li = co-&gt;data;</div><div class='add'>+    struct items * item, * nextitem;</div><div class='add'>+</div><div class='add'>+    nextitem = item = li-&gt;boxItems;</div><div class='add'>+</div><div class='add'>+    while (item != NULL) {</div><div class='add'>+	nextitem = item-&gt;next;</div><div class='add'>+	free(item-&gt;text);</div><div class='add'>+	free(item);</div><div class='add'>+	item = nextitem;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (li-&gt;sb) li-&gt;sb-&gt;ops-&gt;destroy(li-&gt;sb);</div><div class='add'>+</div><div class='add'>+    free(li);</div><div class='add'>+    free(co);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/newt.c b/mdk-stage1/newt/newt.c<br/>new file mode 100644<br/>index 000000000..1cfe3ac93<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/newt.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt.c</a></div><div class='hunk'>@@ -0,0 +1,672 @@</div><div class='add'>+#include &lt;slang.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;sys/signal.h&gt;</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;termios.h&gt;</div><div class='add'>+#include &lt;unistd.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct Window {</div><div class='add'>+    int height, width, top, left;</div><div class='add'>+    short * buffer;</div><div class='add'>+    char * title;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+struct keymap {</div><div class='add'>+    char * str;</div><div class='add'>+    int code;</div><div class='add'>+    char * tc;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static struct Window windowStack[20];</div><div class='add'>+static struct Window * currentWindow = NULL;</div><div class='add'>+</div><div class='add'>+static char * helplineStack[20];</div><div class='add'>+static char ** currentHelpline = NULL;</div><div class='add'>+</div><div class='add'>+static int cursorRow, cursorCol;</div><div class='add'>+static int needResize;</div><div class='add'>+static int cursorOn = 1;</div><div class='add'>+</div><div class='add'>+static const char * defaultHelpLine =</div><div class='add'>+"  &lt;Tab&gt;/&lt;Alt-Tab&gt; between elements   |  &lt;Space&gt; selects   |  &lt;F12&gt; next screen"</div><div class='add'>+;</div><div class='add'>+</div><div class='add'>+const struct newtColors newtDefaultColorPalette = {</div><div class='add'>+	  "cyan", "black", 			/* root fg, bg */</div><div class='add'>+	  "black", "blue",			/* border fg, bg */</div><div class='add'>+	  "white", "blue",			/* window fg, bg */</div><div class='add'>+	  "white", "black",			/* shadow fg, bg */</div><div class='add'>+	  "white", "blue",			/* title fg, bg */</div><div class='add'>+	  "black", "cyan",			/* button fg, bg */</div><div class='add'>+	  "yellow", "cyan",			/* active button fg, bg */</div><div class='add'>+	  "yellow", "blue",			/* checkbox fg, bg */</div><div class='add'>+	  "blue", "brown",			/* active checkbox fg, bg */</div><div class='add'>+	  "yellow", "blue",			/* entry box fg, bg */</div><div class='add'>+	  "white", "blue",			/* label fg, bg */</div><div class='add'>+	  "black", "cyan",			/* listbox fg, bg */</div><div class='add'>+	  "yellow", "cyan",			/* active listbox fg, bg */</div><div class='add'>+	  "white", "blue",			/* textbox fg, bg */</div><div class='add'>+	  "cyan", "black",			/* active textbox fg, bg */</div><div class='add'>+	  "white", "blue",			/* help line */</div><div class='add'>+	  "yellow", "blue",			/* root text */</div><div class='add'>+	  "blue",					/* scale full */</div><div class='add'>+	  "red",					/* scale empty */</div><div class='add'>+	  "blue", "cyan",				/* disabled entry fg, bg */</div><div class='add'>+	  "white", "blue",			/* compact button fg, bg */</div><div class='add'>+	  "yellow", "red",			/* active &amp; sel listbox */</div><div class='add'>+	  "black", "brown"			/* selected listbox */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static const struct keymap keymap[] = {</div><div class='add'>+	{ "\033OA", 		NEWT_KEY_UP, 		"kh" },</div><div class='add'>+	{ "\033[A", 		NEWT_KEY_UP, 		"ku" },</div><div class='add'>+	{ "\033OB", 		NEWT_KEY_DOWN, 		"kd" },</div><div class='add'>+	{ "\033[B", 		NEWT_KEY_DOWN, 		"kd" },</div><div class='add'>+	{ "\033[C", 		NEWT_KEY_RIGHT, 	"kr" },</div><div class='add'>+	{ "\033OC", 		NEWT_KEY_RIGHT, 	"kr" },</div><div class='add'>+	{ "\033[D", 		NEWT_KEY_LEFT, 		"kl" },</div><div class='add'>+	{ "\033OD", 		NEWT_KEY_LEFT, 		"kl" },</div><div class='add'>+	{ "\033[H",		NEWT_KEY_HOME, 		"kh" },</div><div class='add'>+	{ "\033[1~",		NEWT_KEY_HOME, 		"kh" },</div><div class='add'>+	{ "\033Ow",		NEWT_KEY_END, 		"kH" },</div><div class='add'>+	{ "\033[4~",		NEWT_KEY_END, 		"kH" },</div><div class='add'>+</div><div class='add'>+	{ "\033[3~",		NEWT_KEY_DELETE,	"kl" },</div><div class='add'>+	{ "\033[2~", 		NEWT_KEY_INSERT,	NULL },</div><div class='add'>+</div><div class='add'>+	{ "\033\t",		NEWT_KEY_UNTAB,		NULL },</div><div class='add'>+</div><div class='add'>+	{ "\033[5~",		NEWT_KEY_PGUP,		NULL },</div><div class='add'>+	{ "\033[6~",		NEWT_KEY_PGDN,		NULL },</div><div class='add'>+	{ "\033V",		NEWT_KEY_PGUP, 		"kH" },</div><div class='add'>+	{ "\033v",		NEWT_KEY_PGUP, 		"kH" },</div><div class='add'>+</div><div class='add'>+	{ "\033[[A",		NEWT_KEY_F1,		NULL },</div><div class='add'>+	{ "\033[[B",		NEWT_KEY_F2,		NULL },</div><div class='add'>+	{ "\033[[C",		NEWT_KEY_F3,		NULL },</div><div class='add'>+	{ "\033[[D",		NEWT_KEY_F4,		NULL },</div><div class='add'>+	{ "\033[[E",		NEWT_KEY_F5,		NULL },</div><div class='add'>+</div><div class='add'>+	{ "\033OP",		NEWT_KEY_F1,		NULL },</div><div class='add'>+	{ "\033OQ",		NEWT_KEY_F2,		NULL },</div><div class='add'>+	{ "\033OR",		NEWT_KEY_F3,		NULL },</div><div class='add'>+	{ "\033OS",		NEWT_KEY_F4,		NULL },</div><div class='add'>+</div><div class='add'>+	{ "\033[11~",		NEWT_KEY_F1,		NULL },</div><div class='add'>+	{ "\033[12~",		NEWT_KEY_F2,		NULL },</div><div class='add'>+	{ "\033[13~",		NEWT_KEY_F3,		NULL },</div><div class='add'>+	{ "\033[14~",		NEWT_KEY_F4,		NULL },</div><div class='add'>+	{ "\033[15~",		NEWT_KEY_F5,		NULL },</div><div class='add'>+	{ "\033[17~",		NEWT_KEY_F6,		NULL },</div><div class='add'>+	{ "\033[18~",		NEWT_KEY_F7,		NULL },</div><div class='add'>+	{ "\033[19~",		NEWT_KEY_F8,		NULL },</div><div class='add'>+	{ "\033[20~",		NEWT_KEY_F9,		NULL },</div><div class='add'>+	{ "\033[21~",		NEWT_KEY_F10,		NULL },</div><div class='add'>+	{ "\033[23~",		NEWT_KEY_F11,		NULL },</div><div class='add'>+	{ "\033[24~",		NEWT_KEY_F12,		NULL },</div><div class='add'>+</div><div class='add'>+	{ NULL, 	0, 			NULL },	/* LEAVE this one */</div><div class='add'>+};</div><div class='add'>+static char keyPrefix = '\033';</div><div class='add'>+</div><div class='add'>+static const char * version = "Newt windowing library version " VERSION</div><div class='add'>+			" - (C) 1996-2000 Red Hat Software. "</div><div class='add'>+		        "Redistributable under the term of the Library "</div><div class='add'>+		        "GNU Public License. "</div><div class='add'>+			"Written by Erik Troan\n";</div><div class='add'>+</div><div class='add'>+static newtSuspendCallback suspendCallback = NULL;</div><div class='add'>+static void * suspendCallbackData = NULL;</div><div class='add'>+</div><div class='add'>+void newtSetSuspendCallback(newtSuspendCallback cb, void * data) {</div><div class='add'>+    suspendCallback = cb;</div><div class='add'>+    suspendCallbackData = data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void handleSigwinch(int signum) {</div><div class='add'>+    needResize = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int getkeyInterruptHook(void) {</div><div class='add'>+    return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtFlushInput(void) {</div><div class='add'>+    while (SLang_input_pending(0)) {</div><div class='add'>+	SLang_getkey();</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtRefresh(void) {</div><div class='add'>+    SLsmg_refresh();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtSuspend(void) {</div><div class='add'>+    SLtt_set_cursor_visibility (1);</div><div class='add'>+    SLsmg_suspend_smg();</div><div class='add'>+    SLang_reset_tty();</div><div class='add'>+    SLtt_set_cursor_visibility (cursorOn);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtResume(void) {</div><div class='add'>+    SLsmg_resume_smg ();</div><div class='add'>+    SLsmg_refresh();</div><div class='add'>+    SLang_init_tty(0, 0, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCls(void) {</div><div class='add'>+    SLsmg_set_color(NEWT_COLORSET_ROOT);</div><div class='add'>+    SLsmg_gotorc(0, 0);</div><div class='add'>+    SLsmg_erase_eos();</div><div class='add'>+</div><div class='add'>+    newtRefresh();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if defined(THIS_DOESNT_WORK)</div><div class='add'>+void newtResizeScreen(int redraw) {</div><div class='add'>+    newtPushHelpLine("");</div><div class='add'>+</div><div class='add'>+    SLtt_get_screen_size();</div><div class='add'>+    SLang_init_tty(0, 0, 0);</div><div class='add'>+</div><div class='add'>+    SLsmg_touch_lines (0, SLtt_Screen_Rows - 1);</div><div class='add'>+</div><div class='add'>+    /* I don't know why I need this */</div><div class='add'>+    SLsmg_refresh();</div><div class='add'>+</div><div class='add'>+    newtPopHelpLine();</div><div class='add'>+</div><div class='add'>+    if (redraw)</div><div class='add'>+	SLsmg_refresh();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int newtInit(void) {</div><div class='add'>+    char * MonoValue, * MonoEnv = "NEWT_MONO";</div><div class='add'>+</div><div class='add'>+    /* use the version variable just to be sure it gets included */</div><div class='add'>+    strlen(version);</div><div class='add'>+</div><div class='add'>+    SLtt_get_terminfo();</div><div class='add'>+    SLtt_get_screen_size();</div><div class='add'>+</div><div class='add'>+    MonoValue = getenv(MonoEnv);</div><div class='add'>+    if ( MonoValue == NULL ) {</div><div class='add'>+	SLtt_Use_Ansi_Colors = 1;</div><div class='add'>+    } else {</div><div class='add'>+	SLtt_Use_Ansi_Colors = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SLsmg_init_smg();</div><div class='add'>+    SLang_init_tty(0, 0, 0);</div><div class='add'>+</div><div class='add'>+    newtSetColors(newtDefaultColorPalette);</div><div class='add'>+    newtCursorOff();</div><div class='add'>+    /*initKeymap();*/</div><div class='add'>+</div><div class='add'>+    /*memset(&amp;sa, 0, sizeof(sa));</div><div class='add'>+    sa.sa_handler = handleSigwinch;</div><div class='add'>+    sigaction(SIGWINCH, &amp;sa, NULL);*/</div><div class='add'>+</div><div class='add'>+    SLsignal_intr(SIGWINCH, handleSigwinch);</div><div class='add'>+    SLang_getkey_intr_hook = getkeyInterruptHook;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtFinished(void) {</div><div class='add'>+    SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);</div><div class='add'>+    newtCursorOn();</div><div class='add'>+    SLsmg_refresh();</div><div class='add'>+    SLsmg_reset_smg();</div><div class='add'>+    SLang_reset_tty();</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtSetColors(struct newtColors colors) {</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_ROOT, "", colors.rootFg, colors.rootBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_BORDER, "", colors.borderFg, colors.borderBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_WINDOW, "", colors.windowFg, colors.windowBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_SHADOW, "", colors.shadowFg, colors.shadowBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_TITLE, "", colors.titleFg, colors.titleBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_BUTTON, "", colors.buttonFg, colors.buttonBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_ACTBUTTON, "", colors.actButtonFg,</div><div class='add'>+			colors.actButtonBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_CHECKBOX, "", colors.checkboxFg,</div><div class='add'>+			colors.checkboxBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_ACTCHECKBOX, "", colors.actCheckboxFg,</div><div class='add'>+			colors.actCheckboxBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_ENTRY, "", colors.entryFg, colors.entryBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_LABEL, "", colors.labelFg, colors.labelBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_LISTBOX, "", colors.listboxFg,</div><div class='add'>+			colors.listboxBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_ACTLISTBOX, "", colors.actListboxFg,</div><div class='add'>+			colors.actListboxBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_TEXTBOX, "", colors.textboxFg,</div><div class='add'>+			colors.textboxBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_ACTTEXTBOX, "", colors.actTextboxFg,</div><div class='add'>+			colors.actTextboxBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_HELPLINE, "", colors.helpLineFg,</div><div class='add'>+			colors.helpLineBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_ROOTTEXT, "", colors.rootTextFg,</div><div class='add'>+			colors.rootTextBg);</div><div class='add'>+</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_EMPTYSCALE, "", "black",</div><div class='add'>+			colors.emptyScale);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_FULLSCALE, "", "black",</div><div class='add'>+			colors.fullScale);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_DISENTRY, "", colors.disabledEntryFg,</div><div class='add'>+			colors.disabledEntryBg);</div><div class='add'>+</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_COMPACTBUTTON, "", colors.compactButtonFg,</div><div class='add'>+			colors.compactButtonBg);</div><div class='add'>+</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_ACTSELLISTBOX, "", colors.actSelListboxFg,</div><div class='add'>+		   colors.actSelListboxBg);</div><div class='add'>+    SLtt_set_color(NEWT_COLORSET_SELLISTBOX, "", colors.selListboxFg,</div><div class='add'>+		   colors.selListboxBg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtGetKey(void) {</div><div class='add'>+    int key;</div><div class='add'>+    char buf[10], * chptr = buf;</div><div class='add'>+    const struct keymap * curr;</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+	key = SLang_getkey();</div><div class='add'>+	if (key == 0xFFFF) {</div><div class='add'>+	    if (needResize)</div><div class='add'>+		return NEWT_KEY_RESIZE;</div><div class='add'>+</div><div class='add'>+	    /* ignore other signals */</div><div class='add'>+	    continue;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	if (key == NEWT_KEY_SUSPEND &amp;&amp; suspendCallback)</div><div class='add'>+	    suspendCallback(suspendCallbackData);</div><div class='add'>+    } while (key == NEWT_KEY_SUSPEND);</div><div class='add'>+</div><div class='add'>+    switch (key) {</div><div class='add'>+      case 'v' | 0x80:</div><div class='add'>+      case 'V' | 0x80:</div><div class='add'>+	return NEWT_KEY_PGUP;</div><div class='add'>+</div><div class='add'>+      case 22:</div><div class='add'>+	return NEWT_KEY_PGDN;</div><div class='add'>+</div><div class='add'>+	return NEWT_KEY_BKSPC;</div><div class='add'>+      case 0x7f:</div><div class='add'>+	return NEWT_KEY_BKSPC;</div><div class='add'>+</div><div class='add'>+      case 0x08:</div><div class='add'>+	return NEWT_KEY_BKSPC;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	if (key != keyPrefix) return key;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    memset(buf, 0, sizeof(buf));</div><div class='add'>+</div><div class='add'>+    *chptr++ = key;</div><div class='add'>+    while (SLang_input_pending(5)) {</div><div class='add'>+	key = SLang_getkey();</div><div class='add'>+	if (key == keyPrefix) {</div><div class='add'>+	    /* he hit unknown keys too many times -- start over */</div><div class='add'>+	    memset(buf, 0, sizeof(buf));</div><div class='add'>+	    chptr = buf;</div><div class='add'>+	}</div><div class='add'>+</div><div class='add'>+	*chptr++ = key;</div><div class='add'>+</div><div class='add'>+	/* this search should use bsearch(), but when we only look through</div><div class='add'>+	   a list of 20 (or so) keymappings, it's probably faster just to</div><div class='add'>+	   do a inline linear search */</div><div class='add'>+</div><div class='add'>+	for (curr = keymap; curr-&gt;code; curr++) {</div><div class='add'>+	    if (curr-&gt;str) {</div><div class='add'>+		if (!strcmp(curr-&gt;str, buf))</div><div class='add'>+		    return curr-&gt;code;</div><div class='add'>+	    }</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (curr = keymap; curr-&gt;code; curr++) {</div><div class='add'>+	if (curr-&gt;str) {</div><div class='add'>+	    if (!strcmp(curr-&gt;str, buf))</div><div class='add'>+		return curr-&gt;code;</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Looks like we were a bit overzealous in reading characters. Return</div><div class='add'>+       just the first character, and put everything else back in the buffer</div><div class='add'>+       for later */</div><div class='add'>+</div><div class='add'>+    chptr--;</div><div class='add'>+    while (chptr &gt; buf)</div><div class='add'>+	SLang_ungetkey(*chptr--);</div><div class='add'>+</div><div class='add'>+    return *chptr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtWaitForKey(void) {</div><div class='add'>+    newtRefresh();</div><div class='add'>+</div><div class='add'>+    SLang_getkey();</div><div class='add'>+    newtClearKeyBuffer();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtClearKeyBuffer(void) {</div><div class='add'>+    while (SLang_input_pending(1)) {</div><div class='add'>+	SLang_getkey();</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtOpenWindow(int left, int top, int width, int height,</div><div class='add'>+			  const char * title) {</div><div class='add'>+    int j, row, col;</div><div class='add'>+    int n;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    newtFlushInput();</div><div class='add'>+</div><div class='add'>+    if (!currentWindow) {</div><div class='add'>+	currentWindow = windowStack;</div><div class='add'>+    } else {</div><div class='add'>+	currentWindow++;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    currentWindow-&gt;left = left;</div><div class='add'>+    currentWindow-&gt;top = top;</div><div class='add'>+    currentWindow-&gt;width = width;</div><div class='add'>+    currentWindow-&gt;height = height;</div><div class='add'>+    currentWindow-&gt;title = title ? strdup(title) : NULL;</div><div class='add'>+</div><div class='add'>+    currentWindow-&gt;buffer = malloc(sizeof(short) * (width + 3) * (height + 3));</div><div class='add'>+</div><div class='add'>+    row = top - 1;</div><div class='add'>+    col = left - 1;</div><div class='add'>+    n = 0;</div><div class='add'>+    for (j = 0; j &lt; height + 3; j++, row++) {</div><div class='add'>+	SLsmg_gotorc(row, col);</div><div class='add'>+	SLsmg_read_raw(currentWindow-&gt;buffer + n,</div><div class='add'>+				currentWindow-&gt;width + 3);</div><div class='add'>+	n += currentWindow-&gt;width + 3;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(NEWT_COLORSET_BORDER);</div><div class='add'>+    SLsmg_draw_box(top - 1, left - 1, height + 2, width + 2);</div><div class='add'>+</div><div class='add'>+    if (currentWindow-&gt;title) {</div><div class='add'>+	i = strlen(currentWindow-&gt;title) + 4;</div><div class='add'>+	i = ((width - i) / 2) + left;</div><div class='add'>+	SLsmg_gotorc(top - 1, i);</div><div class='add'>+	SLsmg_set_char_set(1);</div><div class='add'>+	SLsmg_write_char(SLSMG_RTEE_CHAR);</div><div class='add'>+	SLsmg_set_char_set(0);</div><div class='add'>+	SLsmg_write_char(' ');</div><div class='add'>+	SLsmg_set_color(NEWT_COLORSET_TITLE);</div><div class='add'>+	SLsmg_write_string((char *)currentWindow-&gt;title);</div><div class='add'>+	SLsmg_set_color(NEWT_COLORSET_BORDER);</div><div class='add'>+	SLsmg_write_char(' ');</div><div class='add'>+	SLsmg_set_char_set(1);</div><div class='add'>+	SLsmg_write_char(SLSMG_LTEE_CHAR);</div><div class='add'>+	SLsmg_set_char_set(0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(NEWT_COLORSET_WINDOW);</div><div class='add'>+    SLsmg_fill_region(top, left, height, width, ' ');</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(NEWT_COLORSET_SHADOW);</div><div class='add'>+    SLsmg_fill_region(top + height + 1, left, 1, width + 2, ' ');</div><div class='add'>+    SLsmg_fill_region(top, left + width + 1, height + 1, 1, ' ');</div><div class='add'>+</div><div class='add'>+    for (i = top; i &lt; (top + height + 1); i++) {</div><div class='add'>+	SLsmg_gotorc(i, left + width + 1);</div><div class='add'>+	SLsmg_write_string(" ");</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtCenteredWindow(int width, int height, const char * title) {</div><div class='add'>+    int top, left;</div><div class='add'>+</div><div class='add'>+    top = (SLtt_Screen_Rows - height) / 2;</div><div class='add'>+</div><div class='add'>+    /* I don't know why, but this seems to look better */</div><div class='add'>+    if ((SLtt_Screen_Rows % 2) &amp;&amp; (top % 2)) top--;</div><div class='add'>+</div><div class='add'>+    left = (SLtt_Screen_Cols - width) / 2;</div><div class='add'>+</div><div class='add'>+    newtOpenWindow(left, top, width, height, title);</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtPopWindow(void) {</div><div class='add'>+    int j, row, col;</div><div class='add'>+    int n = 0;</div><div class='add'>+</div><div class='add'>+    row = col = 0;</div><div class='add'>+</div><div class='add'>+    row = currentWindow-&gt;top - 1;</div><div class='add'>+    col = currentWindow-&gt;left - 1;</div><div class='add'>+    for (j = 0; j &lt; currentWindow-&gt;height + 3; j++, row++) {</div><div class='add'>+	SLsmg_gotorc(row, col);</div><div class='add'>+	SLsmg_write_raw(currentWindow-&gt;buffer + n,</div><div class='add'>+				currentWindow-&gt;width + 3);</div><div class='add'>+	n += currentWindow-&gt;width + 3;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    free(currentWindow-&gt;buffer);</div><div class='add'>+    free(currentWindow-&gt;title);</div><div class='add'>+</div><div class='add'>+    if (currentWindow == windowStack)</div><div class='add'>+	currentWindow = NULL;</div><div class='add'>+    else</div><div class='add'>+	currentWindow--;</div><div class='add'>+</div><div class='add'>+    SLsmg_set_char_set(0);</div><div class='add'>+</div><div class='add'>+    newtRefresh();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGetWindowPos(int * x, int * y) {</div><div class='add'>+    if (currentWindow) {</div><div class='add'>+	*x = currentWindow-&gt;left;</div><div class='add'>+	*y = currentWindow-&gt;top;</div><div class='add'>+    } else</div><div class='add'>+	*x = *y = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGetrc(int * row, int * col) {</div><div class='add'>+   *row = cursorRow;</div><div class='add'>+   *col = cursorCol;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGotorc(int newRow, int newCol) {</div><div class='add'>+    if (currentWindow) {</div><div class='add'>+	newRow += currentWindow-&gt;top;</div><div class='add'>+	newCol += currentWindow-&gt;left;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    cursorRow = newRow;</div><div class='add'>+    cursorCol = newCol;</div><div class='add'>+    SLsmg_gotorc(cursorRow, cursorCol);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtDrawBox(int left, int top, int width, int height, int shadow) {</div><div class='add'>+    if (currentWindow) {</div><div class='add'>+	top += currentWindow-&gt;top;</div><div class='add'>+	left += currentWindow-&gt;left;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SLsmg_draw_box(top, left, height, width);</div><div class='add'>+</div><div class='add'>+    if (shadow) {</div><div class='add'>+	SLsmg_set_color(NEWT_COLORSET_SHADOW);</div><div class='add'>+	SLsmg_fill_region(top + height, left + 1, 1, width - 1, ' ');</div><div class='add'>+	SLsmg_fill_region(top + 1, left + width, height, 1, ' ');</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtClearBox(int left, int top, int width, int height) {</div><div class='add'>+    if (currentWindow) {</div><div class='add'>+	top += currentWindow-&gt;top;</div><div class='add'>+	left += currentWindow-&gt;left;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SLsmg_fill_region(top, left, height, width, ' ');</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+/* This doesn't seem to work quite right. I don't know why not, but when</div><div class='add'>+   I rsh from an rxvt into a box and run this code, the machine returns</div><div class='add'>+   console key's (\033[B) rather then xterm ones (\033OB). */</div><div class='add'>+static void initKeymap(void) {</div><div class='add'>+    struct keymap * curr;</div><div class='add'>+</div><div class='add'>+    for (curr = keymap; curr-&gt;code; curr++) {</div><div class='add'>+	if (!curr-&gt;str)</div><div class='add'>+	    curr-&gt;str = SLtt_tgetstr(curr-&gt;tc);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    /* Newt's keymap handling is a bit broken. It assumes that any extended</div><div class='add'>+       keystrokes begin with ESC. If you're using a homebrek terminal you</div><div class='add'>+       will probably need to fix this, or just yell at me and I'll be so</div><div class='add'>+       ashamed of myself for doing it this way I'll fix it */</div><div class='add'>+</div><div class='add'>+    keyPrefix = 0x1b;		/* ESC */</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+void newtDelay(int usecs) {</div><div class='add'>+    fd_set set;</div><div class='add'>+    struct timeval tv;</div><div class='add'>+</div><div class='add'>+    FD_ZERO(&amp;set);</div><div class='add'>+</div><div class='add'>+    tv.tv_sec = usecs / 1000000;</div><div class='add'>+    tv.tv_usec = usecs % 1000000;</div><div class='add'>+</div><div class='add'>+    select(0, &amp;set, &amp;set, &amp;set, &amp;tv);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct eventResult newtDefaultEventHandler(newtComponent c,</div><div class='add'>+					   struct event ev) {</div><div class='add'>+    struct eventResult er;</div><div class='add'>+</div><div class='add'>+    er.result = ER_IGNORED;</div><div class='add'>+    return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtRedrawHelpLine(void) {</div><div class='add'>+    char * buf;</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(NEWT_COLORSET_HELPLINE);</div><div class='add'>+</div><div class='add'>+    buf = alloca(SLtt_Screen_Cols + 1);</div><div class='add'>+    memset(buf, ' ', SLtt_Screen_Cols);</div><div class='add'>+    buf[SLtt_Screen_Cols] = '\0';</div><div class='add'>+</div><div class='add'>+    if (currentHelpline)</div><div class='add'>+	memcpy(buf, *currentHelpline, strlen(*currentHelpline));</div><div class='add'>+</div><div class='add'>+    SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);</div><div class='add'>+    SLsmg_write_string(buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtPushHelpLine(const char * text) {</div><div class='add'>+    if (!text)</div><div class='add'>+	text = defaultHelpLine;</div><div class='add'>+</div><div class='add'>+    if (currentHelpline)</div><div class='add'>+	(*(++currentHelpline)) = strdup(text);</div><div class='add'>+    else {</div><div class='add'>+	currentHelpline = helplineStack;</div><div class='add'>+	*currentHelpline = strdup(text);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newtRedrawHelpLine();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtPopHelpLine(void) {</div><div class='add'>+    if (!currentHelpline) return;</div><div class='add'>+</div><div class='add'>+    free(*currentHelpline);</div><div class='add'>+    if (currentHelpline == helplineStack)</div><div class='add'>+	currentHelpline = NULL;</div><div class='add'>+    else</div><div class='add'>+	currentHelpline--;</div><div class='add'>+</div><div class='add'>+    newtRedrawHelpLine();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtDrawRootText(int col, int row, const char * text) {</div><div class='add'>+    SLsmg_set_color(NEWT_COLORSET_ROOTTEXT);</div><div class='add'>+</div><div class='add'>+    if (col &lt; 0) {</div><div class='add'>+	col = SLtt_Screen_Cols + col;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (row &lt; 0) {</div><div class='add'>+	row = SLtt_Screen_Rows + row;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SLsmg_gotorc(row, col);</div><div class='add'>+    SLsmg_write_string((char *)text);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtSetFlags(int oldFlags, int newFlags, enum newtFlagsSense sense) {</div><div class='add'>+    switch (sense) {</div><div class='add'>+      case NEWT_FLAGS_SET:</div><div class='add'>+	return oldFlags | newFlags;</div><div class='add'>+</div><div class='add'>+      case NEWT_FLAGS_RESET:</div><div class='add'>+	return oldFlags &amp; (~newFlags);</div><div class='add'>+</div><div class='add'>+      case NEWT_FLAGS_TOGGLE:</div><div class='add'>+	return oldFlags ^ newFlags;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	return oldFlags;</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtBell(void)</div><div class='add'>+{</div><div class='add'>+    SLtt_beep();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtGetScreenSize(int * cols, int * rows) {</div><div class='add'>+    if (rows) *rows = SLtt_Screen_Rows;</div><div class='add'>+    if (cols) *cols = SLtt_Screen_Cols;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtDefaultPlaceHandler(newtComponent c, int newLeft, int newTop) {</div><div class='add'>+    c-&gt;left = newLeft;</div><div class='add'>+    c-&gt;top = newTop;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtDefaultMappedHandler(newtComponent c, int isMapped) {</div><div class='add'>+    c-&gt;isMapped = isMapped;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCursorOff(void) {</div><div class='add'>+    cursorOn = 0;</div><div class='add'>+    SLtt_set_cursor_visibility (cursorOn);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtCursorOn(void) {</div><div class='add'>+    cursorOn = 1;</div><div class='add'>+    SLtt_set_cursor_visibility (cursorOn);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/newt.h b/mdk-stage1/newt/newt.h<br/>new file mode 100644<br/>index 000000000..d3fd8bedc<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/newt.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt.h</a></div><div class='hunk'>@@ -0,0 +1,362 @@</div><div class='add'>+#ifndef H_NEWT</div><div class='add'>+#define H_NEWT</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+extern "C" {</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+</div><div class='add'>+#define NEWT_COLORSET_ROOT 		2</div><div class='add'>+#define NEWT_COLORSET_BORDER 		3</div><div class='add'>+#define NEWT_COLORSET_WINDOW		4</div><div class='add'>+#define NEWT_COLORSET_SHADOW		5</div><div class='add'>+#define NEWT_COLORSET_TITLE		6</div><div class='add'>+#define NEWT_COLORSET_BUTTON		7</div><div class='add'>+#define NEWT_COLORSET_ACTBUTTON		8</div><div class='add'>+#define NEWT_COLORSET_CHECKBOX		9</div><div class='add'>+#define NEWT_COLORSET_ACTCHECKBOX	10</div><div class='add'>+#define NEWT_COLORSET_ENTRY		11</div><div class='add'>+#define NEWT_COLORSET_LABEL		12</div><div class='add'>+#define NEWT_COLORSET_LISTBOX		13</div><div class='add'>+#define NEWT_COLORSET_ACTLISTBOX	14</div><div class='add'>+#define NEWT_COLORSET_TEXTBOX		15</div><div class='add'>+#define NEWT_COLORSET_ACTTEXTBOX	16</div><div class='add'>+#define NEWT_COLORSET_HELPLINE		17</div><div class='add'>+#define NEWT_COLORSET_ROOTTEXT		18</div><div class='add'>+#define NEWT_COLORSET_EMPTYSCALE	19</div><div class='add'>+#define NEWT_COLORSET_FULLSCALE		20</div><div class='add'>+#define NEWT_COLORSET_DISENTRY		21</div><div class='add'>+#define NEWT_COLORSET_COMPACTBUTTON	22</div><div class='add'>+#define NEWT_COLORSET_ACTSELLISTBOX	23</div><div class='add'>+#define NEWT_COLORSET_SELLISTBOX	24</div><div class='add'>+</div><div class='add'>+#define NEWT_ARG_LAST			-100000</div><div class='add'>+#define NEWT_ARG_APPEND			-1</div><div class='add'>+</div><div class='add'>+struct newtColors {</div><div class='add'>+    char * rootFg, * rootBg;</div><div class='add'>+    char * borderFg, * borderBg;</div><div class='add'>+    char * windowFg, * windowBg;</div><div class='add'>+    char * shadowFg, * shadowBg;</div><div class='add'>+    char * titleFg, * titleBg;</div><div class='add'>+    char * buttonFg, * buttonBg;</div><div class='add'>+    char * actButtonFg, * actButtonBg;</div><div class='add'>+    char * checkboxFg, * checkboxBg;</div><div class='add'>+    char * actCheckboxFg, * actCheckboxBg;</div><div class='add'>+    char * entryFg, * entryBg;</div><div class='add'>+    char * labelFg, * labelBg;</div><div class='add'>+    char * listboxFg, * listboxBg;</div><div class='add'>+    char * actListboxFg, * actListboxBg;</div><div class='add'>+    char * textboxFg, * textboxBg;</div><div class='add'>+    char * actTextboxFg, * actTextboxBg;</div><div class='add'>+    char * helpLineFg, * helpLineBg;</div><div class='add'>+    char * rootTextFg, * rootTextBg;</div><div class='add'>+    char * emptyScale, * fullScale;</div><div class='add'>+    char * disabledEntryFg, * disabledEntryBg;</div><div class='add'>+    char * compactButtonFg, * compactButtonBg;</div><div class='add'>+    char * actSelListboxFg, * actSelListboxBg;</div><div class='add'>+    char * selListboxFg, * selListboxBg;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum newtFlagsSense { NEWT_FLAGS_SET, NEWT_FLAGS_RESET, NEWT_FLAGS_TOGGLE };</div><div class='add'>+</div><div class='add'>+#define NEWT_FLAG_RETURNEXIT 	(1 &lt;&lt; 0)</div><div class='add'>+#define NEWT_FLAG_HIDDEN 	(1 &lt;&lt; 1)</div><div class='add'>+#define NEWT_FLAG_SCROLL 	(1 &lt;&lt; 2)</div><div class='add'>+#define NEWT_FLAG_DISABLED 	(1 &lt;&lt; 3)</div><div class='add'>+/* OBSOLETE #define NEWT_FLAG_NOSCROLL 	(1 &lt;&lt; 4)	for listboxes */</div><div class='add'>+#define NEWT_FLAG_BORDER	(1 &lt;&lt; 5)</div><div class='add'>+#define NEWT_FLAG_WRAP		(1 &lt;&lt; 6)</div><div class='add'>+#define NEWT_FLAG_NOF12		(1 &lt;&lt; 7)</div><div class='add'>+#define NEWT_FLAG_MULTIPLE      (1 &lt;&lt; 8)</div><div class='add'>+#define NEWT_FLAG_SELECTED	(1 &lt;&lt; 9)</div><div class='add'>+#define NEWT_FLAG_CHECKBOX	(1 &lt;&lt; 10)</div><div class='add'>+#define NEWT_FLAG_PASSWORD      (1 &lt;&lt; 11)  /* draw '*'  of chars in entrybox */</div><div class='add'>+#define NEWT_FD_READ		(1 &lt;&lt; 0)</div><div class='add'>+#define NEWT_FD_WRITE		(1 &lt;&lt; 1)</div><div class='add'>+</div><div class='add'>+#define NEWT_CHECKBOXTREE_COLLAPSED	'\0'</div><div class='add'>+#define NEWT_CHECKBOXTREE_EXPANDED	'\1'</div><div class='add'>+#define NEWT_CHECKBOXTREE_UNSELECTED	' '</div><div class='add'>+#define NEWT_CHECKBOXTREE_SELECTED	'*'</div><div class='add'>+</div><div class='add'>+/* Backwards compatibility */</div><div class='add'>+#define NEWT_LISTBOX_RETURNEXIT NEWT_FLAG_RETURNEXIT</div><div class='add'>+#define NEWT_ENTRY_SCROLL	NEWT_FLAG_SCROLL</div><div class='add'>+#define NEWT_ENTRY_HIDDEN	NEWT_FLAG_HIDDEN</div><div class='add'>+#define NEWT_ENTRY_RETURNEXIT	NEWT_FLAG_RETURNEXIT</div><div class='add'>+#define NEWT_ENTRY_DISABLED	NEWT_FLAG_DISABLED</div><div class='add'>+</div><div class='add'>+#define NEWT_TEXTBOX_WRAP	NEWT_FLAG_WRAP</div><div class='add'>+#define NEWT_TEXTBOX_SCROLL	NEWT_FLAG_SCROLL</div><div class='add'>+#define NEWT_FORM_NOF12		NEWT_FLAG_NOF12</div><div class='add'>+</div><div class='add'>+#define newtListboxAddEntry	newtListboxAppendEntry</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+typedef struct newtComponent_struct * newtComponent;</div><div class='add'>+</div><div class='add'>+extern const struct newtColors newtDefaultColorPalette;</div><div class='add'>+</div><div class='add'>+typedef void (*newtCallback)(newtComponent, void *);</div><div class='add'>+typedef void (*newtSuspendCallback)(void * data);</div><div class='add'>+</div><div class='add'>+int newtInit(void);</div><div class='add'>+int newtFinished(void);</div><div class='add'>+void newtCls(void);</div><div class='add'>+void newtResizeScreen(int redraw);</div><div class='add'>+void newtWaitForKey(void);</div><div class='add'>+void newtClearKeyBuffer(void);</div><div class='add'>+void newtDelay(int usecs);</div><div class='add'>+/* top, left are *not* counting the border */</div><div class='add'>+int newtOpenWindow(int left, int top, int width, int height, </div><div class='add'>+			  const char * title);</div><div class='add'>+int newtCenteredWindow(int width, int height, const char * title);</div><div class='add'>+void newtPopWindow(void);</div><div class='add'>+void newtSetColors(struct newtColors colors);</div><div class='add'>+void newtRefresh(void);</div><div class='add'>+void newtSuspend(void);</div><div class='add'>+void newtSetSuspendCallback(newtSuspendCallback cb, void * data);</div><div class='add'>+void newtSetHelpCallback(newtCallback cb);</div><div class='add'>+void newtResume(void);</div><div class='add'>+void newtPushHelpLine(const char * text);</div><div class='add'>+void newtRedrawHelpLine(void);</div><div class='add'>+void newtPopHelpLine(void);</div><div class='add'>+void newtDrawRootText(int col, int row, const char * text);</div><div class='add'>+void newtBell(void);</div><div class='add'>+void newtCursorOff(void);</div><div class='add'>+void newtCursorOn(void);</div><div class='add'>+</div><div class='add'>+/* Components */</div><div class='add'>+</div><div class='add'>+newtComponent newtCompactButton(int left, int top, const char * text);</div><div class='add'>+newtComponent newtButton(int left, int top, const char * text);</div><div class='add'>+newtComponent newtCheckbox(int left, int top, const char * text, char defValue,</div><div class='add'>+			   const char * seq, char * result);</div><div class='add'>+char newtCheckboxGetValue(newtComponent co);</div><div class='add'>+void newtCheckboxSetValue(newtComponent co, char value);</div><div class='add'>+void newtCheckboxSetFlags(newtComponent co, int flags, enum newtFlagsSense sense);</div><div class='add'>+</div><div class='add'>+    </div><div class='add'>+newtComponent newtRadiobutton(int left, int top, const char * text, int isDefault,</div><div class='add'>+			      newtComponent prevButton);</div><div class='add'>+newtComponent newtRadioGetCurrent(newtComponent setMember);</div><div class='add'>+newtComponent newtListitem(int left, int top, const char * text, int isDefault,</div><div class='add'>+			      newtComponent prevItem, const void * data, int flags);</div><div class='add'>+void newtListitemSet(newtComponent co, const char * text);</div><div class='add'>+void * newtListitemGetData(newtComponent co);</div><div class='add'>+void newtGetScreenSize(int * cols, int * rows);</div><div class='add'>+</div><div class='add'>+newtComponent newtLabel(int left, int top, const char * text);</div><div class='add'>+void newtLabelSetText(newtComponent co, const char * text);</div><div class='add'>+newtComponent newtVerticalScrollbar(int left, int top, int height,</div><div class='add'>+				    int normalColorset, int thumbColorset);</div><div class='add'>+void newtScrollbarSet(newtComponent co, int where, int total);</div><div class='add'>+</div><div class='add'>+newtComponent newtListbox(int left, int top, int height, int flags);</div><div class='add'>+void * newtListboxGetCurrent(newtComponent co);</div><div class='add'>+void newtListboxSetCurrent(newtComponent co, int num);</div><div class='add'>+void newtListboxSetCurrentByKey(newtComponent co, void * key);</div><div class='add'>+void newtListboxSetEntry(newtComponent co, int num, const char * text);</div><div class='add'>+void newtListboxSetWidth(newtComponent co, int width);</div><div class='add'>+void newtListboxSetData(newtComponent co, int num, void * data);</div><div class='add'>+int newtListboxAppendEntry(newtComponent co, const char * text, </div><div class='add'>+			   const void * data);</div><div class='add'>+/* Send the key to insert after, or NULL to insert at the top */</div><div class='add'>+int newtListboxInsertEntry(newtComponent co, const char * text, const void * data, void * key);</div><div class='add'>+int newtListboxDeleteEntry(newtComponent co, void * data);</div><div class='add'>+void newtListboxClear(newtComponent co); /* removes all entries from listbox */</div><div class='add'>+void newtListboxGetEntry(newtComponent co, int num, char **text, void **data);</div><div class='add'>+/* Returns an array of data pointers from items, last element is NULL */</div><div class='add'>+void **newtListboxGetSelection(newtComponent co, int *numitems);</div><div class='add'>+void newtListboxClearSelection(newtComponent co);</div><div class='add'>+void newtListboxSelectItem(newtComponent co, const void * key,</div><div class='add'>+	enum newtFlagsSense sense);</div><div class='add'>+</div><div class='add'>+newtComponent newtCheckboxTree(int left, int top, int height, int flags);</div><div class='add'>+newtComponent newtCheckboxTreeMulti(int left, int top, int height, char *seq, int flags);</div><div class='add'>+const void ** newtCheckboxTreeGetSelection(newtComponent co, int *numitems);</div><div class='add'>+const void * newtCheckboxTreeGetCurrent(newtComponent co);</div><div class='add'>+const void ** newtCheckboxTreeGetMultiSelection(newtComponent co, int *numitems, char seqnum);</div><div class='add'>+/* last item is NEWT_ARG_LAST for all of these */</div><div class='add'>+int newtCheckboxTreeAddItem(newtComponent co, </div><div class='add'>+			    const char * text, const void * data,</div><div class='add'>+			    int flags, int index, ...);</div><div class='add'>+int newtCheckboxTreeAddArray(newtComponent co, </div><div class='add'>+			     const char * text, const void * data,</div><div class='add'>+			     int flags, int * indexes);</div><div class='add'>+int * newtCheckboxTreeFindItem(newtComponent co, void * data);</div><div class='add'>+void newtCheckboxTreeSetEntry(newtComponent co, const void * data,</div><div class='add'>+			      const char * text);</div><div class='add'>+char newtCheckboxTreeGetEntryValue(newtComponent co, const void * data);</div><div class='add'>+void newtCheckboxTreeSetEntryValue(newtComponent co, const void * data,</div><div class='add'>+				   char value);</div><div class='add'>+    </div><div class='add'>+newtComponent newtTextboxReflowed(int left, int top, char * text, int width,</div><div class='add'>+				  int flexDown, int flexUp, int flags);</div><div class='add'>+newtComponent newtTextbox(int left, int top, int width, int height, int flags);</div><div class='add'>+void newtTextboxSetText(newtComponent co, const char * text);</div><div class='add'>+void newtTextboxSetHeight(newtComponent co, int height);</div><div class='add'>+int newtTextboxGetNumLines(newtComponent co);</div><div class='add'>+char * newtReflowText(char * text, int width, int flexDown, int flexUp,</div><div class='add'>+		      int * actualWidth, int * actualHeight);</div><div class='add'>+</div><div class='add'>+struct newtExitStruct {</div><div class='add'>+    enum { NEWT_EXIT_HOTKEY, NEWT_EXIT_COMPONENT, NEWT_EXIT_FDREADY,</div><div class='add'>+	   NEWT_EXIT_TIMER } reason;</div><div class='add'>+    union {</div><div class='add'>+	int key;</div><div class='add'>+	newtComponent co;</div><div class='add'>+    } u;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+newtComponent newtForm(newtComponent vertBar, void * helpTag, int flags);</div><div class='add'>+void newtFormSetTimer(newtComponent form, int millisecs);</div><div class='add'>+void newtFormWatchFd(newtComponent form, int fd, int fdFlags);</div><div class='add'>+void newtFormSetSize(newtComponent co);</div><div class='add'>+newtComponent newtFormGetCurrent(newtComponent co);</div><div class='add'>+void newtFormSetBackground(newtComponent co, int color);</div><div class='add'>+void newtFormSetCurrent(newtComponent co, newtComponent subco);</div><div class='add'>+void newtFormAddComponent(newtComponent form, newtComponent co);</div><div class='add'>+void newtFormAddComponents(newtComponent form, ...);</div><div class='add'>+void newtFormSetHeight(newtComponent co, int height);</div><div class='add'>+void newtFormSetWidth(newtComponent co, int width);</div><div class='add'>+newtComponent newtRunForm(newtComponent form);		/* obsolete */</div><div class='add'>+void newtFormRun(newtComponent co, struct newtExitStruct * es);</div><div class='add'>+void newtDrawForm(newtComponent form);</div><div class='add'>+void newtFormAddHotKey(newtComponent co, int key);</div><div class='add'>+</div><div class='add'>+typedef int (*newtEntryFilter)(newtComponent entry, void * data, int ch,</div><div class='add'>+			       int cursor);</div><div class='add'>+newtComponent newtEntry(int left, int top, const char * initialValue, int width,</div><div class='add'>+			char ** resultPtr, int flags);</div><div class='add'>+void newtEntrySet(newtComponent co, const char * value, int cursorAtEnd);</div><div class='add'>+void newtEntrySetFilter(newtComponent co, newtEntryFilter filter, void * data);</div><div class='add'>+char * newtEntryGetValue(newtComponent co);</div><div class='add'>+void newtEntrySetFlags(newtComponent co, int flags, enum newtFlagsSense sense);</div><div class='add'>+</div><div class='add'>+newtComponent newtScale(int left, int top, int width, int fullValue);</div><div class='add'>+void newtScaleSet(newtComponent co, unsigned int amount);</div><div class='add'>+</div><div class='add'>+void newtComponentAddCallback(newtComponent co, newtCallback f, void * data);</div><div class='add'>+void newtComponentTakesFocus(newtComponent co, int val);</div><div class='add'>+</div><div class='add'>+/* this also destroys all of the components (including other forms) on the </div><div class='add'>+   form */</div><div class='add'>+void newtFormDestroy(newtComponent form);	</div><div class='add'>+</div><div class='add'>+/* Key codes */</div><div class='add'>+</div><div class='add'>+#define NEWT_KEY_TAB			'\t'</div><div class='add'>+#define NEWT_KEY_ENTER			'\r'</div><div class='add'>+#define NEWT_KEY_SUSPEND		'\032'			/* ctrl - z*/</div><div class='add'>+#define NEWT_KEY_RETURN			NEWT_KEY_ENTER</div><div class='add'>+</div><div class='add'>+#define NEWT_KEY_EXTRA_BASE		0x8000</div><div class='add'>+#define NEWT_KEY_UP			NEWT_KEY_EXTRA_BASE + 1</div><div class='add'>+#define NEWT_KEY_DOWN			NEWT_KEY_EXTRA_BASE + 2</div><div class='add'>+#define NEWT_KEY_LEFT			NEWT_KEY_EXTRA_BASE + 4</div><div class='add'>+#define NEWT_KEY_RIGHT			NEWT_KEY_EXTRA_BASE + 5</div><div class='add'>+#define NEWT_KEY_BKSPC			NEWT_KEY_EXTRA_BASE + 6</div><div class='add'>+#define NEWT_KEY_DELETE			NEWT_KEY_EXTRA_BASE + 7</div><div class='add'>+#define NEWT_KEY_HOME			NEWT_KEY_EXTRA_BASE + 8</div><div class='add'>+#define NEWT_KEY_END			NEWT_KEY_EXTRA_BASE + 9</div><div class='add'>+#define NEWT_KEY_UNTAB			NEWT_KEY_EXTRA_BASE + 10</div><div class='add'>+#define NEWT_KEY_PGUP			NEWT_KEY_EXTRA_BASE + 11</div><div class='add'>+#define NEWT_KEY_PGDN			NEWT_KEY_EXTRA_BASE + 12</div><div class='add'>+#define NEWT_KEY_INSERT			NEWT_KEY_EXTRA_BASE + 13</div><div class='add'>+</div><div class='add'>+#define NEWT_KEY_F1			NEWT_KEY_EXTRA_BASE + 101</div><div class='add'>+#define NEWT_KEY_F2			NEWT_KEY_EXTRA_BASE + 102</div><div class='add'>+#define NEWT_KEY_F3			NEWT_KEY_EXTRA_BASE + 103</div><div class='add'>+#define NEWT_KEY_F4			NEWT_KEY_EXTRA_BASE + 104</div><div class='add'>+#define NEWT_KEY_F5			NEWT_KEY_EXTRA_BASE + 105</div><div class='add'>+#define NEWT_KEY_F6			NEWT_KEY_EXTRA_BASE + 106</div><div class='add'>+#define NEWT_KEY_F7			NEWT_KEY_EXTRA_BASE + 107</div><div class='add'>+#define NEWT_KEY_F8			NEWT_KEY_EXTRA_BASE + 108</div><div class='add'>+#define NEWT_KEY_F9			NEWT_KEY_EXTRA_BASE + 109</div><div class='add'>+#define NEWT_KEY_F10			NEWT_KEY_EXTRA_BASE + 110</div><div class='add'>+#define NEWT_KEY_F11			NEWT_KEY_EXTRA_BASE + 111</div><div class='add'>+#define NEWT_KEY_F12			NEWT_KEY_EXTRA_BASE + 112</div><div class='add'>+</div><div class='add'>+/* not really a key, but newtGetKey returns it */</div><div class='add'>+#define NEWT_KEY_RESIZE			NEWT_KEY_EXTRA_BASE + 113</div><div class='add'>+</div><div class='add'>+#define NEWT_ANCHOR_LEFT		(1 &lt;&lt; 0)</div><div class='add'>+#define NEWT_ANCHOR_RIGHT		(1 &lt;&lt; 1)</div><div class='add'>+#define NEWT_ANCHOR_TOP			(1 &lt;&lt; 2)</div><div class='add'>+#define NEWT_ANCHOR_BOTTOM		(1 &lt;&lt; 3)</div><div class='add'>+</div><div class='add'>+#define NEWT_GRID_FLAG_GROWX		(1 &lt;&lt; 0)</div><div class='add'>+#define NEWT_GRID_FLAG_GROWY		(1 &lt;&lt; 1)</div><div class='add'>+</div><div class='add'>+typedef struct grid_s * newtGrid;</div><div class='add'>+enum newtGridElement { NEWT_GRID_EMPTY = 0,</div><div class='add'>+		       NEWT_GRID_COMPONENT, NEWT_GRID_SUBGRID };</div><div class='add'>+</div><div class='add'>+newtGrid newtCreateGrid(int cols, int rows);</div><div class='add'>+/* TYPE, what, TYPE, what, ..., NULL */</div><div class='add'>+newtGrid newtGridVStacked(enum newtGridElement type, void * what, ...);</div><div class='add'>+newtGrid newtGridVCloseStacked(enum newtGridElement type, void * what, ...);</div><div class='add'>+newtGrid newtGridHStacked(enum newtGridElement type1, void * what1, ...);</div><div class='add'>+newtGrid newtGridHCloseStacked(enum newtGridElement type1, void * what1, ...);</div><div class='add'>+newtGrid newtGridBasicWindow(newtComponent text, newtGrid middle,</div><div class='add'>+			     newtGrid buttons);</div><div class='add'>+newtGrid newtGridSimpleWindow(newtComponent text, newtComponent middle,</div><div class='add'>+			     newtGrid buttons);</div><div class='add'>+void newtGridSetField(newtGrid grid, int col, int row, </div><div class='add'>+		      enum newtGridElement type, void * val, int padLeft,</div><div class='add'>+		      int padTop, int padRight, int padBottom, int anchor,</div><div class='add'>+		      int flags);</div><div class='add'>+void newtGridPlace(newtGrid grid, int left, int top);</div><div class='add'>+#define newtGridDestroy newtGridFree</div><div class='add'>+void newtGridFree(newtGrid grid, int recurse);</div><div class='add'>+void newtGridGetSize(newtGrid grid, int * width, int * height);</div><div class='add'>+void newtGridWrappedWindow(newtGrid grid, char * title);</div><div class='add'>+void newtGridWrappedWindowAt(newtGrid grid, char * title, int left, int top);</div><div class='add'>+void newtGridAddComponentsToForm(newtGrid grid, newtComponent form, </div><div class='add'>+				 int recurse);</div><div class='add'>+</div><div class='add'>+/* convienve */</div><div class='add'>+newtGrid newtButtonBarv(char * button1, newtComponent * b1comp, va_list args);</div><div class='add'>+newtGrid newtButtonBar(char * button1, newtComponent * b1comp, ...);</div><div class='add'>+</div><div class='add'>+/* automatically centered and shrink wrapped */</div><div class='add'>+void newtWinMessage(char * title, char * buttonText, char * text, ...);</div><div class='add'>+void newtWinMessagev(char * title, char * buttonText, char * text, </div><div class='add'>+		     va_list argv);</div><div class='add'>+</div><div class='add'>+/* having separate calls for these two seems silly, but having two separate</div><div class='add'>+   variable length-arg lists seems like a bad idea as well */</div><div class='add'>+</div><div class='add'>+/* Returns 0 if F12 was pressed, 1 for button1, 2 for button2 */</div><div class='add'>+int newtWinChoice(char * title, char * button1, char * button2, </div><div class='add'>+		   char * text, ...);</div><div class='add'>+/* Returns 0 if F12 was pressed, 1 for button1, 2 for button2, </div><div class='add'>+   3 for button3 */</div><div class='add'>+int newtWinTernary(char * title, char * button1, char * button2, </div><div class='add'>+		   char * button3, char * message, ...);</div><div class='add'>+</div><div class='add'>+/* Returns the button number pressed, 0 on F12 */</div><div class='add'>+int newtWinMenu(char * title, char * text, int suggestedWidth, int flexDown, </div><div class='add'>+		int flexUp, int maxListHeight, char ** items, int * listItem,</div><div class='add'>+		char * button1, ...);</div><div class='add'>+</div><div class='add'>+struct newtWinEntry {</div><div class='add'>+    char * text;</div><div class='add'>+    char ** value;		/* may be initialized to set default */</div><div class='add'>+    int flags;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Returns the button number pressed, 0 on F12. The final values are</div><div class='add'>+   dynamically allocated, and need to be freed. */</div><div class='add'>+int newtWinEntries(char * title, char * text, int suggestedWidth, int flexDown, </div><div class='add'>+		   int flexUp, int dataWidth, </div><div class='add'>+		   struct newtWinEntry * items, char * button1, ...);</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+} /* End of extern "C" { */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif /* H_NEWT */</div><div class='head'>diff --git a/mdk-stage1/newt/newt_pr.h b/mdk-stage1/newt/newt_pr.h<br/>new file mode 100644<br/>index 000000000..76f5e2f6f<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/newt_pr.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt_pr.h</a></div><div class='hunk'>@@ -0,0 +1,82 @@</div><div class='add'>+#ifndef H_NEWT_PR</div><div class='add'>+#define H_NEWT_PR</div><div class='add'>+</div><div class='add'>+#define COLORSET_ROOT 		NEWT_COLORSET_ROOT</div><div class='add'>+#define COLORSET_BORDER 	NEWT_COLORSET_BORDER</div><div class='add'>+#define COLORSET_WINDOW		NEWT_COLORSET_WINDOW</div><div class='add'>+#define COLORSET_SHADOW		NEWT_COLORSET_SHADOW</div><div class='add'>+#define COLORSET_TITLE		NEWT_COLORSET_TITLE</div><div class='add'>+#define COLORSET_BUTTON		NEWT_COLORSET_BUTTON</div><div class='add'>+#define COLORSET_ACTBUTTON	NEWT_COLORSET_ACTBUTTON</div><div class='add'>+#define COLORSET_CHECKBOX	NEWT_COLORSET_CHECKBOX</div><div class='add'>+#define COLORSET_ACTCHECKBOX	NEWT_COLORSET_ACTCHECKBOX</div><div class='add'>+#define COLORSET_ENTRY		NEWT_COLORSET_ENTRY</div><div class='add'>+#define COLORSET_LABEL		NEWT_COLORSET_LABEL</div><div class='add'>+#define COLORSET_LISTBOX	NEWT_COLORSET_LISTBOX</div><div class='add'>+#define COLORSET_ACTLISTBOX	NEWT_COLORSET_ACTLISTBOX</div><div class='add'>+#define COLORSET_TEXTBOX	NEWT_COLORSET_TEXTBOX</div><div class='add'>+#define COLORSET_ACTTEXTBOX	NEWT_COLORSET_ACTTEXTBOX</div><div class='add'>+</div><div class='add'>+int newtSetFlags(int oldFlags, int newFlags, enum newtFlagsSense sense);</div><div class='add'>+</div><div class='add'>+void newtGotorc(int row, int col);</div><div class='add'>+void newtGetrc(int * row, int * col);</div><div class='add'>+void newtGetWindowPos(int * x, int * y);</div><div class='add'>+void newtDrawBox(int left, int top, int width, int height, int shadow);</div><div class='add'>+void newtClearBox(int left, int top, int width, int height);</div><div class='add'>+</div><div class='add'>+int newtGetKey(void);</div><div class='add'>+</div><div class='add'>+struct newtComponent_struct {</div><div class='add'>+    /* common data */</div><div class='add'>+    int height, width;</div><div class='add'>+    int top, left;</div><div class='add'>+    int takesFocus;</div><div class='add'>+    int isMapped;</div><div class='add'>+</div><div class='add'>+    struct componentOps * ops;</div><div class='add'>+</div><div class='add'>+    newtCallback callback;</div><div class='add'>+    void * callbackData;</div><div class='add'>+</div><div class='add'>+    void * data;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+enum eventResultTypes { ER_IGNORED, ER_SWALLOWED, ER_EXITFORM, ER_SETFOCUS,</div><div class='add'>+			ER_NEXTCOMP };</div><div class='add'>+struct eventResult {</div><div class='add'>+    enum eventResultTypes result;</div><div class='add'>+    union {</div><div class='add'>+	newtComponent focus;</div><div class='add'>+    } u;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+enum eventTypes { EV_FOCUS, EV_UNFOCUS, EV_KEYPRESS, EV_MOUSE };</div><div class='add'>+enum eventSequence { EV_EARLY, EV_NORMAL, EV_LATE };</div><div class='add'>+</div><div class='add'>+struct event {</div><div class='add'>+    enum eventTypes event;</div><div class='add'>+    enum eventSequence when;</div><div class='add'>+    union {</div><div class='add'>+	int key;</div><div class='add'>+	struct {</div><div class='add'>+	    enum { MOUSE_MOTION, MOUSE_BUTTON_DOWN, MOUSE_BUTTON_UP } type;</div><div class='add'>+	    int x, y;</div><div class='add'>+	} mouse;</div><div class='add'>+    } u;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+struct componentOps {</div><div class='add'>+    void (* draw)(newtComponent c);</div><div class='add'>+    struct eventResult (* event)(newtComponent c, struct event ev);</div><div class='add'>+    void (* destroy)(newtComponent c);</div><div class='add'>+    void (* place)(newtComponent c, int newLeft, int newTop);</div><div class='add'>+    void (* mapped)(newtComponent c, int isMapped);</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+void newtDefaultPlaceHandler(newtComponent c, int newLeft, int newTop);</div><div class='add'>+void newtDefaultMappedHandler(newtComponent c, int isMapped);</div><div class='add'>+struct eventResult newtDefaultEventHandler(newtComponent c,</div><div class='add'>+					   struct event ev);</div><div class='add'>+</div><div class='add'>+#endif /* H_NEWT_PR */</div><div class='head'>diff --git a/mdk-stage1/newt/scale.c b/mdk-stage1/newt/scale.c<br/>new file mode 100644<br/>index 000000000..800958580<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/scale.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/scale.c</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#include &lt;slang.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct scale {</div><div class='add'>+    int fullValue;</div><div class='add'>+    int charsSet;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void scaleDraw(newtComponent co);</div><div class='add'>+</div><div class='add'>+static struct componentOps scaleOps = {</div><div class='add'>+    scaleDraw,</div><div class='add'>+    newtDefaultEventHandler,</div><div class='add'>+    NULL,</div><div class='add'>+    newtDefaultPlaceHandler,</div><div class='add'>+    newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+newtComponent newtScale(int left, int top, int width, int fullValue) {</div><div class='add'>+    newtComponent co;</div><div class='add'>+    struct scale * sc;</div><div class='add'>+</div><div class='add'>+    co = malloc(sizeof(*co));</div><div class='add'>+    sc = malloc(sizeof(struct scale));</div><div class='add'>+    co-&gt;data = sc;</div><div class='add'>+</div><div class='add'>+    co-&gt;ops = &amp;scaleOps;</div><div class='add'>+</div><div class='add'>+    co-&gt;height = 1;</div><div class='add'>+    co-&gt;width = width;</div><div class='add'>+    co-&gt;top = top;</div><div class='add'>+    co-&gt;left = left;</div><div class='add'>+    co-&gt;takesFocus = 0;</div><div class='add'>+</div><div class='add'>+    sc-&gt;fullValue = fullValue;</div><div class='add'>+    sc-&gt;charsSet = 0;</div><div class='add'>+</div><div class='add'>+    return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtScaleSet(newtComponent co, unsigned int amount) {</div><div class='add'>+    struct scale * sc = co-&gt;data;</div><div class='add'>+    int newCharsSet;</div><div class='add'>+</div><div class='add'>+    newCharsSet = (amount * co-&gt;width) / sc-&gt;fullValue;</div><div class='add'>+    </div><div class='add'>+    if (newCharsSet != sc-&gt;charsSet) {</div><div class='add'>+	sc-&gt;charsSet = newCharsSet;</div><div class='add'>+	scaleDraw(co);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void scaleDraw(newtComponent co) {</div><div class='add'>+    struct scale * sc = co-&gt;data;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    if (co-&gt;top == -1) return;</div><div class='add'>+</div><div class='add'>+    newtGotorc(co-&gt;top, co-&gt;left);</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(NEWT_COLORSET_FULLSCALE);</div><div class='add'>+    for (i = 0; i &lt; sc-&gt;charsSet; i++)</div><div class='add'>+	SLsmg_write_string(" ");</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(NEWT_COLORSET_EMPTYSCALE);</div><div class='add'>+    for (i = 0; i &lt; (co-&gt;width - sc-&gt;charsSet); i++)</div><div class='add'>+	SLsmg_write_string(" ");</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/scrollbar.c b/mdk-stage1/newt/scrollbar.c<br/>new file mode 100644<br/>index 000000000..cb4bc2757<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/scrollbar.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/scrollbar.c</a></div><div class='hunk'>@@ -0,0 +1,124 @@</div><div class='add'>+#include &lt;slang.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct scrollbar {</div><div class='add'>+    int curr;</div><div class='add'>+    int cs, csThumb;</div><div class='add'>+    int arrows;</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+static void sbDraw(newtComponent co);</div><div class='add'>+static void sbDestroy(newtComponent co);</div><div class='add'>+static void sbDrawThumb(newtComponent co, int isOn);</div><div class='add'>+</div><div class='add'>+static struct componentOps sbOps = {</div><div class='add'>+    sbDraw,</div><div class='add'>+    newtDefaultEventHandler,</div><div class='add'>+    sbDestroy,</div><div class='add'>+    newtDefaultPlaceHandler,</div><div class='add'>+    newtDefaultMappedHandler,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+void newtScrollbarSet(newtComponent co, int where, int total) {</div><div class='add'>+    struct scrollbar * sb = co-&gt;data;</div><div class='add'>+    int new;</div><div class='add'>+</div><div class='add'>+    if (sb-&gt;arrows)</div><div class='add'>+	new = (where * (co-&gt;height - 3)) / (total ? total : 1) + 1;</div><div class='add'>+    else</div><div class='add'>+	new = (where * (co-&gt;height - 1)) / (total ? total : 1);</div><div class='add'>+    if (new != sb-&gt;curr) {</div><div class='add'>+	sbDrawThumb(co, 0);</div><div class='add'>+	sb-&gt;curr = new;</div><div class='add'>+	sbDrawThumb(co, 1);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtVerticalScrollbar(int left, int top, int height,</div><div class='add'>+				    int normalColorset, int thumbColorset) {</div><div class='add'>+    newtComponent co;</div><div class='add'>+    struct scrollbar * sb;</div><div class='add'>+</div><div class='add'>+    co = malloc(sizeof(*co));</div><div class='add'>+    sb = malloc(sizeof(*sb));</div><div class='add'>+    co-&gt;data = sb;</div><div class='add'>+</div><div class='add'>+    if (!strcmp(getenv("TERM"), "linux") &amp;&amp; height &gt;= 2) {</div><div class='add'>+	sb-&gt;arrows = 1;</div><div class='add'>+	sb-&gt;curr = 1;</div><div class='add'>+    } else {</div><div class='add'>+	sb-&gt;arrows = 0;</div><div class='add'>+	sb-&gt;curr = 0;</div><div class='add'>+    }</div><div class='add'>+    sb-&gt;cs = normalColorset;</div><div class='add'>+    sb-&gt;csThumb = thumbColorset;</div><div class='add'>+</div><div class='add'>+    co-&gt;ops = &amp;sbOps;</div><div class='add'>+    co-&gt;isMapped = 0;</div><div class='add'>+    co-&gt;left = left;</div><div class='add'>+    co-&gt;top = top;</div><div class='add'>+    co-&gt;height = height;</div><div class='add'>+    co-&gt;width = 1;</div><div class='add'>+    co-&gt;takesFocus = 0;  </div><div class='add'>+    </div><div class='add'>+    return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sbDraw(newtComponent co) {</div><div class='add'>+    struct scrollbar * sb = co-&gt;data;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    if (!co-&gt;isMapped) return;</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(sb-&gt;cs);</div><div class='add'>+</div><div class='add'>+    SLsmg_set_char_set(1);</div><div class='add'>+    if (sb-&gt;arrows) {</div><div class='add'>+	newtGotorc(co-&gt;top, co-&gt;left);</div><div class='add'>+ 	SLsmg_write_char('\x2d');</div><div class='add'>+	for (i = 1; i &lt; co-&gt;height - 1; i++) {</div><div class='add'>+	    newtGotorc(i + co-&gt;top, co-&gt;left);</div><div class='add'>+	    SLsmg_write_char('\x61');</div><div class='add'>+	}</div><div class='add'>+	newtGotorc(co-&gt;top + co-&gt;height - 1, co-&gt;left);</div><div class='add'>+ 	SLsmg_write_char('\x2e');</div><div class='add'>+    } else {</div><div class='add'>+	for (i = 0; i &lt; co-&gt;height; i++) {</div><div class='add'>+	    newtGotorc(i + co-&gt;top, co-&gt;left);</div><div class='add'>+	    SLsmg_write_char('\x61');</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SLsmg_set_char_set(0);</div><div class='add'>+</div><div class='add'>+    sbDrawThumb(co, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sbDrawThumb(newtComponent co, int isOn) {</div><div class='add'>+    struct scrollbar * sb = co-&gt;data;</div><div class='add'>+    char ch = isOn ? '#' : '\x61';</div><div class='add'>+</div><div class='add'>+    if (!co-&gt;isMapped) return;</div><div class='add'>+</div><div class='add'>+    newtGotorc(sb-&gt;curr + co-&gt;top, co-&gt;left);</div><div class='add'>+    SLsmg_set_char_set(1);</div><div class='add'>+</div><div class='add'>+    /*if (isOn)</div><div class='add'>+	SLsmg_set_color(sb-&gt;csThumb);</div><div class='add'>+    else*/</div><div class='add'>+	SLsmg_set_color(sb-&gt;cs);</div><div class='add'>+</div><div class='add'>+    SLsmg_write_char(ch);</div><div class='add'>+    SLsmg_set_char_set(0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sbDestroy(newtComponent co) {</div><div class='add'>+    struct scrollbar * sb = co-&gt;data;</div><div class='add'>+ </div><div class='add'>+    free(sb);</div><div class='add'>+    free(co);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/textbox.c b/mdk-stage1/newt/textbox.c<br/>new file mode 100644<br/>index 000000000..272c9b675<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/textbox.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/textbox.c</a></div><div class='hunk'>@@ -0,0 +1,409 @@</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+#include &lt;slang.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "newt.h"</div><div class='add'>+#include "newt_pr.h"</div><div class='add'>+</div><div class='add'>+struct textbox {</div><div class='add'>+    char ** lines;</div><div class='add'>+    int numLines;</div><div class='add'>+    int linesAlloced;</div><div class='add'>+    int doWrap;</div><div class='add'>+    newtComponent sb;</div><div class='add'>+    int topLine;</div><div class='add'>+    int textWidth;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static char * expandTabs(const char * text);</div><div class='add'>+static void textboxDraw(newtComponent co);</div><div class='add'>+static void addLine(newtComponent co, const char * s, int len);</div><div class='add'>+static void doReflow(const char * text, char ** resultPtr, int width, </div><div class='add'>+		     int * badness, int * heightPtr);</div><div class='add'>+static struct eventResult textboxEvent(newtComponent c,</div><div class='add'>+				      struct event ev);</div><div class='add'>+static void textboxDestroy(newtComponent co);</div><div class='add'>+static void textboxPlace(newtComponent co, int newLeft, int newTop);</div><div class='add'>+static void textboxMapped(newtComponent co, int isMapped);</div><div class='add'>+</div><div class='add'>+static struct componentOps textboxOps = {</div><div class='add'>+    textboxDraw,</div><div class='add'>+    textboxEvent,</div><div class='add'>+    textboxDestroy,</div><div class='add'>+    textboxPlace,</div><div class='add'>+    textboxMapped,</div><div class='add'>+} ;</div><div class='add'>+</div><div class='add'>+static void textboxMapped(newtComponent co, int isMapped) {</div><div class='add'>+    struct textbox * tb = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    co-&gt;isMapped = isMapped;</div><div class='add'>+    if (tb-&gt;sb)</div><div class='add'>+	tb-&gt;sb-&gt;ops-&gt;mapped(tb-&gt;sb, isMapped);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void textboxPlace(newtComponent co, int newLeft, int newTop) {</div><div class='add'>+    struct textbox * tb = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    co-&gt;top = newTop;</div><div class='add'>+    co-&gt;left = newLeft;</div><div class='add'>+</div><div class='add'>+    if (tb-&gt;sb)</div><div class='add'>+	tb-&gt;sb-&gt;ops-&gt;place(tb-&gt;sb, co-&gt;left + co-&gt;width - 1, co-&gt;top);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtTextboxSetHeight(newtComponent co, int height) {</div><div class='add'>+    co-&gt;height = height;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtTextboxGetNumLines(newtComponent co) {</div><div class='add'>+    struct textbox * tb = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    return (tb-&gt;numLines);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtTextboxReflowed(int left, int top, char * text, int width,</div><div class='add'>+				  int flexDown, int flexUp, int flags) {</div><div class='add'>+    newtComponent co;</div><div class='add'>+    char * reflowedText;</div><div class='add'>+    int actWidth, actHeight;</div><div class='add'>+</div><div class='add'>+    reflowedText = newtReflowText(text, width, flexDown, flexUp,</div><div class='add'>+				  &amp;actWidth, &amp;actHeight);</div><div class='add'>+    </div><div class='add'>+    co = newtTextbox(left, top, actWidth, actHeight, NEWT_FLAG_WRAP);</div><div class='add'>+    newtTextboxSetText(co, reflowedText);</div><div class='add'>+    free(reflowedText);</div><div class='add'>+</div><div class='add'>+    return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+newtComponent newtTextbox(int left, int top, int width, int height, int flags) {</div><div class='add'>+    newtComponent co;</div><div class='add'>+    struct textbox * tb;</div><div class='add'>+</div><div class='add'>+    co = malloc(sizeof(*co));</div><div class='add'>+    tb = malloc(sizeof(*tb));</div><div class='add'>+    co-&gt;data = tb;</div><div class='add'>+</div><div class='add'>+    co-&gt;ops = &amp;textboxOps;</div><div class='add'>+</div><div class='add'>+    co-&gt;height = height;</div><div class='add'>+    co-&gt;top = top;</div><div class='add'>+    co-&gt;left = left;</div><div class='add'>+    co-&gt;takesFocus = 0;</div><div class='add'>+    co-&gt;width = width;</div><div class='add'>+</div><div class='add'>+    tb-&gt;doWrap = flags &amp; NEWT_FLAG_WRAP;</div><div class='add'>+    tb-&gt;numLines = 0;</div><div class='add'>+    tb-&gt;linesAlloced = 0;</div><div class='add'>+    tb-&gt;lines = NULL;</div><div class='add'>+    tb-&gt;topLine = 0;</div><div class='add'>+    tb-&gt;textWidth = width;</div><div class='add'>+</div><div class='add'>+    if (flags &amp; NEWT_FLAG_SCROLL) {</div><div class='add'>+	co-&gt;width += 2;</div><div class='add'>+	tb-&gt;sb = newtVerticalScrollbar(co-&gt;left + co-&gt;width - 1, co-&gt;top, </div><div class='add'>+			   co-&gt;height, COLORSET_TEXTBOX, COLORSET_TEXTBOX);</div><div class='add'>+    } else {</div><div class='add'>+	tb-&gt;sb = NULL;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    return co;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char * expandTabs(const char * text) {</div><div class='add'>+    int bufAlloced = strlen(text) + 40;</div><div class='add'>+    char * buf, * dest;</div><div class='add'>+    const char * src;</div><div class='add'>+    int bufUsed = 0;</div><div class='add'>+    int linePos = 0;</div><div class='add'>+    int i;</div><div class='add'>+</div><div class='add'>+    buf = malloc(bufAlloced + 1);</div><div class='add'>+    for (src = text, dest = buf; *src; src++) {</div><div class='add'>+	if ((bufUsed + 10) &gt; bufAlloced) {</div><div class='add'>+	    bufAlloced += strlen(text) / 2;</div><div class='add'>+	    buf = realloc(buf, bufAlloced + 1);</div><div class='add'>+	    dest = buf + bufUsed;</div><div class='add'>+	}</div><div class='add'>+	if (*src == '\t') {</div><div class='add'>+	    i = 8 - (linePos &amp; 8);</div><div class='add'>+	    memset(dest, ' ', i);</div><div class='add'>+	    dest += i, bufUsed += i, linePos += i;</div><div class='add'>+	} else {</div><div class='add'>+	    if (*src == '\n')</div><div class='add'>+		linePos = 0;</div><div class='add'>+	    else</div><div class='add'>+		linePos++;</div><div class='add'>+</div><div class='add'>+	    *dest++ = *src;</div><div class='add'>+	    bufUsed++;</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    *dest = '\0';</div><div class='add'>+    return buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define iseuckanji(c)   (0xa1 &lt;= (unsigned char)(c&amp;0xff) &amp;&amp; (unsigned char)(c&amp;0xff) &lt;= 0xfe)</div><div class='add'>+</div><div class='add'>+static void doReflow(const char * text, char ** resultPtr, int width, </div><div class='add'>+		     int * badness, int * heightPtr) {</div><div class='add'>+    char * result = NULL;</div><div class='add'>+    const char * chptr, * end;</div><div class='add'>+    int i;</div><div class='add'>+    int howbad = 0;</div><div class='add'>+    int height = 0;</div><div class='add'>+    int kanji = 0;</div><div class='add'>+</div><div class='add'>+    if (resultPtr) {</div><div class='add'>+	/* XXX I think this will work */</div><div class='add'>+	result = malloc(strlen(text) + (strlen(text) / width) + 50);</div><div class='add'>+	*result = '\0';</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    while (*text) {</div><div class='add'>+        kanji = 0;</div><div class='add'>+	end = strchr(text, '\n');</div><div class='add'>+	if (!end)</div><div class='add'>+	    end = text + strlen(text);</div><div class='add'>+</div><div class='add'>+	while (*text &amp;&amp; text &lt; end) {</div><div class='add'>+	    if (end - text &lt; width) {</div><div class='add'>+		if (result) {</div><div class='add'>+		    strncat(result, text, end - text + 1);</div><div class='add'>+		    strcat(result, "\n");</div><div class='add'>+		    height++;</div><div class='add'>+		}</div><div class='add'>+</div><div class='add'>+		if (end - text &lt; (width / 2))</div><div class='add'>+		    howbad += ((width / 2) - (end - text)) / 2;</div><div class='add'>+		text = end;</div><div class='add'>+		if (*text) text++;</div><div class='add'>+	    } else {</div><div class='add'>+	        chptr = text;</div><div class='add'>+	        kanji = 0;</div><div class='add'>+	        for ( i = 0; i &lt; width - 1; i++ ) {</div><div class='add'>+		    if ( !iseuckanji(*chptr)) {</div><div class='add'>+			kanji = 0;</div><div class='add'>+		    } else if ( kanji == 1 ) {</div><div class='add'>+		        kanji = 2; </div><div class='add'>+		    } else {</div><div class='add'>+		        kanji = 1;</div><div class='add'>+		    }</div><div class='add'>+		    chptr++;</div><div class='add'>+		}</div><div class='add'>+	        if (kanji == 0) {</div><div class='add'>+		    while (chptr &gt; text &amp;&amp; !isspace(*chptr)) chptr--;</div><div class='add'>+		    while (chptr &gt; text &amp;&amp; isspace(*chptr)) chptr--;</div><div class='add'>+		    chptr++;</div><div class='add'>+		}</div><div class='add'>+		</div><div class='add'>+		if (chptr-text == 1 &amp;&amp; !isspace(*chptr))</div><div class='add'>+		  chptr = text + width - 1;</div><div class='add'>+</div><div class='add'>+		if (chptr &gt; text)</div><div class='add'>+		    howbad += width - (chptr - text) + 1;</div><div class='add'>+		if (result) {</div><div class='add'>+		  if (kanji == 1) {</div><div class='add'>+		    strncat(result, text, chptr - text + 1);</div><div class='add'>+		    chptr++;</div><div class='add'>+		    kanji = 0;</div><div class='add'>+		  } else {</div><div class='add'>+		    strncat(result, text, chptr - text + 1);</div><div class='add'>+		  }</div><div class='add'>+		    strcat(result, "\n");</div><div class='add'>+		    height++;</div><div class='add'>+		}</div><div class='add'>+</div><div class='add'>+	        if (isspace(*chptr))</div><div class='add'>+		    text = chptr + 1;</div><div class='add'>+		else</div><div class='add'>+		  text = chptr;</div><div class='add'>+		while (isspace(*text)) text++;</div><div class='add'>+	    }</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+//    if (result) printf("result: %s\n", result);</div><div class='add'>+</div><div class='add'>+    if (badness) *badness = howbad;</div><div class='add'>+    if (resultPtr) *resultPtr = result;</div><div class='add'>+    if (heightPtr) *heightPtr = height;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char * newtReflowText(char * text, int width, int flexDown, int flexUp,</div><div class='add'>+		      int * actualWidth, int * actualHeight) {</div><div class='add'>+    int min, max;</div><div class='add'>+    int i;</div><div class='add'>+    char * result;</div><div class='add'>+    int minbad, minbadwidth, howbad;</div><div class='add'>+    char * expandedText;</div><div class='add'>+</div><div class='add'>+    expandedText = expandTabs(text);</div><div class='add'>+</div><div class='add'>+    if (flexDown || flexUp) {</div><div class='add'>+	min = width - flexDown;</div><div class='add'>+	max = width + flexUp;</div><div class='add'>+</div><div class='add'>+	minbad = -1;</div><div class='add'>+	minbadwidth = width;</div><div class='add'>+</div><div class='add'>+	for (i = min; i &lt;= max; i++) {</div><div class='add'>+	    doReflow(expandedText, NULL, i, &amp;howbad, NULL);</div><div class='add'>+</div><div class='add'>+	    if (minbad == -1 || howbad &lt; minbad) {</div><div class='add'>+		minbad = howbad;</div><div class='add'>+		minbadwidth = i;</div><div class='add'>+	    }</div><div class='add'>+ 	}</div><div class='add'>+</div><div class='add'>+	width = minbadwidth;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    doReflow(expandedText, &amp;result, width, NULL, actualHeight);</div><div class='add'>+    free(expandedText);</div><div class='add'>+    if (actualWidth) *actualWidth = width;</div><div class='add'>+    return result;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtTextboxSetText(newtComponent co, const char * text) {</div><div class='add'>+    const char * start, * end;</div><div class='add'>+    struct textbox * tb = co-&gt;data;</div><div class='add'>+    char * reflowed, * expanded;</div><div class='add'>+    int badness, height;</div><div class='add'>+</div><div class='add'>+    if (tb-&gt;lines) {</div><div class='add'>+	free(tb-&gt;lines);</div><div class='add'>+	tb-&gt;linesAlloced = tb-&gt;numLines = 0;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    expanded = expandTabs(text);</div><div class='add'>+</div><div class='add'>+    if (tb-&gt;doWrap) {</div><div class='add'>+	doReflow(expanded, &amp;reflowed, tb-&gt;textWidth, &amp;badness, &amp;height);</div><div class='add'>+	free(expanded);</div><div class='add'>+	expanded = reflowed;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    for (start = expanded; *start; start++)</div><div class='add'>+	if (*start == '\n') tb-&gt;linesAlloced++;</div><div class='add'>+</div><div class='add'>+    /* This ++ leaves room for an ending line w/o a \n */</div><div class='add'>+    tb-&gt;linesAlloced++;</div><div class='add'>+    tb-&gt;lines = malloc(sizeof(char *) * tb-&gt;linesAlloced);</div><div class='add'>+</div><div class='add'>+    start = expanded;</div><div class='add'>+    while ((end = strchr(start, '\n'))) {</div><div class='add'>+	addLine(co, start, end - start);</div><div class='add'>+	start = end + 1;</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    if (*start)</div><div class='add'>+	addLine(co, start, strlen(start));</div><div class='add'>+</div><div class='add'>+    free(expanded);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This assumes the buffer is allocated properly! */</div><div class='add'>+static void addLine(newtComponent co, const char * s, int len) {</div><div class='add'>+    struct textbox * tb = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    if (len &gt; tb-&gt;textWidth) len = tb-&gt;textWidth;</div><div class='add'>+</div><div class='add'>+    tb-&gt;lines[tb-&gt;numLines] = malloc(tb-&gt;textWidth + 1);</div><div class='add'>+    memset(tb-&gt;lines[tb-&gt;numLines], ' ', tb-&gt;textWidth); </div><div class='add'>+    memcpy(tb-&gt;lines[tb-&gt;numLines], s, len);</div><div class='add'>+    tb-&gt;lines[tb-&gt;numLines++][tb-&gt;textWidth] = '\0';</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void textboxDraw(newtComponent c) {</div><div class='add'>+    int i;</div><div class='add'>+    struct textbox * tb = c-&gt;data;</div><div class='add'>+    int size;</div><div class='add'>+</div><div class='add'>+    if (tb-&gt;sb) {</div><div class='add'>+	size = tb-&gt;numLines - c-&gt;height;</div><div class='add'>+	newtScrollbarSet(tb-&gt;sb, tb-&gt;topLine, size ? size : 0);</div><div class='add'>+	tb-&gt;sb-&gt;ops-&gt;draw(tb-&gt;sb);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    SLsmg_set_color(NEWT_COLORSET_TEXTBOX);</div><div class='add'>+   </div><div class='add'>+    for (i = 0; (i + tb-&gt;topLine) &lt; tb-&gt;numLines &amp;&amp; i &lt; c-&gt;height; i++) {</div><div class='add'>+	newtGotorc(c-&gt;top + i, c-&gt;left);</div><div class='add'>+	SLsmg_write_string(tb-&gt;lines[i + tb-&gt;topLine]);</div><div class='add'>+    }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct eventResult textboxEvent(newtComponent co, </div><div class='add'>+				      struct event ev) {</div><div class='add'>+    struct textbox * tb = co-&gt;data;</div><div class='add'>+    struct eventResult er;</div><div class='add'>+</div><div class='add'>+    er.result = ER_IGNORED;</div><div class='add'>+</div><div class='add'>+    if (ev.when == EV_EARLY &amp;&amp; ev.event == EV_KEYPRESS &amp;&amp; tb-&gt;sb) {</div><div class='add'>+	switch (ev.u.key) {</div><div class='add'>+	  case NEWT_KEY_UP:</div><div class='add'>+	    if (tb-&gt;topLine) tb-&gt;topLine--;</div><div class='add'>+	    textboxDraw(co);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case NEWT_KEY_DOWN:</div><div class='add'>+	    if (tb-&gt;topLine &lt; (tb-&gt;numLines - co-&gt;height)) tb-&gt;topLine++;</div><div class='add'>+	    textboxDraw(co);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case NEWT_KEY_PGDN:</div><div class='add'>+	    tb-&gt;topLine += co-&gt;height;</div><div class='add'>+	    if (tb-&gt;topLine &gt; (tb-&gt;numLines - co-&gt;height)) {</div><div class='add'>+		tb-&gt;topLine = tb-&gt;numLines - co-&gt;height;</div><div class='add'>+		if (tb-&gt;topLine &lt; 0) tb-&gt;topLine = 0;</div><div class='add'>+	    }</div><div class='add'>+	    textboxDraw(co);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+</div><div class='add'>+	  case NEWT_KEY_PGUP:</div><div class='add'>+	    tb-&gt;topLine -= co-&gt;height;</div><div class='add'>+	    if (tb-&gt;topLine &lt; 0) tb-&gt;topLine = 0;</div><div class='add'>+	    textboxDraw(co);</div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	    break;</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+    if (ev.when == EV_EARLY &amp;&amp; ev.event == EV_MOUSE &amp;&amp; tb-&gt;sb) {</div><div class='add'>+	/* Top scroll arrow */</div><div class='add'>+	if (ev.u.mouse.x == co-&gt;width &amp;&amp; ev.u.mouse.y == co-&gt;top) {</div><div class='add'>+	    if (tb-&gt;topLine) tb-&gt;topLine--;</div><div class='add'>+	    textboxDraw(co);</div><div class='add'>+	    </div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	}</div><div class='add'>+	/* Bottom scroll arrow */</div><div class='add'>+	if (ev.u.mouse.x == co-&gt;width &amp;&amp;</div><div class='add'>+	    ev.u.mouse.y == co-&gt;top + co-&gt;height - 1) {</div><div class='add'>+	    if (tb-&gt;topLine &lt; (tb-&gt;numLines - co-&gt;height)) tb-&gt;topLine++;</div><div class='add'>+	    textboxDraw(co);</div><div class='add'>+	    </div><div class='add'>+	    er.result = ER_SWALLOWED;</div><div class='add'>+	}</div><div class='add'>+    }</div><div class='add'>+    return er;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void textboxDestroy(newtComponent co) {</div><div class='add'>+    int i;</div><div class='add'>+    struct textbox * tb = co-&gt;data;</div><div class='add'>+</div><div class='add'>+    for (i = 0; i &lt; tb-&gt;numLines; i++) </div><div class='add'>+	free(tb-&gt;lines[i]);</div><div class='add'>+    free(tb-&gt;lines);</div><div class='add'>+    free(tb);</div><div class='add'>+    free(co);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/newt/windows.c b/mdk-stage1/newt/windows.c<br/>new file mode 100644<br/>index 000000000..792d3ed76<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/newt/windows.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/windows.c</a></div><div class='hunk'>@@ -0,0 +1,275 @@</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdlib.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "errno.h"</div><div class='add'>+#include "newt.h"</div><div class='add'>+</div><div class='add'>+static void * newtvwindow(char * title, char * button1, char * button2, </div><div class='add'>+		       char * button3, char * message, va_list args) {</div><div class='add'>+    newtComponent b1, b2 = NULL, b3 = NULL, t, f, answer;</div><div class='add'>+    char * buf = NULL;</div><div class='add'>+    int size = 0;</div><div class='add'>+    int i = 0;</div><div class='add'>+    int scroll = 0;</div><div class='add'>+    int width, height;</div><div class='add'>+    char * flowedText;</div><div class='add'>+    newtGrid grid, buttonGrid;</div><div class='add'>+</div><div class='add'>+    do {</div><div class='add'>+	size += 1000;</div><div class='add'>+	if (buf) free(buf);</div><div class='add'>+	buf = malloc(size);</div><div class='add'>+	i = vsnprintf(buf, size, message, args);</div><div class='add'>+    } while (i &gt;= size || i == -1);</div><div class='add'>+</div><div class='add'>+    flowedText = newtReflowText(buf, 35, 5, 5, &amp;width, &amp;height);</div><div class='add'>+    if (height &gt; 6) {</div><div class='add'>+	free(flowedText);</div><div class='add'>+	flowedText = newtReflowText(buf, 60, 5, 5, &amp;width, &amp;height);</div><div class='add'>+    }</div><div class='add'>+    free(buf);</div><div class='add'>+</div><div class='add'>+    if (height &gt; 12) {</div><div class='add'>+	height = 12;</div><div class='add'>+	scroll = NEWT_FLAG_SCROLL;</div><div class='add'>+    }</div><div class='add'>+    t = newtTextbox(-1, -1, width, height, NEWT_TEXTBOX_WRAP | scroll);</div><div class='add'>+    newtTextboxSetText(t, flowedText);</div><div class='add'>+    free(flowedText);</div><div class='add'>+</div><div class='add'>+    if (button3) {</div><div class='add'>+	buttonGrid = newtButtonBar(button1, &amp;b1, button2, &amp;b2, </div><div class='add'>+				   button3, &amp;b3, NULL);</div><div class='add'>+    } else if (button2) {</div><div class='add'>+	buttonGrid = newtButtonBar(button1, &amp;b1, button2, &amp;b2, NULL);</div><div class='add'>+    } else {</div><div class='add'>+	buttonGrid = newtButtonBar(button1, &amp;b1, NULL);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newtGridSetField(buttonGrid, 0, 0, NEWT_GRID_COMPONENT, b1, </div><div class='add'>+		     0, 0, button2 ? 1 : 0, 0, 0, 0);</div><div class='add'>+</div><div class='add'>+    grid = newtCreateGrid(1, 2);</div><div class='add'>+    newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, t, 0, 0, 0, 0, 0, 0);</div><div class='add'>+    newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, buttonGrid, </div><div class='add'>+		     0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX);</div><div class='add'>+    newtGridWrappedWindow(grid, title);</div><div class='add'>+</div><div class='add'>+    f = newtForm(NULL, NULL, 0);</div><div class='add'>+    newtFormAddComponents(f, t, b1, NULL);</div><div class='add'>+</div><div class='add'>+    if (button2)</div><div class='add'>+	newtFormAddComponent(f, b2);</div><div class='add'>+    if (button3)</div><div class='add'>+	newtFormAddComponent(f, b3);</div><div class='add'>+</div><div class='add'>+    answer = newtRunForm(f);</div><div class='add'>+    newtGridFree(grid, 1);</div><div class='add'>+ </div><div class='add'>+    newtFormDestroy(f);</div><div class='add'>+    newtPopWindow();</div><div class='add'>+</div><div class='add'>+    if (answer == f)</div><div class='add'>+	return NULL;</div><div class='add'>+    else if (answer == b1)</div><div class='add'>+	return button1;</div><div class='add'>+    else if (answer == b2)</div><div class='add'>+	return button2;</div><div class='add'>+</div><div class='add'>+    return button3;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtWinChoice(char * title, char * button1, char * button2, </div><div class='add'>+		   char * message, ...) {</div><div class='add'>+    va_list args;</div><div class='add'>+    void * rc;</div><div class='add'>+</div><div class='add'>+    va_start(args, message);</div><div class='add'>+    rc = newtvwindow(title, button1, button2, NULL, message, args);</div><div class='add'>+    va_end(args);</div><div class='add'>+</div><div class='add'>+    if (rc == button1)</div><div class='add'>+	return 1;</div><div class='add'>+    else if (rc == button2)</div><div class='add'>+	return 2;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtWinMessage(char * title, char * buttonText, char * text, ...) {</div><div class='add'>+    va_list args;</div><div class='add'>+</div><div class='add'>+    va_start(args, text);</div><div class='add'>+    newtvwindow(title, buttonText, NULL, NULL, text, args);</div><div class='add'>+    va_end(args);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtWinMessagev(char * title, char * buttonText, char * text, </div><div class='add'>+		     va_list argv) {</div><div class='add'>+    newtvwindow(title, buttonText, NULL, NULL, text, argv);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int newtWinTernary(char * title, char * button1, char * button2, </div><div class='add'>+		   char * button3, char * message, ...) {</div><div class='add'>+    va_list args;</div><div class='add'>+    void * rc;</div><div class='add'>+</div><div class='add'>+    va_start(args, message);</div><div class='add'>+    rc = newtvwindow(title, button1, button2, button3, message, args);</div><div class='add'>+    va_end(args);</div><div class='add'>+</div><div class='add'>+    if (rc == button1)</div><div class='add'>+	return 1;</div><div class='add'>+    else if (rc == button2)</div><div class='add'>+	return 2;</div><div class='add'>+    else if (rc == button3)</div><div class='add'>+	return 3;</div><div class='add'>+</div><div class='add'>+    return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* only supports up to 50 buttons -- shucks! */</div><div class='add'>+int newtWinMenu(char * title, char * text, int suggestedWidth, int flexDown, </div><div class='add'>+		int flexUp, int maxListHeight, char ** items, int * listItem,</div><div class='add'>+		char * button1, ...) {</div><div class='add'>+    newtComponent textbox, listbox, result, form;</div><div class='add'>+    va_list args;</div><div class='add'>+    newtComponent buttons[50];</div><div class='add'>+    newtGrid grid, buttonBar;</div><div class='add'>+    int numButtons;</div><div class='add'>+    int i, rc;</div><div class='add'>+    int needScroll;</div><div class='add'>+    char * buttonName;</div><div class='add'>+</div><div class='add'>+    textbox = newtTextboxReflowed(-1, -1, text, suggestedWidth, flexDown,</div><div class='add'>+			          flexUp, 0);</div><div class='add'>+</div><div class='add'>+    for (i = 0; items[i]; i++) ;</div><div class='add'>+    if (i &lt; maxListHeight) maxListHeight = i;</div><div class='add'>+    needScroll = i &gt; maxListHeight;</div><div class='add'>+</div><div class='add'>+    listbox = newtListbox(-1, -1, maxListHeight, </div><div class='add'>+		  (needScroll ? NEWT_FLAG_SCROLL : 0) | NEWT_FLAG_RETURNEXIT);</div><div class='add'>+    for (i = 0; items[i]; i++) {</div><div class='add'>+	newtListboxAddEntry(listbox, items[i], (void *) i);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    newtListboxSetCurrent(listbox, *listItem);</div><div class='add'>+</div><div class='add'>+    buttonName = button1, numButtons = 0;</div><div class='add'>+    va_start(args, button1);</div><div class='add'>+    while (buttonName) {</div><div class='add'>+	buttons[numButtons] = newtButton(-1, -1, buttonName);</div><div class='add'>+	numButtons++;</div><div class='add'>+	buttonName = va_arg(args, char *);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    va_end(args);</div><div class='add'>+</div><div class='add'>+    buttonBar = newtCreateGrid(numButtons, 1);</div><div class='add'>+    for (i = 0; i &lt; numButtons; i++) {</div><div class='add'>+	newtGridSetField(buttonBar, i, 0, NEWT_GRID_COMPONENT, </div><div class='add'>+			 buttons[i],</div><div class='add'>+			 i ? 1 : 0, 0, 0, 0, 0, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    grid = newtGridSimpleWindow(textbox, listbox, buttonBar);</div><div class='add'>+    newtGridWrappedWindow(grid, title);</div><div class='add'>+</div><div class='add'>+    form = newtForm(NULL, 0, 0);</div><div class='add'>+    newtGridAddComponentsToForm(grid, form, 1);</div><div class='add'>+    newtGridFree(grid, 1);</div><div class='add'>+</div><div class='add'>+    result = newtRunForm(form);</div><div class='add'>+</div><div class='add'>+    *listItem = ((long) newtListboxGetCurrent(listbox));</div><div class='add'>+</div><div class='add'>+    for (rc = 0; result != buttons[rc] &amp;&amp; rc &lt; numButtons; rc++);</div><div class='add'>+    if (rc == numButtons) </div><div class='add'>+	rc = 0; /* F12 or return-on-exit (which are the same for us) */</div><div class='add'>+    else </div><div class='add'>+	rc++;</div><div class='add'>+</div><div class='add'>+    newtFormDestroy(form);</div><div class='add'>+    newtPopWindow();</div><div class='add'>+</div><div class='add'>+    return rc;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* only supports up to 50 buttons and entries -- shucks! */</div><div class='add'>+int newtWinEntries(char * title, char * text, int suggestedWidth, int flexDown, </div><div class='add'>+		   int flexUp, int dataWidth, </div><div class='add'>+		   struct newtWinEntry * items, char * button1, ...) {</div><div class='add'>+    newtComponent buttons[50], result, form, textw;</div><div class='add'>+    newtGrid grid, buttonBar, subgrid;</div><div class='add'>+    int numItems;</div><div class='add'>+    int rc, i;</div><div class='add'>+    int numButtons;</div><div class='add'>+    char * buttonName;</div><div class='add'>+    va_list args;</div><div class='add'>+</div><div class='add'>+    textw = newtTextboxReflowed(-1, -1, text, suggestedWidth, flexDown,</div><div class='add'>+			        flexUp, 0);</div><div class='add'>+</div><div class='add'>+    for (numItems = 0; items[numItems].text; numItems++); </div><div class='add'>+</div><div class='add'>+    buttonName = button1, numButtons = 0;</div><div class='add'>+    va_start(args, button1);</div><div class='add'>+    while (buttonName) {</div><div class='add'>+	buttons[numButtons] = newtButton(-1, -1, buttonName);</div><div class='add'>+	numButtons++;</div><div class='add'>+	buttonName = va_arg(args, char *);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    va_end(args);</div><div class='add'>+</div><div class='add'>+    buttonBar = newtCreateGrid(numButtons, 1);</div><div class='add'>+    for (i = 0; i &lt; numButtons; i++) {</div><div class='add'>+	newtGridSetField(buttonBar, i, 0, NEWT_GRID_COMPONENT, </div><div class='add'>+			 buttons[i],</div><div class='add'>+			 i ? 1 : 0, 0, 0, 0, 0, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    subgrid = newtCreateGrid(2, numItems);</div><div class='add'>+    for (i = 0; i &lt; numItems; i++) {</div><div class='add'>+	newtGridSetField(subgrid, 0, i, NEWT_GRID_COMPONENT,</div><div class='add'>+		         newtLabel(-1, -1, items[i].text),</div><div class='add'>+		         0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);</div><div class='add'>+	newtGridSetField(subgrid, 1, i, NEWT_GRID_COMPONENT,</div><div class='add'>+		         newtEntry(-1, -1, items[i].value ? </div><div class='add'>+				    *items[i].value : NULL, dataWidth,</div><div class='add'>+				    items[i].value, items[i].flags),</div><div class='add'>+		         1, 0, 0, 0, 0, 0);</div><div class='add'>+    }</div><div class='add'>+</div><div class='add'>+    grid = newtCreateGrid(1, 3);</div><div class='add'>+    form = newtForm(NULL, 0, 0);</div><div class='add'>+    newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, textw, </div><div class='add'>+		     0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0);</div><div class='add'>+    newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, subgrid, </div><div class='add'>+		     0, 1, 0, 0, 0, 0);</div><div class='add'>+    newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttonBar, </div><div class='add'>+		     0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX);</div><div class='add'>+    newtGridAddComponentsToForm(grid, form, 1);</div><div class='add'>+    newtGridWrappedWindow(grid, title);</div><div class='add'>+    newtGridFree(grid, 1);</div><div class='add'>+</div><div class='add'>+    result = newtRunForm(form);</div><div class='add'>+</div><div class='add'>+    for (rc = 0; rc &lt; numItems; rc++)</div><div class='add'>+	*items[rc].value = strdup(*items[rc].value);</div><div class='add'>+</div><div class='add'>+    for (rc = 0; result != buttons[rc] &amp;&amp; rc &lt; numButtons; rc++);</div><div class='add'>+    if (rc == numButtons) </div><div class='add'>+	rc = 0; /* F12 */</div><div class='add'>+    else </div><div class='add'>+	rc++;</div><div class='add'>+</div><div class='add'>+    newtFormDestroy(form);</div><div class='add'>+    newtPopWindow();</div><div class='add'>+</div><div class='add'>+    return rc;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/Makefile b/mdk-stage1/slang/Makefile<br/>new file mode 100644<br/>index 000000000..c78ee4668<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/Makefile?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/Makefile</a></div><div class='hunk'>@@ -0,0 +1,48 @@</div><div class='add'>+ #******************************************************************************</div><div class='add'>+ #</div><div class='add'>+ # Guillaume Cottenceau (gc@mandrakesoft.com)</div><div class='add'>+ #</div><div class='add'>+ # Copyright 2000 MandrakeSoft</div><div class='add'>+ #</div><div class='add'>+ # This software may be freely redistributed under the terms of the GNU</div><div class='add'>+ # public license.</div><div class='add'>+ #</div><div class='add'>+ # You should have received a copy of the GNU General Public License</div><div class='add'>+ # along with this program; if not, write to the Free Software</div><div class='add'>+ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.</div><div class='add'>+ #</div><div class='add'>+ #*****************************************************************************</div><div class='add'>+</div><div class='add'>+top_dir = ..</div><div class='add'>+</div><div class='add'>+include $(top_dir)/Makefile.common</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+all: libslang.a libslang-DIET.a</div><div class='add'>+</div><div class='add'>+clean:</div><div class='add'>+	rm -f *.o *.a</div><div class='add'>+</div><div class='add'>+FLAGS = -Wall -Werror -Os -fomit-frame-pointer -Dunix -DSLANG -c</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+OBJS = sltermin.o sldisply.o slutty.o slang.o slarray.o slclass.o slcmd.o slerr.o slgetkey.o slkeymap.o slmalloc.o slmath.o slmemchr.o slmemcmp.o slmemcpy.o slmemset.o slmisc.o slparse.o slprepr.o slregexp.o slrline.o slsearch.o slsmg.o slstd.o sltoken.o sltypes.o slxstrng.o slcurses.o slscroll.o slsignal.o slkeypad.o slerrno.o slstring.o slstruct.o slcmplex.o slarrfun.o slimport.o slpath.o slarith.o slassoc.o slcompat.o slposdir.o slstdio.o slproc.o sltime.o slstrops.o slbstr.o slpack.o slintall.o slistruc.o slposio.o slnspace.o slarrmis.o slospath.o slscanf.o</div><div class='add'>+</div><div class='add'>+OBJS-DIET = $(subst .o,-DIET.o,$(OBJS))</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+libslang.a: $(OBJS)</div><div class='add'>+	ar -cru $@ $^</div><div class='add'>+	ranlib $@</div><div class='add'>+</div><div class='add'>+libslang-DIET.a: $(OBJS-DIET)</div><div class='add'>+	ar -cru $@ $^</div><div class='add'>+	ranlib $@</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+$(OBJS): %.o: %.c</div><div class='add'>+	gcc $(FLAGS) $(GLIBC_INCLUDES) -c $&lt; -o $@</div><div class='add'>+</div><div class='add'>+$(OBJS-DIET): %-DIET.o: %.c</div><div class='add'>+	gcc $(FLAGS)  $(DIETLIBC_INCLUDES) -c $&lt; -o $@</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/_slang.h b/mdk-stage1/slang/_slang.h<br/>new file mode 100644<br/>index 000000000..02ee13505<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/_slang.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/_slang.h</a></div><div class='hunk'>@@ -0,0 +1,743 @@</div><div class='add'>+#ifndef _PRIVATE_SLANG_H_</div><div class='add'>+#define _PRIVATE_SLANG_H_</div><div class='add'>+/* header file for S-Lang internal structures that users do not (should not)</div><div class='add'>+   need.  Use slang.h for that purpose. */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* #include "config.h" */</div><div class='add'>+#include "jdmacros.h"</div><div class='add'>+#include "sllimits.h"</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+# define SLANG_SYSTEM_NAME "_VMS"</div><div class='add'>+#else</div><div class='add'>+# if defined (IBMPC_SYSTEM)</div><div class='add'>+#  define SLANG_SYSTEM_NAME "_IBMPC"</div><div class='add'>+# else</div><div class='add'>+#  define SLANG_SYSTEM_NAME "_UNIX"</div><div class='add'>+# endif</div><div class='add'>+#endif  /* VMS */</div><div class='add'>+</div><div class='add'>+/* These quantities are main_types for byte-compiled code.  They are used</div><div class='add'>+ * by the inner_interp routine.  The _BC_ means byte-code.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_LVARIABLE	SLANG_LVARIABLE   /* 0x01 */</div><div class='add'>+#define _SLANG_BC_GVARIABLE	SLANG_GVARIABLE   /* 0x02 */</div><div class='add'>+#define _SLANG_BC_IVARIABLE 	SLANG_IVARIABLE   /* 0x03 */</div><div class='add'>+#define _SLANG_BC_RVARIABLE	SLANG_RVARIABLE   /* 0x04 */</div><div class='add'>+#define _SLANG_BC_INTRINSIC 	SLANG_INTRINSIC   /* 0x05 */</div><div class='add'>+#define _SLANG_BC_FUNCTION  	SLANG_FUNCTION   /* 0x06 */</div><div class='add'>+#define _SLANG_BC_MATH_UNARY	SLANG_MATH_UNARY   /* 0x07 */</div><div class='add'>+#define _SLANG_BC_APP_UNARY	SLANG_APP_UNARY   /* 0x08 */</div><div class='add'>+#define _SLANG_BC_ICONST	SLANG_ICONSTANT   /* 0x09 */</div><div class='add'>+#define _SLANG_BC_DCONST	SLANG_DCONSTANT   /* 0x0A */</div><div class='add'>+#define _SLANG_BC_PVARIABLE	SLANG_PVARIABLE   /* 0x0B */</div><div class='add'>+#define _SLANG_BC_PFUNCTION	SLANG_PFUNCTION   /* 0x0C */</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_BINARY	0x10</div><div class='add'>+#define _SLANG_BC_LITERAL	0x11           /* constant objects */</div><div class='add'>+#define _SLANG_BC_LITERAL_INT	0x12</div><div class='add'>+#define _SLANG_BC_LITERAL_STR	0x13</div><div class='add'>+#define _SLANG_BC_BLOCK		0x14</div><div class='add'>+</div><div class='add'>+/* These 3 MUST be in this order too ! */</div><div class='add'>+#define _SLANG_BC_RETURN	0x15</div><div class='add'>+#define _SLANG_BC_BREAK		0x16</div><div class='add'>+#define _SLANG_BC_CONTINUE	0x17</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_EXCH		0x18</div><div class='add'>+#define _SLANG_BC_LABEL		0x19</div><div class='add'>+#define _SLANG_BC_LOBJPTR	0x1A</div><div class='add'>+#define _SLANG_BC_GOBJPTR	0x1B</div><div class='add'>+#define _SLANG_BC_X_ERROR	0x1C</div><div class='add'>+/* These must be in this order */</div><div class='add'>+#define _SLANG_BC_X_USER0	0x1D</div><div class='add'>+#define _SLANG_BC_X_USER1	0x1E</div><div class='add'>+#define _SLANG_BC_X_USER2	0x1F</div><div class='add'>+#define _SLANG_BC_X_USER3	0x20</div><div class='add'>+#define _SLANG_BC_X_USER4	0x21</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT		0x24</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_FRAME	0x25</div><div class='add'>+#define _SLANG_BC_UNARY			0x26</div><div class='add'>+#define _SLANG_BC_UNARY_FUNC		0x27</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_DEREF_ASSIGN		0x30</div><div class='add'>+#define _SLANG_BC_SET_LOCAL_LVALUE	0x31</div><div class='add'>+#define _SLANG_BC_SET_GLOBAL_LVALUE	0x32</div><div class='add'>+#define _SLANG_BC_SET_INTRIN_LVALUE	0x33</div><div class='add'>+#define _SLANG_BC_SET_STRUCT_LVALUE	0x34</div><div class='add'>+#define _SLANG_BC_FIELD			0x35</div><div class='add'>+#define _SLANG_BC_SET_ARRAY_LVALUE	0x36</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_LINE_NUM		0x40</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_TMP			0x50</div><div class='add'>+#define _SLANG_BC_LVARIABLE_AGET	0x60</div><div class='add'>+#define _SLANG_BC_LVARIABLE_APUT	0x61</div><div class='add'>+#define _SLANG_BC_INTEGER_PLUS		0x62</div><div class='add'>+#define _SLANG_BC_INTEGER_MINUS		0x63</div><div class='add'>+#define _SLANG_BC_ARG_LVARIABLE		0x64</div><div class='add'>+#define _SLANG_BC_EARG_LVARIABLE	0x65</div><div class='add'>+</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_INTRINSIC	0x80</div><div class='add'>+#define _SLANG_BC_INTRINSIC_CALL_DIRECT	0x81</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_LSTR	0x82</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_SLFUN	0x83</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_INTRSTOP	0x84</div><div class='add'>+#define _SLANG_BC_INTRINSIC_STOP	0x85</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_EARG_LVAR	0x86</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_LINT	0x87</div><div class='add'>+#define _SLANG_BC_CALL_DIRECT_LVAR	0x88</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* Byte-Code Sub Types (_BCST_) */</div><div class='add'>+</div><div class='add'>+/* These are sub_types of _SLANG_BC_BLOCK */</div><div class='add'>+#define _SLANG_BCST_ERROR_BLOCK	0x01</div><div class='add'>+#define _SLANG_BCST_EXIT_BLOCK	0x02</div><div class='add'>+#define _SLANG_BCST_USER_BLOCK0	0x03</div><div class='add'>+#define _SLANG_BCST_USER_BLOCK1	0x04</div><div class='add'>+#define _SLANG_BCST_USER_BLOCK2	0x05</div><div class='add'>+#define _SLANG_BCST_USER_BLOCK3	0x06</div><div class='add'>+#define _SLANG_BCST_USER_BLOCK4	0x07</div><div class='add'>+/* The user blocks MUST be in the above order */</div><div class='add'>+#define _SLANG_BCST_LOOP	0x10</div><div class='add'>+#define _SLANG_BCST_WHILE	0x11</div><div class='add'>+#define _SLANG_BCST_FOR		0x12</div><div class='add'>+#define _SLANG_BCST_FOREVER	0x13</div><div class='add'>+#define _SLANG_BCST_CFOR	0x14</div><div class='add'>+#define _SLANG_BCST_DOWHILE	0x15</div><div class='add'>+#define _SLANG_BCST_FOREACH	0x16</div><div class='add'>+</div><div class='add'>+#define _SLANG_BCST_IF		0x20</div><div class='add'>+#define _SLANG_BCST_IFNOT	0x21</div><div class='add'>+#define _SLANG_BCST_ELSE	0x22</div><div class='add'>+#define _SLANG_BCST_ANDELSE	0x23</div><div class='add'>+#define _SLANG_BCST_ORELSE	0x24</div><div class='add'>+#define _SLANG_BCST_SWITCH	0x25</div><div class='add'>+#define _SLANG_BCST_NOTELSE	0x26</div><div class='add'>+</div><div class='add'>+/* assignment (_SLANG_BC_SET_*_LVALUE) subtypes.  The order MUST correspond</div><div class='add'>+ * to the assignment token order with the ASSIGN_TOKEN as the first!</div><div class='add'>+ */</div><div class='add'>+#define _SLANG_BCST_ASSIGN		0x01</div><div class='add'>+#define _SLANG_BCST_PLUSEQS		0x02</div><div class='add'>+#define _SLANG_BCST_MINUSEQS		0x03</div><div class='add'>+#define _SLANG_BCST_TIMESEQS		0x04</div><div class='add'>+#define _SLANG_BCST_DIVEQS		0x05</div><div class='add'>+#define _SLANG_BCST_BOREQS		0x06</div><div class='add'>+#define _SLANG_BCST_BANDEQS		0x07</div><div class='add'>+#define _SLANG_BCST_PLUSPLUS		0x08</div><div class='add'>+#define _SLANG_BCST_POST_PLUSPLUS	0x09</div><div class='add'>+#define _SLANG_BCST_MINUSMINUS		0x0A</div><div class='add'>+#define _SLANG_BCST_POST_MINUSMINUS	0x0B</div><div class='add'>+</div><div class='add'>+/* These use SLANG_PLUS, SLANG_MINUS, SLANG_PLUSPLUS, etc... */</div><div class='add'>+</div><div class='add'>+typedef union</div><div class='add'>+{</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   double double_val;</div><div class='add'>+   float float_val;</div><div class='add'>+#endif</div><div class='add'>+   long long_val;</div><div class='add'>+   unsigned long ulong_val;</div><div class='add'>+   VOID_STAR ptr_val;</div><div class='add'>+   char *s_val;</div><div class='add'>+   int int_val;</div><div class='add'>+   unsigned int uint_val;</div><div class='add'>+   SLang_MMT_Type *ref;</div><div class='add'>+   SLang_Name_Type *n_val;</div><div class='add'>+   struct _SLang_Struct_Type *struct_val;</div><div class='add'>+   struct _SLang_Array_Type *array_val;</div><div class='add'>+   short short_val;</div><div class='add'>+   unsigned short ushort_val;</div><div class='add'>+   char char_val;</div><div class='add'>+   unsigned char uchar_val;</div><div class='add'>+}</div><div class='add'>+_SL_Object_Union_Type;</div><div class='add'>+</div><div class='add'>+typedef struct _SLang_Object_Type</div><div class='add'>+{</div><div class='add'>+   unsigned char data_type;	       /* SLANG_INT_TYPE, ... */</div><div class='add'>+   _SL_Object_Union_Type v;</div><div class='add'>+}</div><div class='add'>+SLang_Object_Type;</div><div class='add'>+</div><div class='add'>+struct _SLang_MMT_Type</div><div class='add'>+{</div><div class='add'>+   unsigned char data_type;	       /* int, string, etc... */</div><div class='add'>+   VOID_STAR user_data;	       /* address of user structure */</div><div class='add'>+   unsigned int count;		       /* number of references */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+extern int _SLang_pop_object_of_type (unsigned char, SLang_Object_Type *, int);</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;			       /* slstring */</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+}</div><div class='add'>+_SLstruct_Field_Type;</div><div class='add'>+</div><div class='add'>+typedef struct _SLang_Struct_Type</div><div class='add'>+{</div><div class='add'>+   _SLstruct_Field_Type *fields;</div><div class='add'>+   unsigned int nfields;	       /* number used */</div><div class='add'>+   unsigned int num_refs;</div><div class='add'>+}</div><div class='add'>+_SLang_Struct_Type;</div><div class='add'>+</div><div class='add'>+extern void _SLstruct_delete_struct (_SLang_Struct_Type *);</div><div class='add'>+extern int _SLang_push_struct (_SLang_Struct_Type *);</div><div class='add'>+extern int _SLang_pop_struct (_SLang_Struct_Type **);</div><div class='add'>+extern int _SLstruct_init (void);</div><div class='add'>+/* extern int _SLstruct_get_field (char *); */</div><div class='add'>+extern int _SLstruct_define_struct (void);</div><div class='add'>+extern int _SLstruct_define_typedef (void);</div><div class='add'>+</div><div class='add'>+extern int _SLang_pop_datatype (unsigned char *);</div><div class='add'>+extern int _SLang_push_datatype (unsigned char);</div><div class='add'>+</div><div class='add'>+struct _SLang_Ref_Type</div><div class='add'>+{</div><div class='add'>+   int is_global;</div><div class='add'>+   union</div><div class='add'>+     {</div><div class='add'>+	SLang_Name_Type *nt;</div><div class='add'>+	SLang_Object_Type *local_obj;</div><div class='add'>+     }</div><div class='add'>+   v;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+extern int _SLang_dereference_ref (SLang_Ref_Type *);</div><div class='add'>+extern int _SLang_deref_assign (SLang_Ref_Type *);</div><div class='add'>+extern int _SLang_push_ref (int, VOID_STAR);</div><div class='add'>+</div><div class='add'>+extern int _SL_increment_frame_pointer (void);</div><div class='add'>+extern int _SL_decrement_frame_pointer (void);</div><div class='add'>+</div><div class='add'>+extern int SLang_pop(SLang_Object_Type *);</div><div class='add'>+extern void SLang_free_object (SLang_Object_Type *);</div><div class='add'>+extern int _SLanytype_typecast (unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+				unsigned char, VOID_STAR);</div><div class='add'>+extern void _SLstring_intrinsic (void);</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* These functions are used to create slstrings of a fixed length.  Be</div><div class='add'>+ * very careful how they are used.  In particular, if len bytes are allocated,</div><div class='add'>+ * then the string must be len characters long, no more and no less.</div><div class='add'>+ */</div><div class='add'>+extern char *_SLallocate_slstring (unsigned int);</div><div class='add'>+extern char *_SLcreate_via_alloced_slstring (char *, unsigned int);</div><div class='add'>+extern void _SLunallocate_slstring (char *, unsigned int);</div><div class='add'>+extern int _SLpush_alloced_slstring (char *, unsigned int);</div><div class='add'>+  </div><div class='add'>+typedef struct </div><div class='add'>+{</div><div class='add'>+   char **buf;</div><div class='add'>+   unsigned int max_num;</div><div class='add'>+   unsigned int num;</div><div class='add'>+   unsigned int delta_num;</div><div class='add'>+}</div><div class='add'>+_SLString_List_Type;</div><div class='add'>+extern int _SLstring_list_append (_SLString_List_Type *, char *);</div><div class='add'>+extern int _SLstring_list_init (_SLString_List_Type *, unsigned int, unsigned int);</div><div class='add'>+extern void _SLstring_list_delete (_SLString_List_Type *);</div><div class='add'>+extern int _SLstring_list_push (_SLString_List_Type *);</div><div class='add'>+</div><div class='add'>+/* This function assumes that s is an slstring. */</div><div class='add'>+extern char *_SLstring_dup_slstring (char *);</div><div class='add'>+extern int _SLang_dup_and_push_slstring (char *);</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+extern int _SLang_init_import (void);</div><div class='add'>+</div><div class='add'>+/* This function checks to see if the referenced object is initialized */</div><div class='add'>+extern int _SLang_is_ref_initialized (SLang_Ref_Type *);</div><div class='add'>+extern int _SLcheck_identifier_syntax (char *);</div><div class='add'>+extern int _SLang_uninitialize_ref (SLang_Ref_Type *);</div><div class='add'>+</div><div class='add'>+extern int _SLpush_slang_obj (SLang_Object_Type *);</div><div class='add'>+</div><div class='add'>+extern char *_SLexpand_escaped_char(char *, char *);</div><div class='add'>+extern void _SLexpand_escaped_string (char *, char *, char *);</div><div class='add'>+</div><div class='add'>+/* returns a pointer to an SLstring string-- use SLang_free_slstring */</div><div class='add'>+extern char *_SLstringize_object (SLang_Object_Type *);</div><div class='add'>+extern int _SLdump_objects (char *, SLang_Object_Type *, unsigned int, int);</div><div class='add'>+</div><div class='add'>+extern SLang_Object_Type *_SLRun_Stack;</div><div class='add'>+extern SLang_Object_Type *_SLStack_Pointer;</div><div class='add'>+</div><div class='add'>+struct _SLang_NameSpace_Type</div><div class='add'>+{</div><div class='add'>+   struct _SLang_NameSpace_Type *next;</div><div class='add'>+   char *name;			       /* this is the load_type name */</div><div class='add'>+   char *namespace_name;	       /* this name is assigned by implements */</div><div class='add'>+   unsigned int table_size;</div><div class='add'>+   SLang_Name_Type **table;</div><div class='add'>+};</div><div class='add'>+extern SLang_NameSpace_Type *_SLns_allocate_namespace (char *, unsigned int);</div><div class='add'>+extern SLang_NameSpace_Type *_SLns_find_namespace (char *);</div><div class='add'>+extern int _SLns_set_namespace_name (SLang_NameSpace_Type *, char *);</div><div class='add'>+extern SLang_Array_Type *_SLnspace_apropos (SLang_NameSpace_Type *, char *, unsigned int);</div><div class='add'>+extern void _SLang_use_namespace_intrinsic (char *name);</div><div class='add'>+extern char *_SLang_cur_namespace_intrinsic (void);</div><div class='add'>+extern SLang_Array_Type *_SLang_apropos (char *, char *, unsigned int);</div><div class='add'>+extern void _SLang_implements_intrinsic (char *);</div><div class='add'>+</div><div class='add'>+extern int _SLang_Trace;</div><div class='add'>+extern int _SLstack_depth(void);</div><div class='add'>+extern char *_SLang_Current_Function_Name;</div><div class='add'>+</div><div class='add'>+extern int _SLang_trace_fun(char *);</div><div class='add'>+extern int _SLang_Compile_Line_Num_Info;</div><div class='add'>+</div><div class='add'>+extern char *_SLstring_dup_hashed_string (char *, unsigned long);</div><div class='add'>+extern unsigned long _SLcompute_string_hash (char *);</div><div class='add'>+extern char *_SLstring_make_hashed_string (char *, unsigned int, unsigned long *);</div><div class='add'>+extern void _SLfree_hashed_string (char *, unsigned int, unsigned long);</div><div class='add'>+unsigned long _SLstring_hash (unsigned char *, unsigned char *);</div><div class='add'>+extern int _SLinit_slcomplex (void);</div><div class='add'>+</div><div class='add'>+extern int _SLang_init_slstrops (void);</div><div class='add'>+extern int _SLstrops_do_sprintf_n (int);</div><div class='add'>+extern int _SLang_sscanf (void);</div><div class='add'>+extern double _SLang_atof (char *);</div><div class='add'>+extern int _SLang_init_bstring (void);</div><div class='add'>+extern int _SLang_init_sltime (void);</div><div class='add'>+extern void _SLpack (void);</div><div class='add'>+extern void _SLunpack (char *, SLang_BString_Type *);</div><div class='add'>+extern void _SLpack_pad_format (char *);</div><div class='add'>+extern unsigned int _SLpack_compute_size (char *);</div><div class='add'>+extern int _SLusleep (unsigned long);</div><div class='add'>+</div><div class='add'>+/* frees upon error.  NULL __NOT__ ok. */</div><div class='add'>+extern int _SLang_push_slstring (char *);</div><div class='add'>+</div><div class='add'>+extern unsigned char _SLarith_promote_type (unsigned char);</div><div class='add'>+extern int _SLarith_get_precedence (unsigned char);</div><div class='add'>+extern int _SLarith_typecast (unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+			      unsigned char, VOID_STAR);</div><div class='add'>+</div><div class='add'>+extern int SLang_push(SLang_Object_Type *);</div><div class='add'>+extern int SLadd_global_variable (char *);</div><div class='add'>+extern void _SLang_clear_error (void);</div><div class='add'>+</div><div class='add'>+extern int _SLdo_pop (void);</div><div class='add'>+extern unsigned int _SLsys_getkey (void);</div><div class='add'>+extern int _SLsys_input_pending (int);</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+extern unsigned int _SLpc_convert_scancode (unsigned int, unsigned int, int);</div><div class='add'>+#define _SLTT_KEY_SHIFT		1</div><div class='add'>+#define _SLTT_KEY_CTRL		2</div><div class='add'>+#define _SLTT_KEY_ALT		4</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct _SLterminfo_Type SLterminfo_Type;</div><div class='add'>+extern SLterminfo_Type *_SLtt_tigetent (char *);</div><div class='add'>+extern char *_SLtt_tigetstr (SLterminfo_Type *, char *);</div><div class='add'>+extern int _SLtt_tigetnum (SLterminfo_Type *, char *);</div><div class='add'>+extern int _SLtt_tigetflag (SLterminfo_Type *, char *);</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+extern int _SLtt_get_bce_color_offset (void);</div><div class='add'>+#endif</div><div class='add'>+extern void (*_SLtt_color_changed_hook)(void);</div><div class='add'>+</div><div class='add'>+extern unsigned char SLang_Input_Buffer [SL_MAX_INPUT_BUFFER_LEN];</div><div class='add'>+</div><div class='add'>+extern int _SLregister_types (void);</div><div class='add'>+extern SLang_Class_Type *_SLclass_get_class (unsigned char);</div><div class='add'>+extern VOID_STAR _SLclass_get_ptr_to_value (SLang_Class_Type *, SLang_Object_Type *);</div><div class='add'>+extern void _SLclass_type_mismatch_error (unsigned char, unsigned char);</div><div class='add'>+extern int _SLclass_init (void);</div><div class='add'>+extern int _SLclass_copy_class (unsigned char, unsigned char);</div><div class='add'>+</div><div class='add'>+extern unsigned char _SLclass_Class_Type [256];</div><div class='add'>+</div><div class='add'>+extern int (*_SLclass_get_typecast (unsigned char, unsigned char, int))</div><div class='add'>+(unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR);</div><div class='add'>+</div><div class='add'>+extern int (*_SLclass_get_binary_fun (int, SLang_Class_Type *, SLang_Class_Type *, SLang_Class_Type **, int))</div><div class='add'>+(int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR);</div><div class='add'>+</div><div class='add'>+extern int (*_SLclass_get_unary_fun (int, SLang_Class_Type *, SLang_Class_Type **, int))</div><div class='add'>+(int, unsigned char, VOID_STAR, unsigned int, VOID_STAR);</div><div class='add'>+</div><div class='add'>+extern int _SLarith_register_types (void);</div><div class='add'>+extern unsigned char _SLarith_Arith_Types [];</div><div class='add'>+extern unsigned char _SLarith_Is_Arith_Type [256];</div><div class='add'>+extern int _SLarith_bin_op (SLang_Object_Type *, SLang_Object_Type *, int);</div><div class='add'>+</div><div class='add'>+extern int _SLarray_add_bin_op (unsigned char);</div><div class='add'>+</div><div class='add'>+extern int _SLang_call_funptr (SLang_Name_Type *);</div><div class='add'>+extern void _SLset_double_format (char *);</div><div class='add'>+extern SLang_Name_Type *_SLlocate_global_name (char *);</div><div class='add'>+extern SLang_Name_Type *_SLlocate_name (char *);</div><div class='add'>+</div><div class='add'>+extern char *_SLdefines[];</div><div class='add'>+</div><div class='add'>+#define SL_ERRNO_NOT_IMPLEMENTED	0x7FFF</div><div class='add'>+extern int _SLerrno_errno;</div><div class='add'>+extern int _SLerrno_init (void);</div><div class='add'>+</div><div class='add'>+extern int _SLstdio_fdopen (char *, int, char *);</div><div class='add'>+</div><div class='add'>+extern void _SLstruct_pop_args (int *);</div><div class='add'>+extern void _SLstruct_push_args (SLang_Array_Type *);</div><div class='add'>+</div><div class='add'>+extern int _SLarray_aput (void);</div><div class='add'>+extern int _SLarray_aget (void);</div><div class='add'>+extern int _SLarray_inline_implicit_array (void);</div><div class='add'>+extern int _SLarray_inline_array (void);</div><div class='add'>+extern int _SLarray_wildcard_array (void);</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+_SLarray_typecast (unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+		   unsigned char, VOID_STAR, int);</div><div class='add'>+</div><div class='add'>+extern int _SLarray_aput_transfer_elem (SLang_Array_Type *, int *,</div><div class='add'>+					VOID_STAR, unsigned int, int);</div><div class='add'>+extern int _SLarray_aget_transfer_elem (SLang_Array_Type *, int *,</div><div class='add'>+					VOID_STAR, unsigned int, int);</div><div class='add'>+extern void _SLarray_free_array_elements (SLang_Class_Type *, VOID_STAR, unsigned int);</div><div class='add'>+</div><div class='add'>+extern SLang_Foreach_Context_Type *</div><div class='add'>+_SLarray_cl_foreach_open (unsigned char, unsigned int);</div><div class='add'>+extern void _SLarray_cl_foreach_close (unsigned char, SLang_Foreach_Context_Type *);</div><div class='add'>+extern int _SLarray_cl_foreach (unsigned char, SLang_Foreach_Context_Type *);</div><div class='add'>+</div><div class='add'>+extern int _SLarray_matrix_multiply (void);</div><div class='add'>+extern void (*_SLang_Matrix_Multiply)(void);</div><div class='add'>+</div><div class='add'>+extern int _SLarray_init_slarray (void);</div><div class='add'>+extern SLang_Array_Type *</div><div class='add'>+SLang_create_array1 (unsigned char, int, VOID_STAR, int *, unsigned int, int);</div><div class='add'>+</div><div class='add'>+extern int _SLcompile_push_context (SLang_Load_Type *);</div><div class='add'>+extern int _SLcompile_pop_context (void);</div><div class='add'>+extern int _SLang_Auto_Declare_Globals;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   union</div><div class='add'>+     {</div><div class='add'>+	long long_val;</div><div class='add'>+	char *s_val;		       /* Used for IDENT_TOKEN, FLOAT, etc...  */</div><div class='add'>+	SLang_BString_Type *b_val;</div><div class='add'>+     } v;</div><div class='add'>+   int free_sval_flag;</div><div class='add'>+   unsigned int num_refs;</div><div class='add'>+   unsigned long hash;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   int line_number;</div><div class='add'>+#endif</div><div class='add'>+   unsigned char type;</div><div class='add'>+}</div><div class='add'>+_SLang_Token_Type;</div><div class='add'>+</div><div class='add'>+extern void _SLcompile (_SLang_Token_Type *);</div><div class='add'>+extern void (*_SLcompile_ptr)(_SLang_Token_Type *);</div><div class='add'>+</div><div class='add'>+/* *** TOKENS *** */</div><div class='add'>+</div><div class='add'>+/* Note that that tokens corresponding to ^J, ^M, and ^Z should not be used.</div><div class='add'>+ * This is because a file that contains any of these characters will</div><div class='add'>+ * have an OS dependent interpretation, e.g., ^Z is EOF on MSDOS.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Special tokens */</div><div class='add'>+#define EOF_TOKEN	0x01</div><div class='add'>+#define RPN_TOKEN	0x02</div><div class='add'>+#define NL_TOKEN	0x03</div><div class='add'>+#define NOP_TOKEN	0x05</div><div class='add'>+#define FARG_TOKEN	0x06</div><div class='add'>+#define TMP_TOKEN	0x07</div><div class='add'>+</div><div class='add'>+#define RESERVED1_TOKEN	0x0A	       /* \n */</div><div class='add'>+#define RESERVED2_TOKEN	0x0D	       /* \r */</div><div class='add'>+</div><div class='add'>+/* Literal tokens */</div><div class='add'>+#define CHAR_TOKEN	0x10</div><div class='add'>+#define UCHAR_TOKEN	0x11</div><div class='add'>+#define SHORT_TOKEN	0x12</div><div class='add'>+#define USHORT_TOKEN	0x13</div><div class='add'>+#define INT_TOKEN	0x14</div><div class='add'>+#define UINT_TOKEN	0x15</div><div class='add'>+#define LONG_TOKEN	0x16</div><div class='add'>+#define ULONG_TOKEN	0x17</div><div class='add'>+#define IS_INTEGER_TOKEN(x) ((x &gt;= CHAR_TOKEN) &amp;&amp; (x &lt;= ULONG_TOKEN))</div><div class='add'>+#define FLOAT_TOKEN	0x18</div><div class='add'>+#define DOUBLE_TOKEN	0x19</div><div class='add'>+#define RESERVED3_TOKEN	0x1A	       /* ^Z */</div><div class='add'>+#define COMPLEX_TOKEN	0x1B</div><div class='add'>+#define STRING_TOKEN    0x1C</div><div class='add'>+#define BSTRING_TOKEN	0x1D</div><div class='add'>+#define _BSTRING_TOKEN	0x1E	       /* byte-compiled BSTRING */</div><div class='add'>+#define ESC_STRING_TOKEN	0x1F</div><div class='add'>+</div><div class='add'>+/* Tokens that can be LVALUES */</div><div class='add'>+#define IDENT_TOKEN	0x20</div><div class='add'>+#define ARRAY_TOKEN	0x21</div><div class='add'>+#define DOT_TOKEN	0x22</div><div class='add'>+#define IS_LVALUE_TOKEN (((t) &lt;= DOT_TOKEN) &amp;&amp; ((t) &gt;= IDENT_TOKEN))</div><div class='add'>+</div><div class='add'>+/* do not use these values */</div><div class='add'>+#define RESERVED4_TOKEN	0x23	       /* # */</div><div class='add'>+#define RESERVED5_TOKEN 0x25	       /* % */</div><div class='add'>+</div><div class='add'>+/* Flags for struct fields */</div><div class='add'>+#define STATIC_TOKEN	0x26</div><div class='add'>+#define READONLY_TOKEN	0x27</div><div class='add'>+#define PRIVATE_TOKEN	0x28</div><div class='add'>+#define PUBLIC_TOKEN	0x29</div><div class='add'>+</div><div class='add'>+/* Punctuation tokens */</div><div class='add'>+#define OBRACKET_TOKEN	0x2a</div><div class='add'>+#define CBRACKET_TOKEN	0x2b</div><div class='add'>+#define OPAREN_TOKEN	0x2c</div><div class='add'>+#define CPAREN_TOKEN	0x2d</div><div class='add'>+#define OBRACE_TOKEN	0x2e</div><div class='add'>+#define CBRACE_TOKEN	0x2f</div><div class='add'>+</div><div class='add'>+#define COMMA_TOKEN	0x31</div><div class='add'>+#define SEMICOLON_TOKEN	0x32</div><div class='add'>+#define COLON_TOKEN	0x33</div><div class='add'>+#define NAMESPACE_TOKEN	0x34</div><div class='add'>+</div><div class='add'>+/* Operators */</div><div class='add'>+#define POW_TOKEN	0x38</div><div class='add'>+</div><div class='add'>+/* The order here must match the order in the Binop_Level table in slparse.c */</div><div class='add'>+#define FIRST_BINARY_OP	0x39</div><div class='add'>+#define ADD_TOKEN	0x39</div><div class='add'>+#define SUB_TOKEN	0x3a</div><div class='add'>+#define TIMES_TOKEN	0x3b</div><div class='add'>+#define DIV_TOKEN	0x3c</div><div class='add'>+#define LT_TOKEN	0x3d</div><div class='add'>+#define LE_TOKEN	0x3e</div><div class='add'>+#define GT_TOKEN	0x3f</div><div class='add'>+#define GE_TOKEN	0x40</div><div class='add'>+#define EQ_TOKEN	0x41</div><div class='add'>+#define NE_TOKEN	0x42</div><div class='add'>+#define AND_TOKEN	0x43</div><div class='add'>+#define OR_TOKEN	0x44</div><div class='add'>+#define MOD_TOKEN	0x45</div><div class='add'>+#define BAND_TOKEN	0x46</div><div class='add'>+#define SHL_TOKEN	0x47</div><div class='add'>+#define SHR_TOKEN	0x48</div><div class='add'>+#define BXOR_TOKEN	0x49</div><div class='add'>+#define BOR_TOKEN	0x4a</div><div class='add'>+#define POUND_TOKEN	0x4b	       /* matrix multiplication */</div><div class='add'>+</div><div class='add'>+#define LAST_BINARY_OP	 0x4b</div><div class='add'>+#define IS_BINARY_OP(t)	 ((t &gt;= FIRST_BINARY_OP) &amp;&amp; (t &lt;= LAST_BINARY_OP))</div><div class='add'>+</div><div class='add'>+/* unary tokens -- but not all of them (see grammar) */</div><div class='add'>+#define DEREF_TOKEN	 0x4d</div><div class='add'>+#define NOT_TOKEN	 0x4e</div><div class='add'>+#define BNOT_TOKEN	 0x4f</div><div class='add'>+</div><div class='add'>+#define IS_INTERNAL_FUNC(t)	((t &gt;= 0x50) &amp;&amp; (t &lt;= 0x56))</div><div class='add'>+#define POP_TOKEN	 0x50</div><div class='add'>+#define CHS_TOKEN	 0x51</div><div class='add'>+#define SIGN_TOKEN	 0x52</div><div class='add'>+#define ABS_TOKEN	 0x53</div><div class='add'>+#define SQR_TOKEN	 0x54</div><div class='add'>+#define MUL2_TOKEN	 0x55</div><div class='add'>+#define EXCH_TOKEN	 0x56</div><div class='add'>+</div><div class='add'>+/* Assignment tokens.  Note: these must appear with sequential values.</div><div class='add'>+ * The order here must match the specific lvalue assignments below.</div><div class='add'>+ * These tokens are used by rpn routines in slang.c.  slparse.c maps them</div><div class='add'>+ * onto the specific lvalue tokens while parsing infix.</div><div class='add'>+ * Also the assignment _SLANG_BCST_ assumes this order</div><div class='add'>+ */</div><div class='add'>+#define ASSIGN_TOKEN		0x57</div><div class='add'>+#define PLUSEQS_TOKEN	 	0x58</div><div class='add'>+#define MINUSEQS_TOKEN		0x59</div><div class='add'>+#define TIMESEQS_TOKEN		0x5A</div><div class='add'>+#define DIVEQS_TOKEN		0x5B</div><div class='add'>+#define BOREQS_TOKEN		0x5C</div><div class='add'>+#define BANDEQS_TOKEN		0x5D</div><div class='add'>+#define PLUSPLUS_TOKEN		0x5E</div><div class='add'>+#define POST_PLUSPLUS_TOKEN	0x5F</div><div class='add'>+#define MINUSMINUS_TOKEN	0x60</div><div class='add'>+#define POST_MINUSMINUS_TOKEN	0x61</div><div class='add'>+</div><div class='add'>+/* Directives */</div><div class='add'>+#define FIRST_DIRECTIVE_TOKEN	0x62</div><div class='add'>+#define IFNOT_TOKEN	0x62</div><div class='add'>+#define IF_TOKEN	0x63</div><div class='add'>+#define ELSE_TOKEN	0x64</div><div class='add'>+#define FOREVER_TOKEN	0x65</div><div class='add'>+#define WHILE_TOKEN	0x66</div><div class='add'>+#define FOR_TOKEN	0x67</div><div class='add'>+#define _FOR_TOKEN	0x68</div><div class='add'>+#define LOOP_TOKEN	0x69</div><div class='add'>+#define SWITCH_TOKEN	0x6A</div><div class='add'>+#define DOWHILE_TOKEN	0x6B</div><div class='add'>+#define ANDELSE_TOKEN	0x6C</div><div class='add'>+#define ORELSE_TOKEN	0x6D</div><div class='add'>+#define ERRBLK_TOKEN	0x6E</div><div class='add'>+#define EXITBLK_TOKEN	0x6F</div><div class='add'>+/* These must be sequential */</div><div class='add'>+#define USRBLK0_TOKEN	0x70</div><div class='add'>+#define USRBLK1_TOKEN	0x71</div><div class='add'>+#define USRBLK2_TOKEN	0x72</div><div class='add'>+#define USRBLK3_TOKEN	0x73</div><div class='add'>+#define USRBLK4_TOKEN	0x74</div><div class='add'>+</div><div class='add'>+#define CONT_TOKEN	0x75</div><div class='add'>+#define BREAK_TOKEN	0x76</div><div class='add'>+#define RETURN_TOKEN	0x77</div><div class='add'>+</div><div class='add'>+#define CASE_TOKEN	0x78</div><div class='add'>+#define DEFINE_TOKEN	0x79</div><div class='add'>+#define DO_TOKEN	0x7a</div><div class='add'>+#define VARIABLE_TOKEN	0x7b</div><div class='add'>+#define GVARIABLE_TOKEN	0x7c</div><div class='add'>+#define _REF_TOKEN	0x7d</div><div class='add'>+#define PUSH_TOKEN	0x7e</div><div class='add'>+#define STRUCT_TOKEN	0x7f</div><div class='add'>+#define TYPEDEF_TOKEN	0x80</div><div class='add'>+#define NOTELSE_TOKEN	0x81</div><div class='add'>+#define DEFINE_STATIC_TOKEN	0x82</div><div class='add'>+#define FOREACH_TOKEN	0x83</div><div class='add'>+#define USING_TOKEN	0x84</div><div class='add'>+#define DEFINE_PRIVATE_TOKEN	0x85</div><div class='add'>+#define DEFINE_PUBLIC_TOKEN	0x86</div><div class='add'>+</div><div class='add'>+/* Note: the order here must match the order of the generic assignment tokens.</div><div class='add'>+ * Also, the first token of each group must be the ?_ASSIGN_TOKEN.</div><div class='add'>+ * slparse.c exploits this order, as well as slang.h.</div><div class='add'>+ */</div><div class='add'>+#define FIRST_ASSIGN_TOKEN		0x90</div><div class='add'>+#define _STRUCT_ASSIGN_TOKEN		0x90</div><div class='add'>+#define _STRUCT_PLUSEQS_TOKEN		0x91</div><div class='add'>+#define _STRUCT_MINUSEQS_TOKEN		0x92</div><div class='add'>+#define _STRUCT_TIMESEQS_TOKEN		0x93</div><div class='add'>+#define _STRUCT_DIVEQS_TOKEN		0x94</div><div class='add'>+#define _STRUCT_BOREQS_TOKEN		0x95</div><div class='add'>+#define _STRUCT_BANDEQS_TOKEN		0x96</div><div class='add'>+#define _STRUCT_PLUSPLUS_TOKEN		0x97</div><div class='add'>+#define _STRUCT_POST_PLUSPLUS_TOKEN	0x98</div><div class='add'>+#define _STRUCT_MINUSMINUS_TOKEN	0x99</div><div class='add'>+#define _STRUCT_POST_MINUSMINUS_TOKEN	0x9A</div><div class='add'>+</div><div class='add'>+#define _ARRAY_ASSIGN_TOKEN		0xA0</div><div class='add'>+#define _ARRAY_PLUSEQS_TOKEN		0xA1</div><div class='add'>+#define _ARRAY_MINUSEQS_TOKEN		0xA2</div><div class='add'>+#define _ARRAY_TIMESEQS_TOKEN		0xA3</div><div class='add'>+#define _ARRAY_DIVEQS_TOKEN		0xA4</div><div class='add'>+#define _ARRAY_BOREQS_TOKEN		0xA5</div><div class='add'>+#define _ARRAY_BANDEQS_TOKEN		0xA6</div><div class='add'>+#define _ARRAY_PLUSPLUS_TOKEN		0xA7</div><div class='add'>+#define _ARRAY_POST_PLUSPLUS_TOKEN	0xA8</div><div class='add'>+#define _ARRAY_MINUSMINUS_TOKEN		0xA9</div><div class='add'>+#define _ARRAY_POST_MINUSMINUS_TOKEN	0xAA</div><div class='add'>+</div><div class='add'>+#define _SCALAR_ASSIGN_TOKEN		0xB0</div><div class='add'>+#define _SCALAR_PLUSEQS_TOKEN		0xB1</div><div class='add'>+#define _SCALAR_MINUSEQS_TOKEN		0xB2</div><div class='add'>+#define _SCALAR_TIMESEQS_TOKEN		0xB3</div><div class='add'>+#define _SCALAR_DIVEQS_TOKEN		0xB4</div><div class='add'>+#define _SCALAR_BOREQS_TOKEN		0xB5</div><div class='add'>+#define _SCALAR_BANDEQS_TOKEN		0xB6</div><div class='add'>+#define _SCALAR_PLUSPLUS_TOKEN		0xB7</div><div class='add'>+#define _SCALAR_POST_PLUSPLUS_TOKEN	0xB8</div><div class='add'>+#define _SCALAR_MINUSMINUS_TOKEN	0xB9</div><div class='add'>+#define _SCALAR_POST_MINUSMINUS_TOKEN	0xBA</div><div class='add'>+</div><div class='add'>+#define _DEREF_ASSIGN_TOKEN		0xC0</div><div class='add'>+#define _DEREF_PLUSEQS_TOKEN		0xC1</div><div class='add'>+#define _DEREF_MINUSEQS_TOKEN		0xC2</div><div class='add'>+#define _DEREF_TIMESEQS_TOKEN		0xC3</div><div class='add'>+#define _DEREF_DIVEQS_TOKEN		0xC4</div><div class='add'>+#define _DEREF_BOREQS_TOKEN		0xC5</div><div class='add'>+#define _DEREF_BANDEQS_TOKEN		0xC6</div><div class='add'>+#define _DEREF_PLUSPLUS_TOKEN		0xC7</div><div class='add'>+#define _DEREF_POST_PLUSPLUS_TOKEN	0xC8</div><div class='add'>+#define _DEREF_MINUSMINUS_TOKEN		0xC9</div><div class='add'>+#define _DEREF_POST_MINUSMINUS_TOKEN	0xCA</div><div class='add'>+</div><div class='add'>+#define LAST_ASSIGN_TOKEN		0xCA</div><div class='add'>+#define IS_ASSIGN_TOKEN(t) (((t)&gt;=FIRST_ASSIGN_TOKEN)&amp;&amp;((t)&lt;=LAST_ASSIGN_TOKEN))</div><div class='add'>+</div><div class='add'>+#define _INLINE_ARRAY_TOKEN		0xE0</div><div class='add'>+#define _INLINE_IMPLICIT_ARRAY_TOKEN	0xE1</div><div class='add'>+#define _NULL_TOKEN			0xE2</div><div class='add'>+#define _INLINE_WILDCARD_ARRAY_TOKEN	0xE3</div><div class='add'>+</div><div class='add'>+#define LINE_NUM_TOKEN			0xFC</div><div class='add'>+#define ARG_TOKEN	 		0xFD</div><div class='add'>+#define EARG_TOKEN	 		0xFE</div><div class='add'>+#define NO_OP_LITERAL			0xFF</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   /* sltoken.c */</div><div class='add'>+   /* SLang_eval_object */</div><div class='add'>+   SLang_Load_Type *llt;</div><div class='add'>+   SLPreprocess_Type *this_slpp;</div><div class='add'>+   /* prep_get_char() */</div><div class='add'>+   char *input_line;</div><div class='add'>+   char cchar;</div><div class='add'>+   /* get_token() */</div><div class='add'>+   int want_nl_token;</div><div class='add'>+</div><div class='add'>+   /* slparse.c */</div><div class='add'>+   _SLang_Token_Type ctok;</div><div class='add'>+   int block_depth;</div><div class='add'>+   int assignment_expression;</div><div class='add'>+</div><div class='add'>+   /* slang.c : SLcompile() */</div><div class='add'>+   _SLang_Token_Type save_token;</div><div class='add'>+   _SLang_Token_Type next_token;</div><div class='add'>+   void (*slcompile_ptr)(_SLang_Token_Type *);</div><div class='add'>+}</div><div class='add'>+_SLEval_Context;</div><div class='add'>+</div><div class='add'>+extern int _SLget_token (_SLang_Token_Type *);</div><div class='add'>+extern void _SLparse_error (char *, _SLang_Token_Type *, int);</div><div class='add'>+extern void _SLparse_start (SLang_Load_Type *);</div><div class='add'>+extern int _SLget_rpn_token (_SLang_Token_Type *);</div><div class='add'>+extern void _SLcompile_byte_compiled (void);</div><div class='add'>+</div><div class='add'>+extern int (*_SLprep_eval_hook) (char *);</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_VSNPRINTF</div><div class='add'>+#define _SLvsnprintf vsnprintf</div><div class='add'>+#else</div><div class='add'>+extern int _SLvsnprintf (char *, unsigned int, char *, va_list);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SNPRINTF</div><div class='add'>+# define _SLsnprintf snprintf</div><div class='add'>+#else</div><div class='add'>+extern int _SLsnprintf (char *, unsigned int, char *, ...);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#undef _INLINE_</div><div class='add'>+#if defined(__GNUC__) &amp;&amp; _SLANG_USE_INLINE_CODE</div><div class='add'>+# define _INLINE_ __inline__</div><div class='add'>+#else</div><div class='add'>+# define _INLINE_</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#endif				       /* _PRIVATE_SLANG_H_ */</div><div class='head'>diff --git a/mdk-stage1/slang/config.h b/mdk-stage1/slang/config.h<br/>new file mode 100644<br/>index 000000000..a5ab3273c<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/config.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/config.h</a></div><div class='hunk'>@@ -0,0 +1,163 @@</div><div class='add'>+/* src/sysconf.h.  Generated automatically by configure.  */</div><div class='add'>+/* -*- c -*- */</div><div class='add'>+/* Note: this is for unix only. */</div><div class='add'>+</div><div class='add'>+#ifndef SL_CONFIG_H</div><div class='add'>+#define SL_CONFIG_H</div><div class='add'>+</div><div class='add'>+/* define if you have stdlib.h */</div><div class='add'>+#define HAVE_STDLIB_H 1</div><div class='add'>+</div><div class='add'>+/* define if you have unistd.h */</div><div class='add'>+#define HAVE_UNISTD_H 1</div><div class='add'>+</div><div class='add'>+/* define if you have termios.h */</div><div class='add'>+#define HAVE_TERMIOS_H 1</div><div class='add'>+</div><div class='add'>+/* define if you have memory.h */</div><div class='add'>+#define HAVE_MEMORY_H 1</div><div class='add'>+</div><div class='add'>+/* define if you have malloc.h */</div><div class='add'>+#define HAVE_MALLOC_H 1</div><div class='add'>+</div><div class='add'>+/* define if you have memset */</div><div class='add'>+#define HAVE_MEMSET 1</div><div class='add'>+</div><div class='add'>+/* define if you have memcpy */</div><div class='add'>+#define HAVE_MEMCPY 1</div><div class='add'>+</div><div class='add'>+//#define HAVE_SETLOCALE 1</div><div class='add'>+//#define HAVE_LOCALE_H 1</div><div class='add'>+</div><div class='add'>+#define HAVE_VFSCANF 1</div><div class='add'>+</div><div class='add'>+/* define if you have fcntl.h */</div><div class='add'>+#define HAVE_FCNTL_H 1</div><div class='add'>+</div><div class='add'>+/* Define if you have the vsnprintf, snprintf functions and they return</div><div class='add'>+ * EOF upon failure.</div><div class='add'>+ */</div><div class='add'>+#define HAVE_VSNPRINTF 1</div><div class='add'>+#define HAVE_SNPRINTF 1</div><div class='add'>+</div><div class='add'>+/* define if you have sys/fcntl.h */</div><div class='add'>+#define HAVE_SYS_FCNTL_H 1</div><div class='add'>+</div><div class='add'>+#define HAVE_SYS_TYPES_H 1</div><div class='add'>+#define HAVE_SYS_WAIT_H 1</div><div class='add'>+#define HAVE_SYS_TIMES_H 1</div><div class='add'>+</div><div class='add'>+/* Set these to the appropriate values */</div><div class='add'>+#define SIZEOF_SHORT 2</div><div class='add'>+#define SIZEOF_INT 4</div><div class='add'>+#define SIZEOF_LONG 4</div><div class='add'>+#define SIZEOF_FLOAT 4</div><div class='add'>+#define SIZEOF_DOUBLE 8</div><div class='add'>+</div><div class='add'>+/* define if you have these. */</div><div class='add'>+#define HAVE_ATEXIT 1</div><div class='add'>+#define HAVE_ON_EXIT 1</div><div class='add'>+#define HAVE_PUTENV 1</div><div class='add'>+#define HAVE_GETCWD 1</div><div class='add'>+#define HAVE_TCGETATTR 1</div><div class='add'>+#define HAVE_TCSETATTR 1</div><div class='add'>+#define HAVE_CFGETOSPEED 1</div><div class='add'>+#define HAVE_LSTAT 1</div><div class='add'>+#define HAVE_KILL 1</div><div class='add'>+#define HAVE_CHOWN 1</div><div class='add'>+#define HAVE_VSNPRINTF 1</div><div class='add'>+#define HAVE_POPEN 1</div><div class='add'>+#define HAVE_UMASK 1</div><div class='add'>+#define HAVE_READLINK 1</div><div class='add'>+#define HAVE_TIMES 1</div><div class='add'>+#define HAVE_GMTIME 1</div><div class='add'>+#define HAVE_MKFIFO 1</div><div class='add'>+</div><div class='add'>+#define HAVE_GETPPID 1</div><div class='add'>+#define HAVE_GETGID 1</div><div class='add'>+#define HAVE_GETEGID 1</div><div class='add'>+#define HAVE_GETEUID 1</div><div class='add'>+/* #undef HAVE_GETUID */</div><div class='add'>+</div><div class='add'>+#define HAVE_SETGID 1 </div><div class='add'>+#define HAVE_SETPGID 1</div><div class='add'>+#define HAVE_SETUID 1</div><div class='add'>+</div><div class='add'>+#define HAVE_ACOSH 1</div><div class='add'>+#define HAVE_ASINH 1</div><div class='add'>+#define HAVE_ATANH 1</div><div class='add'>+</div><div class='add'>+#define HAVE_DIRENT_H 1</div><div class='add'>+/* #undef HAVE_SYS_NDIR_H */</div><div class='add'>+/* #undef HAVE_SYS_DIR_H */</div><div class='add'>+/* #undef HAVE_NDIR_H */</div><div class='add'>+</div><div class='add'>+#define HAVE_DLFCN_H 1</div><div class='add'>+</div><div class='add'>+#define HAVE_SYS_UTSNAME_H 1</div><div class='add'>+#define HAVE_UNAME 1</div><div class='add'>+</div><div class='add'>+/* These two are needed on DOS-like systems.  Unix does not require them.</div><div class='add'>+ * They are included here for consistency.</div><div class='add'>+ *</div><div class='add'>+#define HAVE_IO_H</div><div class='add'>+#define HAVE_PROCESS_H</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* #undef USE_TERMCAP */</div><div class='add'>+</div><div class='add'>+/* #undef mode_t */</div><div class='add'>+/* #undef uid_t */</div><div class='add'>+/* #undef pid_t */</div><div class='add'>+/* #undef gid_t */</div><div class='add'>+</div><div class='add'>+/* Do we have posix signals? */</div><div class='add'>+#define HAVE_SIGACTION 1</div><div class='add'>+#define HAVE_SIGPROCMASK 1</div><div class='add'>+#define HAVE_SIGEMPTYSET 1</div><div class='add'>+#define HAVE_SIGADDSET 1</div><div class='add'>+</div><div class='add'>+#if defined(HAVE_SIGADDSET) &amp;&amp; defined(HAVE_SIGEMPTYSET)</div><div class='add'>+# if defined(HAVE_SIGACTION) &amp;&amp; defined(HAVE_SIGPROCMASK)</div><div class='add'>+#  define SLANG_POSIX_SIGNALS</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Define if you need to in order for stat and other things to work.  */</div><div class='add'>+/* #undef _POSIX_SOURCE */</div><div class='add'>+</div><div class='add'>+#ifdef _AIX</div><div class='add'>+# ifndef _POSIX_SOURCE</div><div class='add'>+#  define _POSIX_SOURCE 1</div><div class='add'>+# endif</div><div class='add'>+# ifndef _ALL_SOURCE</div><div class='add'>+#  define _ALL_SOURCE</div><div class='add'>+# endif</div><div class='add'>+/* This may generate warnings but the fact is that without it, xlc will </div><div class='add'>+ * INCORRECTLY inline many str* functions. */</div><div class='add'>+/* # undef __STR__ */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* define USE_TERMCAP if you want to use it instead of terminfo. */</div><div class='add'>+#if defined(sequent) || defined(NeXT)</div><div class='add'>+# ifndef USE_TERMCAP</div><div class='add'>+#  define USE_TERMCAP</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(ultrix) &amp;&amp; !defined(__GNUC__)</div><div class='add'>+# ifndef NO_PROTOTYPES</div><div class='add'>+#  define NO_PROTOTYPES</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef unix</div><div class='add'>+# define unix 1</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef __unix__</div><div class='add'>+# define __unix__ 1</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define _SLANG_SOURCE_	1</div><div class='add'>+#endif /* SL_CONFIG_H */</div><div class='head'>diff --git a/mdk-stage1/slang/jdmacros.h b/mdk-stage1/slang/jdmacros.h<br/>new file mode 100644<br/>index 000000000..70d491b78<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/jdmacros.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/jdmacros.h</a></div><div class='hunk'>@@ -0,0 +1,53 @@</div><div class='add'>+#ifndef _JD_MACROS_H_</div><div class='add'>+#define _JD_MACROS_H_</div><div class='add'>+</div><div class='add'>+#ifndef SLMEMSET</div><div class='add'>+# ifdef HAVE_MEMSET</div><div class='add'>+#  define SLMEMSET memset</div><div class='add'>+# else</div><div class='add'>+#  define SLMEMSET SLmemset</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef SLMEMCHR</div><div class='add'>+# ifdef HAVE_MEMCHR</div><div class='add'>+#  define SLMEMCHR memchr</div><div class='add'>+# else</div><div class='add'>+#  define SLMEMCHR SLmemchr</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef SLMEMCPY</div><div class='add'>+# ifdef HAVE_MEMCPY</div><div class='add'>+#  define SLMEMCPY memcpy</div><div class='add'>+# else</div><div class='add'>+#  define SLMEMCPY SLmemcpy</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Note:  HAVE_MEMCMP requires an unsigned memory comparison!!!  */</div><div class='add'>+#ifndef SLMEMCMP</div><div class='add'>+# ifdef HAVE_MEMCMP</div><div class='add'>+#  define SLMEMCMP memcmp</div><div class='add'>+# else</div><div class='add'>+#  define SLMEMCMP SLmemcmp</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef SLFREE</div><div class='add'>+# define SLFREE free</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef SLMALLOC</div><div class='add'>+# define SLMALLOC malloc</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef SLCALLOC</div><div class='add'>+# define SLCALLOC calloc</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef SLREALLOC</div><div class='add'>+# define SLREALLOC realloc</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif				       /* _JD_MACROS_H_ */</div><div class='head'>diff --git a/mdk-stage1/slang/keywhash.c b/mdk-stage1/slang/keywhash.c<br/>new file mode 100644<br/>index 000000000..17d94d5a3<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/keywhash.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/keywhash.c</a></div><div class='hunk'>@@ -0,0 +1,190 @@</div><div class='add'>+/* Perfect hash generated by command line:</div><div class='add'>+ * ./a.out 1</div><div class='add'>+ */</div><div class='add'>+#define MIN_HASH_VALUE	2</div><div class='add'>+#define MAX_HASH_VALUE	118</div><div class='add'>+#define MIN_KEYWORD_LEN 2</div><div class='add'>+#define MAX_KEYWORD_LEN 11</div><div class='add'>+</div><div class='add'>+static unsigned char Keyword_Hash_Table [256] =</div><div class='add'>+{</div><div class='add'>+  119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+  119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+  119,   1, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+    9,   7,   1,   8,   2, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+  119, 119,   0,   0, 119,   0, 119, 119, 119,   7, 119,   0,   0, 119, 119,   0, </div><div class='add'>+  119, 119,   0,   0,   0,   0, 119, 119,   0, 119, 119, 119, 119, 119, 119,   2, </div><div class='add'>+  119,  41,   1,   1,   9,   0,  55,   8,   0,   0, 119,   0,  27,   0,   0,   0, </div><div class='add'>+    7,   2,   0,  21,   0,   0,   0,   3,   2,   0, 119, 119, 119, 119, 119, 119, </div><div class='add'>+  119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+  119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+  119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+  119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+  119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+  119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+  119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, </div><div class='add'>+  119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static unsigned char keyword_hash (char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   unsigned int sum;</div><div class='add'>+</div><div class='add'>+   sum = len;</div><div class='add'>+   while (len)</div><div class='add'>+     {</div><div class='add'>+	len--;</div><div class='add'>+	sum += (unsigned int) Keyword_Hash_Table [(unsigned char)s[len]];</div><div class='add'>+     }</div><div class='add'>+   return sum;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   unsigned int type;</div><div class='add'>+}</div><div class='add'>+Keyword_Table_Type;</div><div class='add'>+</div><div class='add'>+static Keyword_Table_Type Keyword_Table [/* 117 */] =</div><div class='add'>+{</div><div class='add'>+   {"or",	OR_TOKEN},</div><div class='add'>+   {"not",	NOT_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"xor",	BXOR_TOKEN},</div><div class='add'>+   {"return",	RETURN_TOKEN},</div><div class='add'>+   {"exch",	EXCH_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"continue",	CONT_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"do",	DO_TOKEN},</div><div class='add'>+   {"mod",	MOD_TOKEN},</div><div class='add'>+   {"ERROR_BLOCK",	ERRBLK_TOKEN},</div><div class='add'>+   {"USER_BLOCK2",	USRBLK2_TOKEN},</div><div class='add'>+   {"USER_BLOCK4",	USRBLK4_TOKEN},</div><div class='add'>+   {"__tmp",	TMP_TOKEN},</div><div class='add'>+   {"pop",	POP_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"EXIT_BLOCK",	EXITBLK_TOKEN},</div><div class='add'>+   {"USER_BLOCK1",	USRBLK1_TOKEN},</div><div class='add'>+   {"USER_BLOCK3",	USRBLK3_TOKEN},</div><div class='add'>+   {"USER_BLOCK0",	USRBLK0_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"shr",	SHR_TOKEN},</div><div class='add'>+   {"chs",	CHS_TOKEN},</div><div class='add'>+   {"sqr",	SQR_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"struct",	STRUCT_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"switch",	SWITCH_TOKEN},</div><div class='add'>+   {"mul2",	MUL2_TOKEN},</div><div class='add'>+   {"sign",	SIGN_TOKEN},</div><div class='add'>+   {"using",	USING_TOKEN},</div><div class='add'>+   {"while",	WHILE_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"loop",	LOOP_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"public",	PUBLIC_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"break",	BREAK_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"do_while",	DOWHILE_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"shl",	SHL_TOKEN},</div><div class='add'>+   {"else",	ELSE_TOKEN},</div><div class='add'>+   {"and",	AND_TOKEN},</div><div class='add'>+   {"orelse",	ORELSE_TOKEN},</div><div class='add'>+   {"private",	PRIVATE_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"if",	IF_TOKEN},</div><div class='add'>+   {"for",	FOR_TOKEN},</div><div class='add'>+   {"!if",	IFNOT_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"_for",	_FOR_TOKEN},</div><div class='add'>+   {"forever",	FOREVER_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"abs",	ABS_TOKEN},</div><div class='add'>+   {"case",	CASE_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"static",	STATIC_TOKEN},</div><div class='add'>+   {"define",	DEFINE_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"typedef",	TYPEDEF_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"foreach",	FOREACH_TOKEN},</div><div class='add'>+   {"andelse",	ANDELSE_TOKEN},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {NULL,0},</div><div class='add'>+   {"variable",	VARIABLE_TOKEN},</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static Keyword_Table_Type *is_keyword (char *str, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   unsigned int hash;</div><div class='add'>+   char *name;</div><div class='add'>+   Keyword_Table_Type *kw;</div><div class='add'>+</div><div class='add'>+   if ((len &lt; MIN_KEYWORD_LEN)</div><div class='add'>+       || (len &gt; MAX_KEYWORD_LEN))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   hash = keyword_hash (str, len);</div><div class='add'>+   if ((hash &gt; MAX_HASH_VALUE) || (hash &lt; MIN_HASH_VALUE))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   kw = &amp;Keyword_Table[hash - MIN_HASH_VALUE];</div><div class='add'>+   if ((NULL != (name = kw-&gt;name))</div><div class='add'>+       &amp;&amp; (*str == *name)</div><div class='add'>+       &amp;&amp; (0 == strcmp (str, name)))</div><div class='add'>+     return kw;</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/sl-feat.h b/mdk-stage1/slang/sl-feat.h<br/>new file mode 100644<br/>index 000000000..511d72451<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sl-feat.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sl-feat.h</a></div><div class='hunk'>@@ -0,0 +1,60 @@</div><div class='add'>+/* Setting this to 1 enables automatic support for associative arrays.</div><div class='add'>+ * If this is set to 0, an application must explicitly enable associative</div><div class='add'>+ * array support via SLang_init_slassoc.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_HAS_ASSOC_ARRAYS		1</div><div class='add'>+</div><div class='add'>+#define SLANG_HAS_COMPLEX		1</div><div class='add'>+#define SLANG_HAS_FLOAT			1</div><div class='add'>+</div><div class='add'>+/* This is the old space-speed trade off.  To reduce memory usage and code</div><div class='add'>+ * size, set this to zero.</div><div class='add'>+ */</div><div class='add'>+#define _SLANG_OPTIMIZE_FOR_SPEED	2</div><div class='add'>+</div><div class='add'>+#define _SLANG_USE_INLINE_CODE		1</div><div class='add'>+</div><div class='add'>+/* This is experimental.  It adds extra information for tracking down</div><div class='add'>+ * errors.</div><div class='add'>+ */</div><div class='add'>+#define _SLANG_HAS_DEBUG_CODE		1</div><div class='add'>+</div><div class='add'>+/* Allow optimizations based upon the __tmp operator. */</div><div class='add'>+#define _SLANG_USE_TMP_OPTIMIZATION	1</div><div class='add'>+</div><div class='add'>+/* Setting this to one will map 8 bit vtxxx terminals to 7 bit.  Terminals</div><div class='add'>+ * such as the vt320 can be set up to output the two-character escape sequence</div><div class='add'>+ * encoded as 'ESC [' as single character.  Setting this variable to 1 will</div><div class='add'>+ * insert code to map such characters to the 7 bit equivalent.</div><div class='add'>+ * This affects just input characters in the range 128-160 on non PC</div><div class='add'>+ * systems.</div><div class='add'>+ */</div><div class='add'>+#if defined(VMS) || defined(AMIGA)</div><div class='add'>+# define _SLANG_MAP_VTXXX_8BIT	1</div><div class='add'>+#else</div><div class='add'>+# define _SLANG_MAP_VTXXX_8BIT	0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Add support for color terminals that cannot do background color erases</div><div class='add'>+ * Such terminals are poorly designed and are slowly disappearing but they</div><div class='add'>+ * are still quite common.  For example, screen is one of them!</div><div class='add'>+ * </div><div class='add'>+ * This is experimental.  In particular, it is not known to work if </div><div class='add'>+ * KANJI suupport is enabled.</div><div class='add'>+ */</div><div class='add'>+#if !defined(IBMPC_SYSTEM)</div><div class='add'>+# define SLTT_HAS_NON_BCE_SUPPORT	1</div><div class='add'>+#else</div><div class='add'>+# define SLTT_HAS_NON_BCE_SUPPORT	0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* If you want slang to assume that an xterm always has the background color</div><div class='add'>+ * erase feature, then set this to 1.  Otherwise, it will check the terminfo</div><div class='add'>+ * database.  This may or may not be a good idea since most good color xterms</div><div class='add'>+ * support bce but many terminfo systems do not support it.</div><div class='add'>+ */</div><div class='add'>+#define SLTT_XTERM_ALWAYS_BCE		0</div><div class='add'>+  </div><div class='add'>+/* Set this to 1 to enable Kanji support.  See above comment. */</div><div class='add'>+#define SLANG_HAS_KANJI_SUPPORT		0</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slang.c b/mdk-stage1/slang/slang.c<br/>new file mode 100644<br/>index 000000000..6edc7df37<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slang.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slang.c</a></div><div class='hunk'>@@ -0,0 +1,5547 @@</div><div class='add'>+/* -*- mode: C; mode: fold; -*- */</div><div class='add'>+/* slang.c  --- guts of S-Lang interpreter */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+# include &lt;math.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#define USE_COMBINED_BYTECODES	0</div><div class='add'>+</div><div class='add'>+struct _SLBlock_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   struct _SLBlock_Type *body;</div><div class='add'>+   unsigned int num_refs;</div><div class='add'>+}</div><div class='add'>+_SLBlock_Header_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   SLang_Name_Type *next;</div><div class='add'>+   char name_type;</div><div class='add'>+</div><div class='add'>+   union</div><div class='add'>+     {</div><div class='add'>+	_SLBlock_Header_Type *header;    /* body of function */</div><div class='add'>+	char *autoload_filename;</div><div class='add'>+     }</div><div class='add'>+   v;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   char *file;</div><div class='add'>+#endif</div><div class='add'>+#define SLANG_MAX_LOCAL_VARIABLES 254</div><div class='add'>+#define AUTOLOAD_NUM_LOCALS (SLANG_MAX_LOCAL_VARIABLES + 1)</div><div class='add'>+   unsigned char nlocals;	       /* number of local variables */</div><div class='add'>+   unsigned char nargs;		       /* number of arguments */</div><div class='add'>+}</div><div class='add'>+_SLang_Function_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   SLang_Name_Type *next;</div><div class='add'>+   char name_type;</div><div class='add'>+</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+}</div><div class='add'>+SLang_Global_Var_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   SLang_Name_Type *next;</div><div class='add'>+   char name_type;</div><div class='add'>+</div><div class='add'>+   int local_var_number;</div><div class='add'>+}</div><div class='add'>+SLang_Local_Var_Type;</div><div class='add'>+</div><div class='add'>+typedef struct _SLBlock_Type</div><div class='add'>+{</div><div class='add'>+   unsigned char bc_main_type;</div><div class='add'>+   unsigned char bc_sub_type;</div><div class='add'>+   union</div><div class='add'>+     {</div><div class='add'>+	struct _SLBlock_Type *blk;</div><div class='add'>+	int i_blk;</div><div class='add'>+</div><div class='add'>+	SLang_Name_Type *nt_blk;</div><div class='add'>+	SLang_App_Unary_Type *nt_unary_blk;</div><div class='add'>+	SLang_Intrin_Var_Type *nt_ivar_blk;</div><div class='add'>+	SLang_Intrin_Fun_Type *nt_ifun_blk;</div><div class='add'>+	SLang_Global_Var_Type *nt_gvar_blk;</div><div class='add'>+	SLang_IConstant_Type *iconst_blk;</div><div class='add'>+	SLang_DConstant_Type *dconst_blk;</div><div class='add'>+	_SLang_Function_Type *nt_fun_blk;</div><div class='add'>+</div><div class='add'>+	VOID_STAR ptr_blk;</div><div class='add'>+	char *s_blk;</div><div class='add'>+	SLang_BString_Type *bs_blk;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	double *double_blk;		       /*literal double is a pointer */</div><div class='add'>+#endif</div><div class='add'>+	float float_blk;</div><div class='add'>+	long l_blk;</div><div class='add'>+	struct _SLang_Struct_Type *struct_blk;</div><div class='add'>+	int (*call_function)(void);</div><div class='add'>+     }</div><div class='add'>+   b;</div><div class='add'>+}</div><div class='add'>+SLBlock_Type;</div><div class='add'>+</div><div class='add'>+/* Debugging and tracing variables */</div><div class='add'>+</div><div class='add'>+void (*SLang_Enter_Function)(char *) = NULL;</div><div class='add'>+void (*SLang_Exit_Function)(char *) = NULL;</div><div class='add'>+/* If non null, these call C functions before and after a slang function. */</div><div class='add'>+</div><div class='add'>+int _SLang_Trace = 0;</div><div class='add'>+/* If _SLang_Trace = -1, do not trace intrinsics */</div><div class='add'>+static int Trace_Mode = 0;</div><div class='add'>+</div><div class='add'>+static char *Trace_Function;	       /* function to be traced */</div><div class='add'>+int SLang_Traceback = 0;</div><div class='add'>+/* non zero means do traceback.  If less than 0, do not show local variables */</div><div class='add'>+</div><div class='add'>+/* These variables handle _NARGS processing by the parser */</div><div class='add'>+int SLang_Num_Function_Args;</div><div class='add'>+static int *Num_Args_Stack;</div><div class='add'>+static unsigned int Recursion_Depth;</div><div class='add'>+static SLang_Object_Type *Frame_Pointer;</div><div class='add'>+static int Next_Function_Num_Args;</div><div class='add'>+static unsigned int Frame_Pointer_Depth;</div><div class='add'>+static unsigned int *Frame_Pointer_Stack;</div><div class='add'>+</div><div class='add'>+static int Lang_Break_Condition = 0;</div><div class='add'>+/* true if any one below is true.  This keeps us from testing 3 variables.</div><div class='add'>+ * I know this can be perfomed with a bitmapped variable, but...</div><div class='add'>+ */</div><div class='add'>+static int Lang_Break = 0;</div><div class='add'>+static int Lang_Return = 0;</div><div class='add'>+/* static int Lang_Continue = 0; */</div><div class='add'>+</div><div class='add'>+SLang_Object_Type *_SLRun_Stack;</div><div class='add'>+SLang_Object_Type *_SLStack_Pointer;</div><div class='add'>+static SLang_Object_Type *_SLStack_Pointer_Max;</div><div class='add'>+</div><div class='add'>+/* Might want to increase this. */</div><div class='add'>+static SLang_Object_Type Local_Variable_Stack[SLANG_MAX_LOCAL_STACK];</div><div class='add'>+static SLang_Object_Type *Local_Variable_Frame = Local_Variable_Stack;</div><div class='add'>+</div><div class='add'>+static void free_function_header (_SLBlock_Header_Type *);</div><div class='add'>+</div><div class='add'>+void (*SLang_Dump_Routine)(char *);</div><div class='add'>+</div><div class='add'>+static void call_dump_routine (char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+   char buf[1024];</div><div class='add'>+   va_list ap;</div><div class='add'>+</div><div class='add'>+   va_start (ap, fmt);</div><div class='add'>+   if (SLang_Dump_Routine != NULL)</div><div class='add'>+     {</div><div class='add'>+	(void) _SLvsnprintf (buf, sizeof (buf), fmt, ap);</div><div class='add'>+	(*SLang_Dump_Routine) (buf);</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	vfprintf (stderr, fmt, ap);</div><div class='add'>+	fflush (stderr);</div><div class='add'>+     }</div><div class='add'>+   va_end (ap);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_traceback (char *, unsigned int, char *);</div><div class='add'>+static int init_interpreter (void);</div><div class='add'>+</div><div class='add'>+/*{{{ push/pop/etc stack manipulation functions */</div><div class='add'>+</div><div class='add'>+/* This routine is assumed to work even in the presence of a SLang_Error. */</div><div class='add'>+_INLINE_</div><div class='add'>+int SLang_pop (SLang_Object_Type *x)</div><div class='add'>+{</div><div class='add'>+   register SLang_Object_Type *y;</div><div class='add'>+</div><div class='add'>+   y = _SLStack_Pointer;</div><div class='add'>+   if (y == _SLRun_Stack)</div><div class='add'>+     {</div><div class='add'>+	if (SLang_Error == 0) SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+	x-&gt;data_type = 0;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   y--;</div><div class='add'>+   *x = *y;</div><div class='add'>+</div><div class='add'>+   _SLStack_Pointer = y;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_ctrl_integer (int *i)</div><div class='add'>+{</div><div class='add'>+   int type;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   register SLang_Object_Type *y;</div><div class='add'>+</div><div class='add'>+   /* Most of the time, either an integer or a char will be on the stack.</div><div class='add'>+    * Optimize these cases.</div><div class='add'>+    */</div><div class='add'>+   y = _SLStack_Pointer;</div><div class='add'>+   if (y == _SLRun_Stack)</div><div class='add'>+     {</div><div class='add'>+	if (SLang_Error == 0) SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   y--;</div><div class='add'>+   </div><div class='add'>+   type = y-&gt;data_type;</div><div class='add'>+   if (type == SLANG_INT_TYPE)</div><div class='add'>+     {</div><div class='add'>+	_SLStack_Pointer = y;   </div><div class='add'>+	*i = y-&gt;v.int_val;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+   if (type == SLANG_CHAR_TYPE)</div><div class='add'>+     {</div><div class='add'>+	_SLStack_Pointer = y;   </div><div class='add'>+	*i = y-&gt;v.char_val;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+#else</div><div class='add'>+   if (-1 == (type = SLang_peek_at_stack ()))</div><div class='add'>+     return -1;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class ((unsigned char) type);</div><div class='add'>+   if (cl-&gt;cl_to_bool == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_TYPE_MISMATCH,</div><div class='add'>+		      "%s cannot be used in a boolean context",</div><div class='add'>+		      cl-&gt;cl_name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return cl-&gt;cl_to_bool ((unsigned char) type, i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int SLang_peek_at_stack (void)</div><div class='add'>+{</div><div class='add'>+   if (_SLStack_Pointer == _SLRun_Stack)</div><div class='add'>+     {</div><div class='add'>+	if (SLang_Error == 0)</div><div class='add'>+	  SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return (_SLStack_Pointer - 1)-&gt;data_type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_peek_at_stack1 (void)</div><div class='add'>+{</div><div class='add'>+   int type;</div><div class='add'>+</div><div class='add'>+   type = SLang_peek_at_stack ();</div><div class='add'>+   if (type == SLANG_ARRAY_TYPE)</div><div class='add'>+     type = (_SLStack_Pointer - 1)-&gt;v.array_val-&gt;data_type;</div><div class='add'>+</div><div class='add'>+   return type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+void SLang_free_object (SLang_Object_Type *obj)</div><div class='add'>+{</div><div class='add'>+   unsigned char data_type;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (obj == NULL) return;</div><div class='add'>+   data_type = obj-&gt;data_type;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [data_type])</div><div class='add'>+     return;</div><div class='add'>+   if (data_type == SLANG_STRING_TYPE)</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (obj-&gt;v.s_val);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   cl = _SLclass_get_class (data_type);</div><div class='add'>+#if !_SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (cl-&gt;cl_class_type != SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+#endif</div><div class='add'>+     (*cl-&gt;cl_destroy) (data_type, (VOID_STAR) &amp;obj-&gt;v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int SLang_push (SLang_Object_Type *x)</div><div class='add'>+{</div><div class='add'>+   register SLang_Object_Type *y;</div><div class='add'>+   y = _SLStack_Pointer;</div><div class='add'>+</div><div class='add'>+   /* if there is a SLang_Error, probably not much harm will be done</div><div class='add'>+    if it is ignored here */</div><div class='add'>+   /* if (SLang_Error) return; */</div><div class='add'>+</div><div class='add'>+   /* flag it now */</div><div class='add'>+   if (y &gt;= _SLStack_Pointer_Max)</div><div class='add'>+     {</div><div class='add'>+	if (!SLang_Error) SLang_Error = SL_STACK_OVERFLOW;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *y = *x;</div><div class='add'>+   _SLStack_Pointer = y + 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* _INLINE_ */</div><div class='add'>+int SLclass_push_ptr_obj (unsigned char type, VOID_STAR pval)</div><div class='add'>+{</div><div class='add'>+   register SLang_Object_Type *y;</div><div class='add'>+   y = _SLStack_Pointer;</div><div class='add'>+</div><div class='add'>+   if (y &gt;= _SLStack_Pointer_Max)</div><div class='add'>+     {</div><div class='add'>+	if (!SLang_Error) SLang_Error = SL_STACK_OVERFLOW;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   y-&gt;data_type = type;</div><div class='add'>+   y-&gt;v.ptr_val = pval;</div><div class='add'>+</div><div class='add'>+   _SLStack_Pointer = y + 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int SLclass_push_int_obj (unsigned char type, int x)</div><div class='add'>+{</div><div class='add'>+   register SLang_Object_Type *y;</div><div class='add'>+   y = _SLStack_Pointer;</div><div class='add'>+</div><div class='add'>+   if (y &gt;= _SLStack_Pointer_Max)</div><div class='add'>+     {</div><div class='add'>+	if (!SLang_Error) SLang_Error = SL_STACK_OVERFLOW;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   y-&gt;data_type = type;</div><div class='add'>+   y-&gt;v.int_val = x;</div><div class='add'>+</div><div class='add'>+   _SLStack_Pointer = y + 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int _SLang_pop_object_of_type (unsigned char type, SLang_Object_Type *obj,</div><div class='add'>+			       int allow_arrays)</div><div class='add'>+{</div><div class='add'>+   register SLang_Object_Type *y;</div><div class='add'>+</div><div class='add'>+   y = _SLStack_Pointer;</div><div class='add'>+   if (y == _SLRun_Stack)</div><div class='add'>+     return SLang_pop (obj);</div><div class='add'>+   y--;</div><div class='add'>+   if (y-&gt;data_type != type)</div><div class='add'>+     {</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	/* This is an implicit typecast.  We do not want to typecast</div><div class='add'>+	 * floats to ints implicitly.  </div><div class='add'>+	 */</div><div class='add'>+	if (_SLarith_Is_Arith_Type [type]</div><div class='add'>+	    &amp;&amp; _SLarith_Is_Arith_Type [y-&gt;data_type]</div><div class='add'>+	    &amp;&amp; (_SLarith_Is_Arith_Type [type] &gt;= _SLarith_Is_Arith_Type[y-&gt;data_type]))</div><div class='add'>+	  {</div><div class='add'>+	     /* This should not fail */</div><div class='add'>+	     (void) _SLarith_typecast (y-&gt;data_type, (VOID_STAR)&amp;y-&gt;v, 1, </div><div class='add'>+				       type, (VOID_STAR)&amp;obj-&gt;v);</div><div class='add'>+	     obj-&gt;data_type = type;</div><div class='add'>+	     _SLStack_Pointer = y;</div><div class='add'>+	     return 0;</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	</div><div class='add'>+	if ((allow_arrays == 0)</div><div class='add'>+	    || (y-&gt;data_type != SLANG_ARRAY_TYPE)</div><div class='add'>+	    || (y-&gt;v.array_val-&gt;data_type != type))</div><div class='add'>+	  if (-1 == SLclass_typecast (type, 1, 0))</div><div class='add'>+	    return -1;</div><div class='add'>+     }</div><div class='add'>+   *obj = *y;</div><div class='add'>+   _SLStack_Pointer = y;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*  This function reverses the top n items on the stack and returns a</div><div class='add'>+ *  an offset from the start of the stack to the last item.</div><div class='add'>+ */</div><div class='add'>+int SLreverse_stack (int n)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type *otop, *obot, tmp;</div><div class='add'>+</div><div class='add'>+   otop = _SLStack_Pointer;</div><div class='add'>+   if ((n &gt; otop - _SLRun_Stack) || (n &lt; 0))</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   obot = otop - n;</div><div class='add'>+   otop--;</div><div class='add'>+   while (otop &gt; obot)</div><div class='add'>+     {</div><div class='add'>+	tmp = *obot;</div><div class='add'>+	*obot = *otop;</div><div class='add'>+	*otop = tmp;</div><div class='add'>+	otop--;</div><div class='add'>+	obot++;</div><div class='add'>+     }</div><div class='add'>+   return (int) ((_SLStack_Pointer - n) - _SLRun_Stack);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int SLroll_stack (int np)</div><div class='add'>+{</div><div class='add'>+   int n, i;</div><div class='add'>+   SLang_Object_Type *otop, *obot, tmp;</div><div class='add'>+</div><div class='add'>+   if ((n = abs(np)) &lt;= 1) return 0;    /* identity */</div><div class='add'>+</div><div class='add'>+   obot = otop = _SLStack_Pointer;</div><div class='add'>+   i = n;</div><div class='add'>+   while (i != 0)</div><div class='add'>+     {</div><div class='add'>+	if (obot &lt;= _SLRun_Stack)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	obot--;</div><div class='add'>+	i--;</div><div class='add'>+     }</div><div class='add'>+   otop--;</div><div class='add'>+</div><div class='add'>+   if (np &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	/* Put top on bottom and roll rest up. */</div><div class='add'>+	tmp = *otop;</div><div class='add'>+	while (otop &gt; obot)</div><div class='add'>+	  {</div><div class='add'>+	     *otop = *(otop - 1);</div><div class='add'>+	     otop--;</div><div class='add'>+	  }</div><div class='add'>+	*otop = tmp;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	/* Put bottom on top and roll rest down. */</div><div class='add'>+	tmp = *obot;</div><div class='add'>+	while (obot &lt; otop)</div><div class='add'>+	  {</div><div class='add'>+	     *obot = *(obot + 1);</div><div class='add'>+	     obot++;</div><div class='add'>+	  }</div><div class='add'>+	*obot = tmp;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLstack_depth (void)</div><div class='add'>+{</div><div class='add'>+   return (int) (_SLStack_Pointer - _SLRun_Stack);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLdup_n (int n)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type *bot, *top;</div><div class='add'>+</div><div class='add'>+   if (n &lt;= 0)</div><div class='add'>+     return 0;</div><div class='add'>+   </div><div class='add'>+   top = _SLStack_Pointer;</div><div class='add'>+   if (top &lt; _SLRun_Stack + n)</div><div class='add'>+     {</div><div class='add'>+	if (SLang_Error == 0)</div><div class='add'>+	  SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   if (top + n &gt; _SLStack_Pointer_Max)</div><div class='add'>+     {</div><div class='add'>+	if (SLang_Error == 0)</div><div class='add'>+	  SLang_Error = SL_STACK_OVERFLOW;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   bot = top - n;</div><div class='add'>+</div><div class='add'>+   while (bot &lt; top)</div><div class='add'>+     {</div><div class='add'>+	SLang_Class_Type *cl;</div><div class='add'>+	unsigned char data_type = bot-&gt;data_type;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [data_type])</div><div class='add'>+	  {</div><div class='add'>+	     *_SLStack_Pointer++ = *bot++;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	cl = _SLclass_get_class (data_type);</div><div class='add'>+	if (-1 == (*cl-&gt;cl_push) (data_type, (VOID_STAR) &amp;bot-&gt;v))</div><div class='add'>+	  return -1;</div><div class='add'>+	bot++;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ inner interpreter and support functions */</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int _SL_increment_frame_pointer (void)</div><div class='add'>+{</div><div class='add'>+   if (Recursion_Depth &gt;= SLANG_MAX_RECURSIVE_DEPTH)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_STACK_OVERFLOW, "Num Args Stack Overflow");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   Num_Args_Stack [Recursion_Depth] = SLang_Num_Function_Args;</div><div class='add'>+</div><div class='add'>+   SLang_Num_Function_Args = Next_Function_Num_Args;</div><div class='add'>+   Next_Function_Num_Args = 0;</div><div class='add'>+   Recursion_Depth++;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int _SL_decrement_frame_pointer (void)</div><div class='add'>+{</div><div class='add'>+   if (Recursion_Depth == 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_STACK_UNDERFLOW, "Num Args Stack Underflow");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Recursion_Depth--;</div><div class='add'>+   if (Recursion_Depth &lt; SLANG_MAX_RECURSIVE_DEPTH)</div><div class='add'>+     SLang_Num_Function_Args = Num_Args_Stack [Recursion_Depth];</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int SLang_start_arg_list (void)</div><div class='add'>+{</div><div class='add'>+   if (Frame_Pointer_Depth &lt; SLANG_MAX_RECURSIVE_DEPTH)</div><div class='add'>+     {</div><div class='add'>+	Frame_Pointer_Stack [Frame_Pointer_Depth] = (unsigned int) (Frame_Pointer - _SLRun_Stack);</div><div class='add'>+	Frame_Pointer = _SLStack_Pointer;</div><div class='add'>+	Frame_Pointer_Depth++;</div><div class='add'>+	Next_Function_Num_Args = 0;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_verror (SL_STACK_OVERFLOW, "Frame Stack Overflow");</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int SLang_end_arg_list (void)</div><div class='add'>+{</div><div class='add'>+   if (Frame_Pointer_Depth == 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_STACK_UNDERFLOW, "Frame Stack Underflow");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   Frame_Pointer_Depth--;</div><div class='add'>+   if (Frame_Pointer_Depth &lt; SLANG_MAX_RECURSIVE_DEPTH)</div><div class='add'>+     {</div><div class='add'>+	Next_Function_Num_Args = (int) (_SLStack_Pointer - Frame_Pointer);</div><div class='add'>+	Frame_Pointer = _SLRun_Stack + Frame_Pointer_Stack [Frame_Pointer_Depth];</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static int do_bc_call_direct_frame (int (*f)(void))</div><div class='add'>+{</div><div class='add'>+   if ((0 == SLang_end_arg_list ())</div><div class='add'>+       &amp;&amp; (0 == _SL_increment_frame_pointer ()))</div><div class='add'>+     {</div><div class='add'>+	(void) (*f) ();</div><div class='add'>+	_SL_decrement_frame_pointer ();</div><div class='add'>+     }</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     return -1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int do_name_type_error (SLang_Name_Type *nt)</div><div class='add'>+{</div><div class='add'>+   char buf[256];</div><div class='add'>+   if (nt != NULL)</div><div class='add'>+     {</div><div class='add'>+	(void) _SLsnprintf (buf, sizeof (buf), "(Error occurred processing %s)", nt-&gt;name);</div><div class='add'>+	do_traceback (buf, 0, NULL);</div><div class='add'>+     }</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* local and global variable assignments */</div><div class='add'>+</div><div class='add'>+static int do_binary_ab (int op, SLang_Object_Type *obja, SLang_Object_Type *objb)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *a_cl, *b_cl, *c_cl;</div><div class='add'>+   unsigned char b_data_type, a_data_type, c_data_type;</div><div class='add'>+   int (*binary_fun) (int,</div><div class='add'>+		      unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+		      unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+		      VOID_STAR);</div><div class='add'>+   VOID_STAR pa;</div><div class='add'>+   VOID_STAR pb;</div><div class='add'>+   VOID_STAR pc;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   b_data_type = objb-&gt;data_type;</div><div class='add'>+   a_data_type = obja-&gt;data_type;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (_SLarith_Is_Arith_Type[a_data_type]</div><div class='add'>+       &amp;&amp; _SLarith_Is_Arith_Type[b_data_type])</div><div class='add'>+     {</div><div class='add'>+	int status;</div><div class='add'>+	status = _SLarith_bin_op (obja, objb, op);</div><div class='add'>+	if (status != 1)</div><div class='add'>+	  return status;</div><div class='add'>+	/* drop and try it the hard way */</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   a_cl = _SLclass_get_class (a_data_type);</div><div class='add'>+   if (a_data_type == b_data_type)</div><div class='add'>+     b_cl = a_cl;</div><div class='add'>+   else</div><div class='add'>+     b_cl = _SLclass_get_class (b_data_type);</div><div class='add'>+</div><div class='add'>+   if (NULL == (binary_fun = _SLclass_get_binary_fun (op, a_cl, b_cl, &amp;c_cl, 1)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   c_data_type = c_cl-&gt;cl_data_type;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [a_data_type])</div><div class='add'>+     pa = (VOID_STAR) &amp;obja-&gt;v;</div><div class='add'>+   else</div><div class='add'>+#endif</div><div class='add'>+     pa = _SLclass_get_ptr_to_value (a_cl, obja);</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [b_data_type])</div><div class='add'>+     pb = (VOID_STAR) &amp;objb-&gt;v;</div><div class='add'>+   else</div><div class='add'>+#endif</div><div class='add'>+     pb = _SLclass_get_ptr_to_value (b_cl, objb);</div><div class='add'>+</div><div class='add'>+   pc = c_cl-&gt;cl_transfer_buf;</div><div class='add'>+</div><div class='add'>+   if (1 != (*binary_fun) (op,</div><div class='add'>+			   a_data_type, pa, 1,</div><div class='add'>+			   b_data_type, pb, 1,</div><div class='add'>+			   pc))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "Binary operation between %s and %s failed",</div><div class='add'>+		      a_cl-&gt;cl_name, b_cl-&gt;cl_name);</div><div class='add'>+</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* apush will create a copy, so make sure we free after the push */</div><div class='add'>+   ret = (*c_cl-&gt;cl_apush)(c_data_type, pc);</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [c_data_type])</div><div class='add'>+#endif</div><div class='add'>+     (*c_cl-&gt;cl_adestroy)(c_data_type, pc);</div><div class='add'>+</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static void do_binary (int op)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obja, objb;</div><div class='add'>+</div><div class='add'>+   if (SLang_pop (&amp;objb)) return;</div><div class='add'>+   if (0 == SLang_pop (&amp;obja))</div><div class='add'>+     {</div><div class='add'>+	(void) do_binary_ab (op, &amp;obja, &amp;objb);</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [obja.data_type])</div><div class='add'>+#endif</div><div class='add'>+	  SLang_free_object (&amp;obja);</div><div class='add'>+     }</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [objb.data_type])</div><div class='add'>+#endif</div><div class='add'>+     SLang_free_object (&amp;objb);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int do_unary_op (int op, SLang_Object_Type *obj, int unary_type)</div><div class='add'>+{</div><div class='add'>+   int (*f) (int, unsigned char, VOID_STAR, unsigned int, VOID_STAR);</div><div class='add'>+   VOID_STAR pa;</div><div class='add'>+   VOID_STAR pb;</div><div class='add'>+   SLang_Class_Type *a_cl, *b_cl;</div><div class='add'>+   unsigned char a_type, b_type;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   a_type = obj-&gt;data_type;</div><div class='add'>+   a_cl = _SLclass_get_class (a_type);</div><div class='add'>+</div><div class='add'>+   if (NULL == (f = _SLclass_get_unary_fun (op, a_cl, &amp;b_cl, unary_type)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   b_type = b_cl-&gt;cl_data_type;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [a_type])</div><div class='add'>+     pa = (VOID_STAR) &amp;obj-&gt;v;</div><div class='add'>+   else</div><div class='add'>+#endif</div><div class='add'>+     pa = _SLclass_get_ptr_to_value (a_cl, obj);</div><div class='add'>+</div><div class='add'>+   pb = b_cl-&gt;cl_transfer_buf;</div><div class='add'>+</div><div class='add'>+   if (1 != (*f) (op, a_type, pa, 1, pb))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "Unary operation for %s failed", a_cl-&gt;cl_name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   ret = (*b_cl-&gt;cl_apush)(b_type, pb);</div><div class='add'>+   /* cl_apush creates a copy, so make sure we call cl_adestroy */</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [b_type])</div><div class='add'>+#endif</div><div class='add'>+     (*b_cl-&gt;cl_adestroy)(b_type, pb);</div><div class='add'>+</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static int do_unary (int op, int unary_type)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop (&amp;obj)) return -1;</div><div class='add'>+   ret = do_unary_op (op, &amp;obj, unary_type);</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [obj.data_type])</div><div class='add'>+#endif</div><div class='add'>+     SLang_free_object (&amp;obj);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int do_assignment_binary (int op, SLang_Object_Type *obja_ptr)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type objb;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   if (SLang_pop (&amp;objb))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   ret = do_binary_ab (op, obja_ptr, &amp;objb);</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [objb.data_type])</div><div class='add'>+#endif</div><div class='add'>+     SLang_free_object (&amp;objb);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* The order of these is assumed to match the binary operators</div><div class='add'>+ * defined in slang.h</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+map_assignment_op_to_binary (unsigned char op_type, int *op, int *is_unary)</div><div class='add'>+{</div><div class='add'>+   *is_unary = 0;</div><div class='add'>+   switch (op_type)</div><div class='add'>+     {</div><div class='add'>+      case _SLANG_BCST_PLUSEQS:</div><div class='add'>+      case _SLANG_BCST_MINUSEQS:</div><div class='add'>+      case _SLANG_BCST_TIMESEQS:</div><div class='add'>+      case _SLANG_BCST_DIVEQS:</div><div class='add'>+	*op = SLANG_PLUS + (op_type - _SLANG_BCST_PLUSEQS);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_BOREQS:</div><div class='add'>+	*op = SLANG_BOR;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_BANDEQS:</div><div class='add'>+	*op = SLANG_BAND;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_POST_MINUSMINUS:</div><div class='add'>+      case _SLANG_BCST_MINUSMINUS:</div><div class='add'>+	*op = SLANG_MINUS;</div><div class='add'>+	*is_unary = 1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_PLUSPLUS:</div><div class='add'>+      case _SLANG_BCST_POST_PLUSPLUS:</div><div class='add'>+	*op = SLANG_PLUS;</div><div class='add'>+	*is_unary = 1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED, "Assignment operator not implemented");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+perform_lvalue_operation (unsigned char op_type, SLang_Object_Type *obja_ptr)</div><div class='add'>+{</div><div class='add'>+   switch (op_type)</div><div class='add'>+     {</div><div class='add'>+      case _SLANG_BCST_ASSIGN:</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+	/* The order of these is assumed to match the binary operators</div><div class='add'>+	 * defined in slang.h</div><div class='add'>+	 */</div><div class='add'>+      case _SLANG_BCST_PLUSEQS:</div><div class='add'>+      case _SLANG_BCST_MINUSEQS:</div><div class='add'>+      case _SLANG_BCST_TIMESEQS:</div><div class='add'>+      case _SLANG_BCST_DIVEQS:</div><div class='add'>+	if (-1 == do_assignment_binary (SLANG_PLUS + (op_type - _SLANG_BCST_PLUSEQS), obja_ptr))</div><div class='add'>+	  return -1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_BOREQS:</div><div class='add'>+	if (-1 == do_assignment_binary (SLANG_BOR, obja_ptr))</div><div class='add'>+	  return -1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_BANDEQS:</div><div class='add'>+	if (-1 == do_assignment_binary (SLANG_BAND, obja_ptr))</div><div class='add'>+	  return -1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_PLUSPLUS:</div><div class='add'>+      case _SLANG_BCST_POST_PLUSPLUS:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	if (obja_ptr-&gt;data_type == SLANG_INT_TYPE)</div><div class='add'>+	  return SLclass_push_int_obj (SLANG_INT_TYPE, obja_ptr-&gt;v.int_val + 1);</div><div class='add'>+#endif</div><div class='add'>+	if (-1 == do_unary_op (SLANG_PLUSPLUS, obja_ptr, _SLANG_BC_UNARY))</div><div class='add'>+	  return -1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_MINUSMINUS:</div><div class='add'>+      case _SLANG_BCST_POST_MINUSMINUS:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	if (obja_ptr-&gt;data_type == SLANG_INT_TYPE)</div><div class='add'>+	  return SLclass_push_int_obj (SLANG_INT_TYPE, obja_ptr-&gt;v.int_val - 1);</div><div class='add'>+#endif</div><div class='add'>+	if (-1 == do_unary_op (SLANG_MINUSMINUS, obja_ptr, _SLANG_BC_UNARY))</div><div class='add'>+	  return -1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static int</div><div class='add'>+set_lvalue_obj (unsigned char op_type, SLang_Object_Type *obja_ptr)</div><div class='add'>+{</div><div class='add'>+   if (op_type != _SLANG_BCST_ASSIGN)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == perform_lvalue_operation (op_type, obja_ptr))</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [obja_ptr-&gt;data_type])</div><div class='add'>+#endif</div><div class='add'>+     SLang_free_object (obja_ptr);</div><div class='add'>+</div><div class='add'>+   return SLang_pop(obja_ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+set_struct_lvalue (SLBlock_Type *bc_blk)</div><div class='add'>+{</div><div class='add'>+   int type;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   char *name;</div><div class='add'>+   int op;</div><div class='add'>+</div><div class='add'>+   if (-1 == (type = SLang_peek_at_stack ()))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   if ((cl-&gt;cl_sput == NULL)</div><div class='add'>+       || (cl-&gt;cl_sget == NULL))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "%s does not support structure access",</div><div class='add'>+		      cl-&gt;cl_name);</div><div class='add'>+	SLdo_pop_n (2);		       /* object plus what was to be assigned */</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   name = bc_blk-&gt;b.s_blk;</div><div class='add'>+   op = bc_blk-&gt;bc_sub_type;</div><div class='add'>+</div><div class='add'>+   if (op != _SLANG_BCST_ASSIGN)</div><div class='add'>+     {</div><div class='add'>+	/* We have something like (A.x += b) or (A.x++).  In either case,</div><div class='add'>+	 * we need A.x.</div><div class='add'>+	 */</div><div class='add'>+	SLang_Object_Type obj_A;</div><div class='add'>+	SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+	if (-1 == SLang_pop (&amp;obj_A))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	if ((-1 == _SLpush_slang_obj (&amp;obj_A))</div><div class='add'>+	    || (-1 == cl-&gt;cl_sget ((unsigned char) type, name))</div><div class='add'>+	    || (-1 == SLang_pop (&amp;obj)))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_object (&amp;obj_A);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	/* Now the value of A.x is in obj. */</div><div class='add'>+	if (-1 == perform_lvalue_operation (op, &amp;obj))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_object (&amp;obj);</div><div class='add'>+	     SLang_free_object (&amp;obj_A);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	SLang_free_object (&amp;obj);</div><div class='add'>+	/* The result of the operation is now on the stack.</div><div class='add'>+	 * Perform assignment */</div><div class='add'>+	if (-1 == SLang_push (&amp;obj_A))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_object (&amp;obj_A);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return (*cl-&gt;cl_sput) ((unsigned char) type, name);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int make_unit_object (SLang_Object_Type *a, SLang_Object_Type *u)</div><div class='add'>+{</div><div class='add'>+   unsigned char type;</div><div class='add'>+   </div><div class='add'>+   type = a-&gt;data_type;</div><div class='add'>+   if (type == SLANG_ARRAY_TYPE)</div><div class='add'>+     type = a-&gt;v.array_val-&gt;data_type;</div><div class='add'>+   </div><div class='add'>+   u-&gt;data_type = type;</div><div class='add'>+   switch (type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_UCHAR_TYPE:</div><div class='add'>+      case SLANG_CHAR_TYPE:</div><div class='add'>+	u-&gt;v.char_val = 1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_SHORT_TYPE:</div><div class='add'>+      case SLANG_USHORT_TYPE:</div><div class='add'>+	u-&gt;v.short_val = 1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_LONG_TYPE:</div><div class='add'>+      case SLANG_ULONG_TYPE:</div><div class='add'>+	u-&gt;v.long_val = 1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+      case SLANG_FLOAT_TYPE:</div><div class='add'>+	u-&gt;v.float_val = 1;</div><div class='add'>+	break;</div><div class='add'>+	</div><div class='add'>+      case SLANG_COMPLEX_TYPE:</div><div class='add'>+	u-&gt;data_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+      case SLANG_DOUBLE_TYPE:</div><div class='add'>+	u-&gt;v.double_val = 1;</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+      default:</div><div class='add'>+	u-&gt;data_type = SLANG_INT_TYPE;</div><div class='add'>+	u-&gt;v.int_val = 1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* We want to convert 'A[i] op X' to 'A[i] = A[i] op X'.  The code that</div><div class='add'>+ * has been generated is:  X __args i A __aput-op</div><div class='add'>+ * where __aput-op represents this function.  We need to generate:</div><div class='add'>+ * __args i A __eargs __aget X op __args i A __eargs __aput</div><div class='add'>+ * Here, __eargs implies a call to do_bc_call_direct_frame with either</div><div class='add'>+ * the aput or aget function.  In addition, __args represents a call to </div><div class='add'>+ * SLang_start_arg_list.  Of course, i represents a set of indices.</div><div class='add'>+ * </div><div class='add'>+ * Note: If op is an unary operation (e.g., ++ or --), then X will not</div><div class='add'>+ * b present an will have to be taken to be 1.</div><div class='add'>+ * </div><div class='add'>+ * Implementation note: For efficiency, calls to setup the frame, start</div><div class='add'>+ * arg list will be omitted and SLang_Num_Function_Args will be set.</div><div class='add'>+ * This is ugly but the alternative is much less efficient rendering these</div><div class='add'>+ * assignment operators useless.  So, the plan is to roll the stack to get X,</div><div class='add'>+ * then duplicate the next N values, call __aget followed by op X, finally</div><div class='add'>+ * calling __aput.  Hence, the sequence is:</div><div class='add'>+ * </div><div class='add'>+ *     start:   X i .. j A </div><div class='add'>+ *      dupN:   X i .. j A i .. j A</div><div class='add'>+ *    __aget:   X i .. j A Y</div><div class='add'>+ *      roll:   i .. j A Y X</div><div class='add'>+ *        op:   i .. j A Z</div><div class='add'>+ *      roll:   Z i .. j A</div><div class='add'>+ *    __aput:</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+set_array_lvalue (int op)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type x, y;</div><div class='add'>+   int num_args, is_unary;</div><div class='add'>+</div><div class='add'>+   if (-1 == map_assignment_op_to_binary (op, &amp;op, &amp;is_unary))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* Grab the indices and the array.  Do not start a new frame. */</div><div class='add'>+   if (-1 == SLang_end_arg_list ())</div><div class='add'>+     return -1;</div><div class='add'>+   num_args = Next_Function_Num_Args;</div><div class='add'>+   Next_Function_Num_Args = 0;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLdup_n (num_args))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   SLang_Num_Function_Args = num_args;</div><div class='add'>+   if (-1 == _SLarray_aget ())</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop (&amp;y))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   if (is_unary == 0)</div><div class='add'>+     {</div><div class='add'>+	if ((-1 == SLroll_stack (-(num_args + 1)))</div><div class='add'>+	    || (-1 == SLang_pop (&amp;x)))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_object (&amp;y);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   else if (-1 == make_unit_object (&amp;y, &amp;x))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_object (&amp;y);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (-1 == do_binary_ab (op, &amp;y, &amp;x))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_object (&amp;y);</div><div class='add'>+	SLang_free_object (&amp;x);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [y.data_type])</div><div class='add'>+#endif</div><div class='add'>+     SLang_free_object (&amp;y);</div><div class='add'>+   </div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [x.data_type])</div><div class='add'>+#endif</div><div class='add'>+     SLang_free_object (&amp;x);</div><div class='add'>+</div><div class='add'>+   if (-1 == SLroll_stack (num_args + 1))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   SLang_Num_Function_Args = num_args;</div><div class='add'>+   return _SLarray_aput ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+set_intrin_lvalue (SLBlock_Type *bc_blk)</div><div class='add'>+{</div><div class='add'>+   unsigned char op_type;</div><div class='add'>+   SLang_Object_Type obja;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   SLang_Intrin_Var_Type *ivar;</div><div class='add'>+   VOID_STAR intrinsic_addr;</div><div class='add'>+   unsigned char intrinsic_type;</div><div class='add'>+</div><div class='add'>+   ivar = bc_blk-&gt;b.nt_ivar_blk;</div><div class='add'>+</div><div class='add'>+   intrinsic_type = ivar-&gt;type;</div><div class='add'>+   intrinsic_addr = ivar-&gt;addr;</div><div class='add'>+</div><div class='add'>+   op_type = bc_blk-&gt;bc_sub_type;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (intrinsic_type);</div><div class='add'>+</div><div class='add'>+   if (op_type != _SLANG_BCST_ASSIGN)</div><div class='add'>+     {</div><div class='add'>+	/* We want to get the current value into obja.  This is the</div><div class='add'>+	 * easiest way.</div><div class='add'>+	 */</div><div class='add'>+	if ((-1 == (*cl-&gt;cl_push) (intrinsic_type, intrinsic_addr))</div><div class='add'>+	    || (-1 == SLang_pop (&amp;obja)))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	(void) perform_lvalue_operation (op_type, &amp;obja);</div><div class='add'>+	SLang_free_object (&amp;obja);</div><div class='add'>+</div><div class='add'>+	if (SLang_Error)</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return (*cl-&gt;cl_pop) (intrinsic_type, intrinsic_addr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_deref_assign (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type *objp;</div><div class='add'>+   SLang_Name_Type *nt;</div><div class='add'>+   SLBlock_Type blk;</div><div class='add'>+</div><div class='add'>+   if (ref-&gt;is_global == 0)</div><div class='add'>+     {</div><div class='add'>+	objp = ref-&gt;v.local_obj;</div><div class='add'>+	if (objp &gt; Local_Variable_Frame)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_UNDEFINED_NAME, "Local variable reference is out of scope");</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	return set_lvalue_obj (_SLANG_BCST_ASSIGN, objp);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   nt = ref-&gt;v.nt;</div><div class='add'>+   switch (nt-&gt;name_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_GVARIABLE:</div><div class='add'>+      case SLANG_PVARIABLE:</div><div class='add'>+	if (-1 == set_lvalue_obj (_SLANG_BCST_ASSIGN,</div><div class='add'>+				  &amp;((SLang_Global_Var_Type *)nt)-&gt;obj))</div><div class='add'>+	  {</div><div class='add'>+	     do_name_type_error (nt);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_IVARIABLE:</div><div class='add'>+	blk.b.nt_blk = nt;</div><div class='add'>+	blk.bc_sub_type = _SLANG_BCST_ASSIGN;</div><div class='add'>+	if (-1 == set_intrin_lvalue (&amp;blk))</div><div class='add'>+	  {</div><div class='add'>+	     do_name_type_error (nt);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_LVARIABLE:</div><div class='add'>+	SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+	/* set_intrin_lvalue (&amp;blk); */</div><div class='add'>+	return -1;</div><div class='add'>+</div><div class='add'>+      case SLANG_RVARIABLE:</div><div class='add'>+      default:</div><div class='add'>+	SLang_verror (SL_READONLY_ERROR, "deref assignment to %s not allowed", nt-&gt;name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void set_deref_lvalue (SLBlock_Type *bc_blk)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type *objp;</div><div class='add'>+   SLang_Ref_Type *ref;</div><div class='add'>+</div><div class='add'>+   switch (bc_blk-&gt;bc_sub_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_LVARIABLE:</div><div class='add'>+	objp =  (Local_Variable_Frame - bc_blk-&gt;b.i_blk);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_GVARIABLE:</div><div class='add'>+      case SLANG_PVARIABLE:</div><div class='add'>+	objp = &amp;bc_blk-&gt;b.nt_gvar_blk-&gt;obj;</div><div class='add'>+	break;</div><div class='add'>+      default:</div><div class='add'>+	SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLpush_slang_obj (objp))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_ref (&amp;ref))</div><div class='add'>+     return;</div><div class='add'>+   (void) _SLang_deref_assign (ref);</div><div class='add'>+   SLang_free_ref (ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_struct_field (char *name)</div><div class='add'>+{</div><div class='add'>+   int type;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (-1 == (type = SLang_peek_at_stack ()))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class ((unsigned char) type);</div><div class='add'>+   if (cl-&gt;cl_sget == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "%s does not permit structure access",</div><div class='add'>+		      cl-&gt;cl_name);</div><div class='add'>+	SLdo_pop_n (2);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return (*cl-&gt;cl_sget) ((unsigned char) type, name);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void trace_dump (char *format, char *name, SLang_Object_Type *objs, int n, int dir)</div><div class='add'>+{</div><div class='add'>+   unsigned int len;</div><div class='add'>+   char prefix [52];</div><div class='add'>+</div><div class='add'>+   len = Trace_Mode - 1;</div><div class='add'>+   if (len + 2 &gt;= sizeof (prefix))</div><div class='add'>+     len = sizeof (prefix) - 2;</div><div class='add'>+</div><div class='add'>+   SLMEMSET (prefix, ' ', len);</div><div class='add'>+   prefix[len] = 0;</div><div class='add'>+</div><div class='add'>+   call_dump_routine (prefix);</div><div class='add'>+   call_dump_routine (format, name, n);</div><div class='add'>+</div><div class='add'>+   if (n &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	prefix[len] = ' ';</div><div class='add'>+	len++;</div><div class='add'>+	prefix[len] = 0;</div><div class='add'>+</div><div class='add'>+	_SLdump_objects (prefix, objs, n, dir);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*  Pop a data item from the stack and return a pointer to it.</div><div class='add'>+ *  Strings are not freed from stack so use another routine to do it.</div><div class='add'>+ */</div><div class='add'>+static VOID_STAR pop_pointer (SLang_Object_Type *obj, unsigned char type)</div><div class='add'>+{</div><div class='add'>+#ifndef _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   /* Arrays are special.  Allow scalars to automatically convert to arrays.</div><div class='add'>+    */</div><div class='add'>+   if (type == SLANG_ARRAY_TYPE)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLang_pop_array (&amp;at, 1))</div><div class='add'>+	  return NULL;</div><div class='add'>+	obj-&gt;data_type = SLANG_ARRAY_TYPE;</div><div class='add'>+	return obj-&gt;v.ptr_val = (VOID_STAR) at;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (type == 0)</div><div class='add'>+     {</div><div class='add'>+	/* This happens when an intrinsic is declared without any information</div><div class='add'>+	 * regarding parameter types.</div><div class='add'>+	 */</div><div class='add'>+	if (-1 == SLang_pop (obj))</div><div class='add'>+	  return NULL;</div><div class='add'>+	type = obj-&gt;data_type;</div><div class='add'>+     }</div><div class='add'>+   else if (-1 == _SLang_pop_object_of_type (type, obj, 0))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   type = _SLclass_Class_Type [type];</div><div class='add'>+#else</div><div class='add'>+   type = _SLclass_get_class (type)-&gt;cl_class_type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+     return (VOID_STAR) &amp;obj-&gt;v;</div><div class='add'>+   else if (type == SLANG_CLASS_TYPE_MMT)</div><div class='add'>+     return SLang_object_from_mmt (obj-&gt;v.ref);</div><div class='add'>+   else</div><div class='add'>+     return obj-&gt;v.ptr_val;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is ugly.  Does anyone have a advice for a cleaner way of doing</div><div class='add'>+ * this??</div><div class='add'>+ */</div><div class='add'>+typedef void (*VF0_Type)(void);</div><div class='add'>+typedef void (*VF1_Type)(VOID_STAR);</div><div class='add'>+typedef void (*VF2_Type)(VOID_STAR, VOID_STAR);</div><div class='add'>+typedef void (*VF3_Type)(VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef void (*VF4_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef void (*VF5_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef void (*VF6_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef void (*VF7_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef long (*LF0_Type)(void);</div><div class='add'>+typedef long (*LF1_Type)(VOID_STAR);</div><div class='add'>+typedef long (*LF2_Type)(VOID_STAR, VOID_STAR);</div><div class='add'>+typedef long (*LF3_Type)(VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef long (*LF4_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef long (*LF5_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef long (*LF6_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef long (*LF7_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+typedef double (*FF0_Type)(void);</div><div class='add'>+typedef double (*FF1_Type)(VOID_STAR);</div><div class='add'>+typedef double (*FF2_Type)(VOID_STAR, VOID_STAR);</div><div class='add'>+typedef double (*FF3_Type)(VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef double (*FF4_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef double (*FF5_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef double (*FF6_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+typedef double (*FF7_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int execute_intrinsic_fun (SLang_Intrin_Fun_Type *objf)</div><div class='add'>+{</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   double xf;</div><div class='add'>+#endif</div><div class='add'>+   VOID_STAR p[SLANG_MAX_INTRIN_ARGS];</div><div class='add'>+   SLang_Object_Type objs[SLANG_MAX_INTRIN_ARGS];</div><div class='add'>+   long ret;</div><div class='add'>+   unsigned char type;</div><div class='add'>+   unsigned int argc;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   FVOID_STAR fptr;</div><div class='add'>+   unsigned char *arg_types;</div><div class='add'>+   int stk_depth;</div><div class='add'>+</div><div class='add'>+   fptr = objf-&gt;i_fun;</div><div class='add'>+   argc = objf-&gt;num_args;</div><div class='add'>+   type = objf-&gt;return_type;</div><div class='add'>+   arg_types = objf-&gt;arg_types;</div><div class='add'>+</div><div class='add'>+   if (argc &gt; SLANG_MAX_INTRIN_ARGS)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror(SL_APPLICATION_ERROR,</div><div class='add'>+		     "Intrinsic function %s requires too many parameters", objf-&gt;name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == _SL_increment_frame_pointer ())</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   stk_depth = -1;</div><div class='add'>+   if (Trace_Mode &amp;&amp; (_SLang_Trace &gt; 0))</div><div class='add'>+     {</div><div class='add'>+	int nargs;</div><div class='add'>+</div><div class='add'>+	stk_depth = _SLstack_depth ();</div><div class='add'>+</div><div class='add'>+	nargs = SLang_Num_Function_Args;</div><div class='add'>+	if (nargs == 0)</div><div class='add'>+	  nargs = (int)argc;</div><div class='add'>+</div><div class='add'>+	stk_depth -= nargs;</div><div class='add'>+</div><div class='add'>+	if (stk_depth &gt;= 0)</div><div class='add'>+	  trace_dump ("&gt;&gt;%s (%d args)\n",</div><div class='add'>+		      objf-&gt;name,</div><div class='add'>+		      _SLStack_Pointer - nargs,</div><div class='add'>+		      nargs,</div><div class='add'>+		      1);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   i = argc;</div><div class='add'>+   while (i != 0)</div><div class='add'>+     {</div><div class='add'>+	i--;</div><div class='add'>+	if (NULL == (p[i] = pop_pointer (objs + i, arg_types[i])))</div><div class='add'>+	  {</div><div class='add'>+	     i++;</div><div class='add'>+	     goto free_and_return;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   ret = 0;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   xf = 0.0;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   switch (argc)</div><div class='add'>+     {</div><div class='add'>+      case 0:</div><div class='add'>+	if (type == SLANG_VOID_TYPE) ((VF0_Type) fptr) ();</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	else if (type == SLANG_DOUBLE_TYPE) xf = ((FF0_Type) fptr)();</div><div class='add'>+#endif</div><div class='add'>+	else ret = ((LF0_Type) fptr)();</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 1:</div><div class='add'>+	if (type == SLANG_VOID_TYPE) ((VF1_Type) fptr)(p[0]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	else if (type == SLANG_DOUBLE_TYPE) xf =  ((FF1_Type) fptr)(p[0]);</div><div class='add'>+#endif</div><div class='add'>+	else ret =  ((LF1_Type) fptr)(p[0]);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 2:</div><div class='add'>+	if (type == SLANG_VOID_TYPE)  ((VF2_Type) fptr)(p[0], p[1]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	else if (type == SLANG_DOUBLE_TYPE) xf = ((FF2_Type) fptr)(p[0], p[1]);</div><div class='add'>+#endif</div><div class='add'>+	else ret = ((LF2_Type) fptr)(p[0], p[1]);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 3:</div><div class='add'>+	if (type == SLANG_VOID_TYPE) ((VF3_Type) fptr)(p[0], p[1], p[2]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	else if (type == SLANG_DOUBLE_TYPE) xf = ((FF3_Type) fptr)(p[0], p[1], p[2]);</div><div class='add'>+#endif</div><div class='add'>+	else ret = ((LF3_Type) fptr)(p[0], p[1], p[2]);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 4:</div><div class='add'>+	if (type == SLANG_VOID_TYPE) ((VF4_Type) fptr)(p[0], p[1], p[2], p[3]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	else if (type == SLANG_DOUBLE_TYPE) xf = ((FF4_Type) fptr)(p[0], p[1], p[2], p[3]);</div><div class='add'>+#endif</div><div class='add'>+	else ret = ((LF4_Type) fptr)(p[0], p[1], p[2], p[3]);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 5:</div><div class='add'>+	if (type == SLANG_VOID_TYPE) ((VF5_Type) fptr)(p[0], p[1], p[2], p[3], p[4]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	else if (type == SLANG_DOUBLE_TYPE) xf = ((FF5_Type) fptr)(p[0], p[1], p[2], p[3], p[4]);</div><div class='add'>+#endif</div><div class='add'>+	else ret = ((LF5_Type) fptr)(p[0], p[1], p[2], p[3], p[4]);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 6:</div><div class='add'>+	if (type == SLANG_VOID_TYPE) ((VF6_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	else if (type == SLANG_DOUBLE_TYPE) xf = ((FF6_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5]);</div><div class='add'>+#endif</div><div class='add'>+	else ret = ((LF6_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5]);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 7:</div><div class='add'>+	if (type == SLANG_VOID_TYPE) ((VF7_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5], p[6]);</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	else if (type == SLANG_DOUBLE_TYPE) xf = ((FF7_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5], p[6]);</div><div class='add'>+#endif</div><div class='add'>+	else ret = ((LF7_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5], p[6]);</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   switch (type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_VOID_TYPE:</div><div class='add'>+	break;</div><div class='add'>+	</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+      case SLANG_DOUBLE_TYPE:</div><div class='add'>+	(void) SLang_push_double (xf);</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+      case SLANG_UINT_TYPE:</div><div class='add'>+      case SLANG_INT_TYPE: (void) SLclass_push_int_obj (type, (int) ret);</div><div class='add'>+	break;</div><div class='add'>+	</div><div class='add'>+      case SLANG_CHAR_TYPE:</div><div class='add'>+      case SLANG_UCHAR_TYPE: (void) SLclass_push_char_obj (type, (char) ret);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_SHORT_TYPE:</div><div class='add'>+      case SLANG_USHORT_TYPE: (void) SLclass_push_short_obj (type, (short) ret);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_LONG_TYPE:</div><div class='add'>+      case SLANG_ULONG_TYPE: (void) SLclass_push_long_obj (type, ret);</div><div class='add'>+	break;</div><div class='add'>+	</div><div class='add'>+      case SLANG_STRING_TYPE:</div><div class='add'>+	if (NULL == (char *)ret)</div><div class='add'>+	  {</div><div class='add'>+	     if (SLang_Error == 0) SLang_Error = SL_INTRINSIC_ERROR;</div><div class='add'>+	  }</div><div class='add'>+	else (void) SLang_push_string ((char *)ret);</div><div class='add'>+	break;</div><div class='add'>+	</div><div class='add'>+      default:</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "Support for intrinsic functions returning %s is not provided",</div><div class='add'>+		      SLclass_get_datatype_name (type));</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (stk_depth &gt;= 0)</div><div class='add'>+     {</div><div class='add'>+	stk_depth = _SLstack_depth () - stk_depth;</div><div class='add'>+</div><div class='add'>+	trace_dump ("&lt;&lt;%s (returning %d values)\n",</div><div class='add'>+		      objf-&gt;name,</div><div class='add'>+		      _SLStack_Pointer - stk_depth,</div><div class='add'>+		      stk_depth,</div><div class='add'>+		      1);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   free_and_return:</div><div class='add'>+   while (i &lt; argc)</div><div class='add'>+     {</div><div class='add'>+	SLang_free_object (objs + i);</div><div class='add'>+	i++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return _SL_decrement_frame_pointer ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int inner_interp(register SLBlock_Type *);</div><div class='add'>+</div><div class='add'>+/* Switch_Obj_Ptr points to the NEXT available free switch object */</div><div class='add'>+static SLang_Object_Type Switch_Objects[SLANG_MAX_NESTED_SWITCH];</div><div class='add'>+static SLang_Object_Type *Switch_Obj_Ptr = Switch_Objects;</div><div class='add'>+static SLang_Object_Type *Switch_Obj_Max = Switch_Objects + SLANG_MAX_NESTED_SWITCH;</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+lang_do_loops (unsigned char stype, SLBlock_Type *block, unsigned int num_blocks)</div><div class='add'>+{</div><div class='add'>+   int i, ctrl;</div><div class='add'>+   int first, last;</div><div class='add'>+   SLBlock_Type *blks[4];</div><div class='add'>+   char *loop_name;</div><div class='add'>+   SLang_Foreach_Context_Type *foreach_context;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   int type;</div><div class='add'>+   unsigned int j;</div><div class='add'>+</div><div class='add'>+   j = 0;</div><div class='add'>+   for (i = 0; i &lt; (int) num_blocks; i++)</div><div class='add'>+     {</div><div class='add'>+	if (block[i].bc_main_type != _SLANG_BC_BLOCK)</div><div class='add'>+	  {</div><div class='add'>+	     if (block[i].bc_main_type == _SLANG_BC_LINE_NUM)</div><div class='add'>+	       continue;</div><div class='add'>+</div><div class='add'>+	     SLang_verror (SL_SYNTAX_ERROR, "Bytecode is not a looping block");</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+	blks[j] = block[i].b.blk;</div><div class='add'>+	j++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   num_blocks = j;</div><div class='add'>+   block = blks[0];</div><div class='add'>+</div><div class='add'>+   switch (stype)</div><div class='add'>+     {</div><div class='add'>+      case _SLANG_BCST_FOREACH:</div><div class='add'>+	loop_name = "foreach";</div><div class='add'>+	if (num_blocks != 1)</div><div class='add'>+	  goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+	/* We should find Next_Function_Num_Args + 1 items on the stack.</div><div class='add'>+	 * The first Next_Function_Num_Args items represent the arguments to</div><div class='add'>+	 * to USING.  The last item (deepest in stack) is the object to loop</div><div class='add'>+	 * over.  So, roll the stack up and grab it.</div><div class='add'>+	 */</div><div class='add'>+	if ((-1 == SLroll_stack (-(Next_Function_Num_Args + 1)))</div><div class='add'>+	    || (-1 == (type = SLang_peek_at_stack ())))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	cl = _SLclass_get_class ((unsigned char) type);</div><div class='add'>+	if ((cl-&gt;cl_foreach == NULL)</div><div class='add'>+	    || (cl-&gt;cl_foreach_open == NULL)</div><div class='add'>+	    || (cl-&gt;cl_foreach_close == NULL))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_NOT_IMPLEMENTED, "%s does not permit foreach", cl-&gt;cl_name);</div><div class='add'>+	     SLdo_pop_n (Next_Function_Num_Args + 1);</div><div class='add'>+	     goto return_error;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (NULL == (foreach_context = (*cl-&gt;cl_foreach_open) ((unsigned char)type, Next_Function_Num_Args)))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	while (1)</div><div class='add'>+	  {</div><div class='add'>+	     int status;</div><div class='add'>+</div><div class='add'>+	     if (SLang_Error)</div><div class='add'>+	       {</div><div class='add'>+		  (*cl-&gt;cl_foreach_close) ((unsigned char) type, foreach_context);</div><div class='add'>+		  goto return_error;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     status = (*cl-&gt;cl_foreach) ((unsigned char) type, foreach_context);</div><div class='add'>+	     if (status &lt;= 0)</div><div class='add'>+	       {</div><div class='add'>+		  if (status == 0)</div><div class='add'>+		    break;</div><div class='add'>+</div><div class='add'>+		  (*cl-&gt;cl_foreach_close) ((unsigned char) type, foreach_context);</div><div class='add'>+		  goto return_error;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     inner_interp (block);</div><div class='add'>+	     if (Lang_Break) break;</div><div class='add'>+	     Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+	  }</div><div class='add'>+	(*cl-&gt;cl_foreach_close) ((unsigned char) type, foreach_context);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_WHILE:</div><div class='add'>+	loop_name = "while";</div><div class='add'>+</div><div class='add'>+	if (num_blocks != 2)</div><div class='add'>+	  goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+	type = blks[1]-&gt;bc_main_type;</div><div class='add'>+	while (1)</div><div class='add'>+	  {</div><div class='add'>+	     if (SLang_Error)</div><div class='add'>+	       goto return_error;</div><div class='add'>+</div><div class='add'>+	     inner_interp (block);</div><div class='add'>+	     if (Lang_Break) break;</div><div class='add'>+</div><div class='add'>+	     if (-1 == pop_ctrl_integer (&amp;ctrl))</div><div class='add'>+	       goto return_error;</div><div class='add'>+</div><div class='add'>+	     if (ctrl == 0) break;</div><div class='add'>+</div><div class='add'>+	     if (type)</div><div class='add'>+	       {</div><div class='add'>+		  inner_interp (blks[1]);</div><div class='add'>+		  if (Lang_Break) break;</div><div class='add'>+		  Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_DOWHILE:</div><div class='add'>+	loop_name = "do...while";</div><div class='add'>+</div><div class='add'>+	if (num_blocks != 2)</div><div class='add'>+	  goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+	while (1)</div><div class='add'>+	  {</div><div class='add'>+	     if (SLang_Error)</div><div class='add'>+	       goto return_error;</div><div class='add'>+</div><div class='add'>+	     Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+	     inner_interp (block);</div><div class='add'>+	     if (Lang_Break) break;</div><div class='add'>+	     Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+	     inner_interp (blks[1]);</div><div class='add'>+	     if (-1 == pop_ctrl_integer (&amp;ctrl))</div><div class='add'>+	       goto return_error;</div><div class='add'>+</div><div class='add'>+	     if (ctrl == 0) break;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_CFOR:</div><div class='add'>+	loop_name = "for";</div><div class='add'>+</div><div class='add'>+	/* we need 4 blocks: first 3 control, the last is code */</div><div class='add'>+	if (num_blocks != 4) goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+	inner_interp (block);</div><div class='add'>+	while (1)</div><div class='add'>+	  {</div><div class='add'>+	     if (SLang_Error)</div><div class='add'>+	       goto return_error;</div><div class='add'>+</div><div class='add'>+	     inner_interp(blks[1]);       /* test */</div><div class='add'>+	     if (-1 == pop_ctrl_integer (&amp;ctrl))</div><div class='add'>+	       goto return_error;</div><div class='add'>+</div><div class='add'>+	     if (ctrl == 0) break;</div><div class='add'>+	     inner_interp(blks[3]);       /* code */</div><div class='add'>+	     if (Lang_Break) break;</div><div class='add'>+	     inner_interp(blks[2]);       /* bump */</div><div class='add'>+	     Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_FOR:</div><div class='add'>+	loop_name = "_for";</div><div class='add'>+</div><div class='add'>+	if (num_blocks != 1)</div><div class='add'>+	  goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+	/* 3 elements: first, last, step */</div><div class='add'>+	if ((-1 == SLang_pop_integer (&amp;ctrl))</div><div class='add'>+	    || (-1 == SLang_pop_integer (&amp;last))</div><div class='add'>+	    || (-1 == SLang_pop_integer (&amp;first)))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	i = first;</div><div class='add'>+	while (1)</div><div class='add'>+	  {</div><div class='add'>+	     /* It is ugly to have this test here but I do not know of a</div><div class='add'>+	      * simple way to do this without using two while loops.</div><div class='add'>+	      */</div><div class='add'>+	     if (ctrl &gt;= 0)</div><div class='add'>+	       {</div><div class='add'>+		  if (i &gt; last) break;</div><div class='add'>+	       }</div><div class='add'>+	     else if (i &lt; last) break;</div><div class='add'>+</div><div class='add'>+	     if (SLang_Error) goto return_error;</div><div class='add'>+</div><div class='add'>+	     SLclass_push_int_obj (SLANG_INT_TYPE, i);</div><div class='add'>+	     inner_interp (block);</div><div class='add'>+	     if (Lang_Break) break;</div><div class='add'>+	     Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+</div><div class='add'>+	     i += ctrl;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_LOOP:</div><div class='add'>+	loop_name = "loop";</div><div class='add'>+	if (num_blocks != 1)</div><div class='add'>+	  goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+	if (-1 == SLang_pop_integer (&amp;ctrl))</div><div class='add'>+	  goto return_error;</div><div class='add'>+	while (ctrl &gt; 0)</div><div class='add'>+	  {</div><div class='add'>+	     ctrl--;</div><div class='add'>+</div><div class='add'>+	     if (SLang_Error)</div><div class='add'>+	       goto return_error;</div><div class='add'>+</div><div class='add'>+	     inner_interp (block);</div><div class='add'>+	     if (Lang_Break) break;</div><div class='add'>+	     Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BCST_FOREVER:</div><div class='add'>+	loop_name = "forever";</div><div class='add'>+</div><div class='add'>+	if (num_blocks != 1)</div><div class='add'>+	  goto wrong_num_blocks_error;</div><div class='add'>+</div><div class='add'>+	while (1)</div><div class='add'>+	  {</div><div class='add'>+	     if (SLang_Error)</div><div class='add'>+	       goto return_error;</div><div class='add'>+</div><div class='add'>+	     inner_interp (block);</div><div class='add'>+	     if (Lang_Break) break;</div><div class='add'>+	     Lang_Break_Condition = /* Lang_Continue = */ 0;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:  SLang_verror(SL_INTERNAL_ERROR, "Unknown loop type");</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   Lang_Break = /* Lang_Continue = */ 0;</div><div class='add'>+   Lang_Break_Condition = Lang_Return;</div><div class='add'>+   return;</div><div class='add'>+</div><div class='add'>+   wrong_num_blocks_error:</div><div class='add'>+   SLang_verror (SL_SYNTAX_ERROR, "Wrong number of blocks for '%s' construct", loop_name);</div><div class='add'>+</div><div class='add'>+   /* drop */</div><div class='add'>+   return_error:</div><div class='add'>+   do_traceback (loop_name, 0, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void lang_do_and_orelse (unsigned char stype, SLBlock_Type *addr, SLBlock_Type *addr_max)</div><div class='add'>+{</div><div class='add'>+   int test = 0;</div><div class='add'>+   int is_or;</div><div class='add'>+</div><div class='add'>+   is_or = (stype == _SLANG_BCST_ORELSE);</div><div class='add'>+</div><div class='add'>+   while (addr &lt;= addr_max)</div><div class='add'>+     {</div><div class='add'>+	if (addr-&gt;bc_main_type == _SLANG_BC_LINE_NUM)</div><div class='add'>+	  {</div><div class='add'>+	     addr++;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	inner_interp (addr-&gt;b.blk);</div><div class='add'>+	if (SLang_Error</div><div class='add'>+	    || Lang_Break_Condition</div><div class='add'>+	    || (-1 == pop_ctrl_integer (&amp;test)))</div><div class='add'>+	  return;</div><div class='add'>+</div><div class='add'>+	if (is_or == (test != 0))</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	/* if (((stype == _SLANG_BCST_ANDELSE) &amp;&amp; (test == 0))</div><div class='add'>+	 *   || ((stype == _SLANG_BCST_ORELSE) &amp;&amp; test))</div><div class='add'>+	 * break;</div><div class='add'>+	 */</div><div class='add'>+</div><div class='add'>+	addr++;</div><div class='add'>+     }</div><div class='add'>+   SLclass_push_int_obj (SLANG_INT_TYPE, test);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_else_if (SLBlock_Type *zero_block, SLBlock_Type *non_zero_block)</div><div class='add'>+{</div><div class='add'>+   int test;</div><div class='add'>+</div><div class='add'>+   if (-1 == pop_ctrl_integer (&amp;test))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (test == 0)</div><div class='add'>+     non_zero_block = zero_block;</div><div class='add'>+</div><div class='add'>+   if (non_zero_block != NULL)</div><div class='add'>+     inner_interp (non_zero_block-&gt;b.blk);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_trace_fun (char *f)</div><div class='add'>+{</div><div class='add'>+   if (NULL == (f = SLang_create_slstring (f)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   SLang_free_slstring (Trace_Function);</div><div class='add'>+   Trace_Function = f;</div><div class='add'>+   _SLang_Trace = 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLdump_objects (char *prefix, SLang_Object_Type *x, unsigned int n, int dir)</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   while (n)</div><div class='add'>+     {</div><div class='add'>+	cl = _SLclass_get_class (x-&gt;data_type);</div><div class='add'>+</div><div class='add'>+	if (NULL == (s = _SLstringize_object (x)))</div><div class='add'>+	  s = "??";</div><div class='add'>+</div><div class='add'>+	call_dump_routine ("%s[%s]:%s\n", prefix, cl-&gt;cl_name, s);</div><div class='add'>+</div><div class='add'>+	SLang_free_slstring (s);</div><div class='add'>+</div><div class='add'>+	x += dir;</div><div class='add'>+	n--;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLBlock_Type *Exit_Block_Ptr;</div><div class='add'>+static SLBlock_Type *Global_User_Block[5];</div><div class='add'>+static SLBlock_Type **User_Block_Ptr = Global_User_Block;</div><div class='add'>+char *_SLang_Current_Function_Name = NULL;</div><div class='add'>+</div><div class='add'>+static int execute_slang_fun (_SLang_Function_Type *fun)</div><div class='add'>+{</div><div class='add'>+   register unsigned int i;</div><div class='add'>+   register SLang_Object_Type *frame, *lvf;</div><div class='add'>+   register unsigned int n_locals;</div><div class='add'>+   _SLBlock_Header_Type *header;</div><div class='add'>+   /* SLBlock_Type *val; */</div><div class='add'>+   SLBlock_Type *exit_block_save;</div><div class='add'>+   SLBlock_Type **user_block_save;</div><div class='add'>+   SLBlock_Type *user_blocks[5];</div><div class='add'>+   char *save_fname;</div><div class='add'>+</div><div class='add'>+   exit_block_save = Exit_Block_Ptr;</div><div class='add'>+   user_block_save = User_Block_Ptr;</div><div class='add'>+   User_Block_Ptr = user_blocks;</div><div class='add'>+   *(user_blocks) = NULL;</div><div class='add'>+   *(user_blocks + 1) = NULL;</div><div class='add'>+   *(user_blocks + 2) = NULL;</div><div class='add'>+   *(user_blocks + 3) = NULL;</div><div class='add'>+   *(user_blocks + 4) = NULL;</div><div class='add'>+</div><div class='add'>+   Exit_Block_Ptr = NULL;</div><div class='add'>+</div><div class='add'>+   save_fname = _SLang_Current_Function_Name;</div><div class='add'>+   _SLang_Current_Function_Name = fun-&gt;name;</div><div class='add'>+</div><div class='add'>+   _SL_increment_frame_pointer ();</div><div class='add'>+</div><div class='add'>+   /* need loaded?  */</div><div class='add'>+   if (fun-&gt;nlocals == AUTOLOAD_NUM_LOCALS)</div><div class='add'>+     {</div><div class='add'>+	header = NULL;</div><div class='add'>+	if (-1 == SLang_load_file(fun-&gt;v.autoload_filename))</div><div class='add'>+	  goto the_return;</div><div class='add'>+</div><div class='add'>+	if (fun-&gt;nlocals == AUTOLOAD_NUM_LOCALS)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_UNDEFINED_NAME, "%s: Function did not autoload",</div><div class='add'>+			   _SLang_Current_Function_Name);</div><div class='add'>+             goto the_return;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   n_locals = fun-&gt;nlocals;</div><div class='add'>+</div><div class='add'>+   /* let the error propagate through since it will do no harm</div><div class='add'>+    and allow us to restore stack. */</div><div class='add'>+</div><div class='add'>+   /* set new stack frame */</div><div class='add'>+   lvf = frame = Local_Variable_Frame;</div><div class='add'>+   i = n_locals;</div><div class='add'>+   if ((lvf + i) &gt; Local_Variable_Stack + SLANG_MAX_LOCAL_STACK)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror(SL_STACK_OVERFLOW, "%s: Local Variable Stack Overflow",</div><div class='add'>+		     _SLang_Current_Function_Name);</div><div class='add'>+	goto the_return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Make sure we do not allow this header to get destroyed by something</div><div class='add'>+    * like:  define crash () { eval ("define crash ();") }</div><div class='add'>+    */</div><div class='add'>+   header = fun-&gt;v.header;</div><div class='add'>+   header-&gt;num_refs++;</div><div class='add'>+</div><div class='add'>+   while (i--)</div><div class='add'>+     {</div><div class='add'>+	lvf++;</div><div class='add'>+	lvf-&gt;data_type = SLANG_UNDEFINED_TYPE;</div><div class='add'>+     }</div><div class='add'>+   Local_Variable_Frame = lvf;</div><div class='add'>+</div><div class='add'>+   /* read values of function arguments */</div><div class='add'>+   i = fun-&gt;nargs;</div><div class='add'>+   while (i &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	i--;</div><div class='add'>+	(void) SLang_pop (Local_Variable_Frame - i);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (SLang_Enter_Function != NULL) (*SLang_Enter_Function)(_SLang_Current_Function_Name);</div><div class='add'>+</div><div class='add'>+   if (_SLang_Trace)</div><div class='add'>+     {</div><div class='add'>+	int stack_depth;</div><div class='add'>+</div><div class='add'>+	stack_depth = _SLstack_depth ();</div><div class='add'>+</div><div class='add'>+	if ((Trace_Function != NULL)</div><div class='add'>+	    &amp;&amp; (0 == strcmp (Trace_Function, _SLang_Current_Function_Name))</div><div class='add'>+	    &amp;&amp; (Trace_Mode == 0))</div><div class='add'>+	  Trace_Mode = 1;</div><div class='add'>+</div><div class='add'>+	if (Trace_Mode)</div><div class='add'>+	  {</div><div class='add'>+	     /* The local variable frame grows backwards */</div><div class='add'>+	     trace_dump ("&gt;&gt;%s (%d args)\n",</div><div class='add'>+			 _SLang_Current_Function_Name,</div><div class='add'>+			 Local_Variable_Frame,</div><div class='add'>+			 (int) fun-&gt;nargs,</div><div class='add'>+			 -1);</div><div class='add'>+	     Trace_Mode++;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	inner_interp (header-&gt;body);</div><div class='add'>+	Lang_Break_Condition = Lang_Return = Lang_Break = 0;</div><div class='add'>+	if (Exit_Block_Ptr != NULL) inner_interp(Exit_Block_Ptr);</div><div class='add'>+</div><div class='add'>+	if (Trace_Mode)</div><div class='add'>+	  {</div><div class='add'>+	     Trace_Mode--;</div><div class='add'>+	     stack_depth = _SLstack_depth () - stack_depth;</div><div class='add'>+</div><div class='add'>+	     trace_dump ("&lt;&lt;%s (returning %d values)\n",</div><div class='add'>+			 _SLang_Current_Function_Name,</div><div class='add'>+			 _SLStack_Pointer - stack_depth,</div><div class='add'>+			 stack_depth,</div><div class='add'>+			 1);</div><div class='add'>+</div><div class='add'>+	     if (Trace_Mode == 1)</div><div class='add'>+	       Trace_Mode = 0;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	inner_interp (header-&gt;body);</div><div class='add'>+	Lang_Break_Condition = Lang_Return = Lang_Break = 0;</div><div class='add'>+	if (Exit_Block_Ptr != NULL) inner_interp(Exit_Block_Ptr);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (SLang_Exit_Function != NULL) (*SLang_Exit_Function)(_SLang_Current_Function_Name);</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     do_traceback(fun-&gt;name, n_locals,</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+		  fun-&gt;file</div><div class='add'>+#else</div><div class='add'>+		  NULL</div><div class='add'>+#endif</div><div class='add'>+		  );</div><div class='add'>+</div><div class='add'>+   /* free local variables.... */</div><div class='add'>+   lvf = Local_Variable_Frame;</div><div class='add'>+   while (lvf &gt; frame)</div><div class='add'>+     {</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [lvf-&gt;data_type])</div><div class='add'>+#endif</div><div class='add'>+	  SLang_free_object (lvf);</div><div class='add'>+	lvf--;</div><div class='add'>+     }</div><div class='add'>+   Local_Variable_Frame = lvf;</div><div class='add'>+</div><div class='add'>+   if (header-&gt;num_refs == 1)</div><div class='add'>+     free_function_header (header);</div><div class='add'>+   else</div><div class='add'>+     header-&gt;num_refs--;</div><div class='add'>+</div><div class='add'>+   the_return:</div><div class='add'>+</div><div class='add'>+   Lang_Break_Condition = Lang_Return = Lang_Break = 0;</div><div class='add'>+   Exit_Block_Ptr = exit_block_save;</div><div class='add'>+   User_Block_Ptr = user_block_save;</div><div class='add'>+   _SLang_Current_Function_Name = save_fname;</div><div class='add'>+   _SL_decrement_frame_pointer ();</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_traceback (char *name, unsigned int locals, char *file)</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   SLang_Object_Type *objp;</div><div class='add'>+   unsigned short stype;</div><div class='add'>+</div><div class='add'>+   /* FIXME: Priority=low</div><div class='add'>+    * I need to make this configurable!!! That is, let the</div><div class='add'>+    * application decide whether or not a usage error should result in a</div><div class='add'>+    * traceback.</div><div class='add'>+    */</div><div class='add'>+   if (SLang_Error == SL_USAGE_ERROR)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (SLang_Traceback == 0)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   call_dump_routine ("S-Lang Traceback: %s\n", name);</div><div class='add'>+   if (SLang_Traceback &lt; 0)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (file != NULL)</div><div class='add'>+     call_dump_routine ("File: %s\n", file);</div><div class='add'>+</div><div class='add'>+   if (locals == 0)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   call_dump_routine ("  Local Variables:\n");</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; locals; i++)</div><div class='add'>+     {</div><div class='add'>+	SLang_Class_Type *cl;</div><div class='add'>+	char *class_name;</div><div class='add'>+</div><div class='add'>+	objp = Local_Variable_Frame - i;</div><div class='add'>+	stype = objp-&gt;data_type;</div><div class='add'>+</div><div class='add'>+	s = _SLstringize_object (objp);</div><div class='add'>+	cl = _SLclass_get_class (stype);</div><div class='add'>+	class_name = cl-&gt;cl_name;</div><div class='add'>+</div><div class='add'>+	call_dump_routine ("\t$%d: Type: %s,\tValue:\t", i, class_name);</div><div class='add'>+</div><div class='add'>+	if (s == NULL) call_dump_routine("??\n");</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     char *q = "";</div><div class='add'>+#ifndef HAVE_VSNPRINTF</div><div class='add'>+	     char buf[256];</div><div class='add'>+	     if (strlen (s) &gt;= sizeof (buf))</div><div class='add'>+	       {</div><div class='add'>+		  strncpy (buf, s, sizeof(buf));</div><div class='add'>+		  s = buf;</div><div class='add'>+		  s[sizeof(buf) - 1] = 0;</div><div class='add'>+	       }</div><div class='add'>+#endif</div><div class='add'>+	     if (SLANG_STRING_TYPE == stype) q = "\"";</div><div class='add'>+	     call_dump_routine ("%s%s%s\n", q, s, q);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_app_unary (SLang_App_Unary_Type *nt)</div><div class='add'>+{</div><div class='add'>+   if (-1 == do_unary (nt-&gt;unary_op, nt-&gt;name_type))</div><div class='add'>+     do_traceback (nt-&gt;name, 0, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int inner_interp_nametype (SLang_Name_Type *nt)</div><div class='add'>+{</div><div class='add'>+   SLBlock_Type bc_blks[2];</div><div class='add'>+</div><div class='add'>+   bc_blks[0].b.nt_blk = nt;</div><div class='add'>+   bc_blks[0].bc_main_type = nt-&gt;name_type;</div><div class='add'>+   bc_blks[1].bc_main_type = 0;</div><div class='add'>+   return inner_interp(bc_blks);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_dereference_ref (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+   if (ref == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (ref-&gt;is_global == 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_Object_Type *obj = ref-&gt;v.local_obj;</div><div class='add'>+	if (obj &gt; Local_Variable_Frame)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_UNDEFINED_NAME, "Local variable deref is out of scope");</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	return _SLpush_slang_obj (ref-&gt;v.local_obj);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   (void) inner_interp_nametype (ref-&gt;v.nt);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_is_ref_initialized (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+   unsigned char type;</div><div class='add'>+</div><div class='add'>+   if (ref == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (ref-&gt;is_global == 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_Object_Type *obj = ref-&gt;v.local_obj;</div><div class='add'>+	if (obj &gt; Local_Variable_Frame)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_UNDEFINED_NAME, "Local variable deref is out of scope");</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	type = ref-&gt;v.local_obj-&gt;data_type;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	SLang_Name_Type *nt = ref-&gt;v.nt;</div><div class='add'>+	if ((nt-&gt;name_type != SLANG_GVARIABLE)</div><div class='add'>+	    &amp;&amp; (nt-&gt;name_type != SLANG_PVARIABLE))</div><div class='add'>+	  return 1;</div><div class='add'>+	type = ((SLang_Global_Var_Type *)nt)-&gt;obj.data_type;</div><div class='add'>+     }</div><div class='add'>+   return type != SLANG_UNDEFINED_TYPE;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_uninitialize_ref (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+   if (ref == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (ref-&gt;is_global == 0)</div><div class='add'>+     {</div><div class='add'>+	obj = ref-&gt;v.local_obj;</div><div class='add'>+	if (obj &gt; Local_Variable_Frame)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_UNDEFINED_NAME, "Local variable deref is out of scope");</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	obj = ref-&gt;v.local_obj;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	SLang_Name_Type *nt = ref-&gt;v.nt;</div><div class='add'>+	if ((nt-&gt;name_type != SLANG_GVARIABLE)</div><div class='add'>+	    &amp;&amp; (nt-&gt;name_type != SLANG_PVARIABLE))</div><div class='add'>+	  return -1;</div><div class='add'>+	obj = &amp;((SLang_Global_Var_Type *)nt)-&gt;obj;</div><div class='add'>+     }</div><div class='add'>+   SLang_free_object (obj);</div><div class='add'>+   obj-&gt;data_type = SLANG_UNDEFINED_TYPE;</div><div class='add'>+   obj-&gt;v.ptr_val = NULL;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void (*SLang_Interrupt)(void);</div><div class='add'>+static int Last_Error;</div><div class='add'>+void (*SLang_User_Clear_Error)(void);</div><div class='add'>+void _SLang_clear_error (void)</div><div class='add'>+{</div><div class='add'>+   if (Last_Error &lt;= 0)</div><div class='add'>+     {</div><div class='add'>+	Last_Error = 0;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   Last_Error--;</div><div class='add'>+   if (SLang_User_Clear_Error != NULL) (*SLang_User_Clear_Error)();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLpush_slang_obj (SLang_Object_Type *obj)</div><div class='add'>+{</div><div class='add'>+   unsigned char subtype;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (obj == NULL) return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+   subtype = obj-&gt;data_type;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type[subtype])</div><div class='add'>+     return SLang_push (obj);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (subtype);</div><div class='add'>+   return (*cl-&gt;cl_push) (subtype, (VOID_STAR) &amp;obj-&gt;v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static int push_local_variable (int i)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   SLang_Object_Type *obj;</div><div class='add'>+   unsigned char subtype;</div><div class='add'>+</div><div class='add'>+   obj = Local_Variable_Frame - i;</div><div class='add'>+   subtype = obj-&gt;data_type;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type[subtype])</div><div class='add'>+     return SLang_push (obj);</div><div class='add'>+   if (subtype == SLANG_STRING_TYPE)</div><div class='add'>+     return _SLang_dup_and_push_slstring (obj-&gt;v.s_val);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (subtype);</div><div class='add'>+   return (*cl-&gt;cl_push) (subtype, (VOID_STAR) &amp;obj-&gt;v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_intrinsic_variable (SLang_Intrin_Var_Type *ivar)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   unsigned char stype;</div><div class='add'>+</div><div class='add'>+   stype = ivar-&gt;type;</div><div class='add'>+   cl = _SLclass_get_class (stype);</div><div class='add'>+</div><div class='add'>+   if (-1 == (*cl-&gt;cl_push_intrinsic) (stype, ivar-&gt;addr))</div><div class='add'>+     {</div><div class='add'>+	do_name_type_error ((SLang_Name_Type *) ivar);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int dereference_object (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   unsigned char type;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop (&amp;obj))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   type = obj.data_type;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   ret = (*cl-&gt;cl_dereference)(type, (VOID_STAR) &amp;obj.v);</div><div class='add'>+</div><div class='add'>+   SLang_free_object (&amp;obj);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int case_function (void)</div><div class='add'>+{</div><div class='add'>+   unsigned char type;</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   SLang_Object_Type *swobjptr;</div><div class='add'>+</div><div class='add'>+   swobjptr = Switch_Obj_Ptr - 1;</div><div class='add'>+</div><div class='add'>+   if ((swobjptr &lt; Switch_Objects)</div><div class='add'>+       || (0 == (type = swobjptr-&gt;data_type)))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "Misplaced 'case' keyword");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop (&amp;obj))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (obj.data_type != type)</div><div class='add'>+     {</div><div class='add'>+	SLang_Class_Type *a_cl, *b_cl;</div><div class='add'>+</div><div class='add'>+	a_cl = _SLclass_get_class (obj.data_type);</div><div class='add'>+	b_cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+	if (NULL == _SLclass_get_binary_fun (SLANG_EQ, a_cl, b_cl, &amp;a_cl, 0))</div><div class='add'>+	  {</div><div class='add'>+	     (void) SLclass_push_int_obj (SLANG_INT_TYPE, 0);</div><div class='add'>+	     SLang_free_object (&amp;obj);</div><div class='add'>+	     return 0;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   (void) do_binary_ab (SLANG_EQ, swobjptr, &amp;obj);</div><div class='add'>+   SLang_free_object (&amp;obj);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void tmp_variable_function (SLBlock_Type *addr)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+   switch (addr-&gt;bc_sub_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_GVARIABLE:</div><div class='add'>+      case SLANG_PVARIABLE:</div><div class='add'>+	obj = &amp;addr-&gt;b.nt_gvar_blk-&gt;obj;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_LVARIABLE:</div><div class='add'>+	obj = Local_Variable_Frame - addr-&gt;b.i_blk;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* There is no need to go through higher level routines since we are</div><div class='add'>+    * not creating or destroying extra copies.</div><div class='add'>+    */</div><div class='add'>+   if (-1 == SLang_push (obj))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   obj-&gt;data_type = SLANG_UNDEFINED_TYPE;</div><div class='add'>+   obj-&gt;v.ptr_val = NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+do_inner_interp_error (SLBlock_Type *err_block,</div><div class='add'>+		       SLBlock_Type *addr_start,</div><div class='add'>+		       SLBlock_Type *addr)</div><div class='add'>+{</div><div class='add'>+   int save_err, slerr;</div><div class='add'>+</div><div class='add'>+   /* Someday I can use the these variable to provide extra information</div><div class='add'>+    * about what went wrong.</div><div class='add'>+    */</div><div class='add'>+   (void) addr_start;</div><div class='add'>+   (void) addr;</div><div class='add'>+</div><div class='add'>+   if (err_block == NULL)</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   if (SLang_Error &lt; 0)		       /* errors less than 0 are severe */</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   save_err = Last_Error++;</div><div class='add'>+   slerr = SLang_Error;</div><div class='add'>+   SLang_Error = 0;</div><div class='add'>+   inner_interp (err_block-&gt;b.blk);</div><div class='add'>+</div><div class='add'>+   if (Last_Error &lt;= save_err)</div><div class='add'>+     {</div><div class='add'>+	/* Caught error and cleared it */</div><div class='add'>+	Last_Error = save_err;</div><div class='add'>+	if ((Lang_Break_Condition == 0)</div><div class='add'>+	    /* An error may have cleared the error and then caused the</div><div class='add'>+	     * function to return.  We will allow that but let's not allow</div><div class='add'>+	     * 'break' nor 'continue' statements until later.</div><div class='add'>+	     */</div><div class='add'>+	    || Lang_Return)</div><div class='add'>+	  return 0;</div><div class='add'>+</div><div class='add'>+	/* drop--- either a break or continue was called */</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Last_Error = save_err;</div><div class='add'>+   SLang_Error = slerr;</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   while (addr &gt;= addr_start)</div><div class='add'>+     {</div><div class='add'>+	if (addr-&gt;bc_main_type == _SLANG_BC_LINE_NUM)</div><div class='add'>+	  {</div><div class='add'>+	     char buf[256];</div><div class='add'>+	     sprintf (buf, "(Error occurred on line %lu)", addr-&gt;b.l_blk);</div><div class='add'>+	     do_traceback (buf, 0, NULL);</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	/* Special hack for 16 bit systems to prevent pointer wrapping. */</div><div class='add'>+#if defined(__16_BIT_SYSTEM__)</div><div class='add'>+	if (addr == addr_start)</div><div class='add'>+	  break;</div><div class='add'>+#endif</div><div class='add'>+	addr--;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#define GATHER_STATISTICS 0</div><div class='add'>+#if GATHER_STATISTICS</div><div class='add'>+static unsigned int Bytecodes[0xFFFF];</div><div class='add'>+</div><div class='add'>+static void print_stats (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+   unsigned long total;</div><div class='add'>+   FILE *fp = fopen ("stats.txt", "w");</div><div class='add'>+   if (fp == NULL)</div><div class='add'>+     return;</div><div class='add'>+   </div><div class='add'>+   total = 0;</div><div class='add'>+   for (i = 0; i &lt; 0xFFFF; i++)</div><div class='add'>+     total += Bytecodes[i];</div><div class='add'>+   </div><div class='add'>+   if (total == 0)</div><div class='add'>+     total = 1;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; 0xFFFF; i++)</div><div class='add'>+     {</div><div class='add'>+	if (Bytecodes[i])</div><div class='add'>+	  fprintf (fp, "0x%04X %9u %e\n", i, Bytecodes[i], Bytecodes[i]/(double) total);</div><div class='add'>+     }</div><div class='add'>+   fclose (fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void add_to_statistics (SLBlock_Type *b)</div><div class='add'>+{</div><div class='add'>+   unsigned short x, y;</div><div class='add'>+   </div><div class='add'>+   x = b-&gt;bc_main_type;</div><div class='add'>+   if (x == 0)</div><div class='add'>+     {</div><div class='add'>+	Bytecodes[0] += 1;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   b++;</div><div class='add'>+   y = b-&gt;bc_main_type;</div><div class='add'>+</div><div class='add'>+   Bytecodes[(x &lt;&lt; 8) | y] += 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* inner interpreter */</div><div class='add'>+/* The return value from this function is only meaningful when it is used</div><div class='add'>+ * to process blocks for the switch statement.  If it returns 0, the calling</div><div class='add'>+ * routine should pass the next block to it.  Otherwise it will</div><div class='add'>+ * return non-zero, with or without error.</div><div class='add'>+ */</div><div class='add'>+static int inner_interp (SLBlock_Type *addr_start)</div><div class='add'>+{</div><div class='add'>+   SLBlock_Type *block, *err_block, *addr;</div><div class='add'>+#if GATHER_STATISTICS</div><div class='add'>+   static int inited = 0;</div><div class='add'>+</div><div class='add'>+   if (inited == 0)</div><div class='add'>+     {</div><div class='add'>+	(void) SLang_add_cleanup_function (print_stats);</div><div class='add'>+	inited = 1;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   /* for systems that have no real interrupt facility (e.g. go32 on dos) */</div><div class='add'>+   if (SLang_Interrupt != NULL) (*SLang_Interrupt)();</div><div class='add'>+</div><div class='add'>+   block = err_block = NULL;</div><div class='add'>+   addr = addr_start;</div><div class='add'>+</div><div class='add'>+#if GATHER_STATISTICS</div><div class='add'>+   add_to_statistics (addr);</div><div class='add'>+#endif</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	switch (addr-&gt;bc_main_type)</div><div class='add'>+	  {</div><div class='add'>+	   case 0:</div><div class='add'>+	     return 1;</div><div class='add'>+	   case _SLANG_BC_LVARIABLE:</div><div class='add'>+	     push_local_variable (addr-&gt;b.i_blk);</div><div class='add'>+	     break;</div><div class='add'>+	   case _SLANG_BC_GVARIABLE:</div><div class='add'>+	     if (-1 == _SLpush_slang_obj (&amp;addr-&gt;b.nt_gvar_blk-&gt;obj))</div><div class='add'>+	       do_name_type_error (addr-&gt;b.nt_blk);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_IVARIABLE:</div><div class='add'>+	   case _SLANG_BC_RVARIABLE:</div><div class='add'>+	     push_intrinsic_variable (addr-&gt;b.nt_ivar_blk);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_INTRINSIC:</div><div class='add'>+	     execute_intrinsic_fun (addr-&gt;b.nt_ifun_blk);</div><div class='add'>+	     if (SLang_Error)</div><div class='add'>+	       do_traceback(addr-&gt;b.nt_ifun_blk-&gt;name, 0, NULL);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_FUNCTION:</div><div class='add'>+	     execute_slang_fun (addr-&gt;b.nt_fun_blk);</div><div class='add'>+	     if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_MATH_UNARY:</div><div class='add'>+	   case _SLANG_BC_APP_UNARY:</div><div class='add'>+	     /* Make sure we treat these like function calls since the</div><div class='add'>+	      * parser took sin(x) to be a function call.</div><div class='add'>+	      */</div><div class='add'>+	     if (0 == _SL_increment_frame_pointer ())</div><div class='add'>+	       {</div><div class='add'>+		  do_app_unary (addr-&gt;b.nt_unary_blk);</div><div class='add'>+		  (void) _SL_decrement_frame_pointer ();</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_ICONST:</div><div class='add'>+	     SLclass_push_int_obj (SLANG_INT_TYPE, addr-&gt;b.iconst_blk-&gt;i);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	   case _SLANG_BC_DCONST:</div><div class='add'>+	     SLang_push_double (addr-&gt;b.dconst_blk-&gt;d);</div><div class='add'>+	     break;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_PVARIABLE:</div><div class='add'>+	     if (-1 == _SLpush_slang_obj (&amp;addr-&gt;b.nt_gvar_blk-&gt;obj))</div><div class='add'>+	       do_name_type_error (addr-&gt;b.nt_blk);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_PFUNCTION:</div><div class='add'>+	     execute_slang_fun (addr-&gt;b.nt_fun_blk);</div><div class='add'>+	     if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_BINARY:</div><div class='add'>+	     do_binary (addr-&gt;b.i_blk);</div><div class='add'>+	     break;</div><div class='add'>+	     </div><div class='add'>+	   case _SLANG_BC_LITERAL:</div><div class='add'>+#if !_SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	   case _SLANG_BC_LITERAL_INT:</div><div class='add'>+	   case _SLANG_BC_LITERAL_STR:</div><div class='add'>+#endif</div><div class='add'>+	       {</div><div class='add'>+		  SLang_Class_Type *cl = _SLclass_get_class (addr-&gt;bc_sub_type);</div><div class='add'>+		  (*cl-&gt;cl_push_literal) (addr-&gt;bc_sub_type, (VOID_STAR) &amp;addr-&gt;b.ptr_blk);</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	   case _SLANG_BC_LITERAL_INT:</div><div class='add'>+	     SLclass_push_int_obj (addr-&gt;bc_sub_type, (int) addr-&gt;b.l_blk);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_LITERAL_STR:</div><div class='add'>+	     _SLang_dup_and_push_slstring (addr-&gt;b.s_blk);</div><div class='add'>+	     break;</div><div class='add'>+#endif</div><div class='add'>+	   case _SLANG_BC_BLOCK:</div><div class='add'>+	     switch (addr-&gt;bc_sub_type)</div><div class='add'>+	       {</div><div class='add'>+		case _SLANG_BCST_ERROR_BLOCK:</div><div class='add'>+		  err_block = addr;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case _SLANG_BCST_EXIT_BLOCK:</div><div class='add'>+		  Exit_Block_Ptr = addr-&gt;b.blk;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case _SLANG_BCST_USER_BLOCK0:</div><div class='add'>+		case _SLANG_BCST_USER_BLOCK1:</div><div class='add'>+		case _SLANG_BCST_USER_BLOCK2:</div><div class='add'>+		case _SLANG_BCST_USER_BLOCK3:</div><div class='add'>+		case _SLANG_BCST_USER_BLOCK4:</div><div class='add'>+		  User_Block_Ptr[addr-&gt;bc_sub_type - _SLANG_BCST_USER_BLOCK0] = addr-&gt;b.blk;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case _SLANG_BCST_LOOP:</div><div class='add'>+		case _SLANG_BCST_WHILE:</div><div class='add'>+		case _SLANG_BCST_FOR:</div><div class='add'>+		case _SLANG_BCST_FOREVER:</div><div class='add'>+		case _SLANG_BCST_CFOR:</div><div class='add'>+		case _SLANG_BCST_DOWHILE:</div><div class='add'>+		case _SLANG_BCST_FOREACH:</div><div class='add'>+		  if (block == NULL) block = addr;</div><div class='add'>+		  lang_do_loops(addr-&gt;bc_sub_type, block, 1 + (unsigned int) (addr - block));</div><div class='add'>+		  block = NULL;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case _SLANG_BCST_IFNOT:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+		    {</div><div class='add'>+		       int i;</div><div class='add'>+		       </div><div class='add'>+		       if ((0 == pop_ctrl_integer (&amp;i)) &amp;&amp; (i == 0))</div><div class='add'>+			 inner_interp (addr-&gt;b.blk);</div><div class='add'>+		    }</div><div class='add'>+#else</div><div class='add'>+		  do_else_if (addr, NULL);</div><div class='add'>+#endif</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case _SLANG_BCST_IF:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+		    {</div><div class='add'>+		       int i;</div><div class='add'>+		       </div><div class='add'>+		       if ((0 == pop_ctrl_integer (&amp;i)) &amp;&amp; i)</div><div class='add'>+			 inner_interp (addr-&gt;b.blk);</div><div class='add'>+		    }</div><div class='add'>+#else</div><div class='add'>+		  do_else_if (NULL, addr);</div><div class='add'>+#endif</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case _SLANG_BCST_NOTELSE:</div><div class='add'>+		  do_else_if (block, addr);</div><div class='add'>+		  block = NULL;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case _SLANG_BCST_ELSE:</div><div class='add'>+		  do_else_if (addr, block);</div><div class='add'>+		  block = NULL;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case _SLANG_BCST_SWITCH:</div><div class='add'>+		  if (Switch_Obj_Ptr == Switch_Obj_Max)</div><div class='add'>+		    {</div><div class='add'>+		       SLang_doerror("switch nesting too deep");</div><div class='add'>+		       break;</div><div class='add'>+		    }</div><div class='add'>+		  (void) SLang_pop (Switch_Obj_Ptr);</div><div class='add'>+		  Switch_Obj_Ptr++;</div><div class='add'>+</div><div class='add'>+		  if (block == NULL) block = addr;</div><div class='add'>+		  while ((SLang_Error == 0)</div><div class='add'>+			 &amp;&amp; (block &lt;= addr)</div><div class='add'>+			 &amp;&amp; (Lang_Break_Condition == 0)</div><div class='add'>+			 &amp;&amp; (0 == inner_interp (block-&gt;b.blk)))</div><div class='add'>+		    block++;</div><div class='add'>+		  Switch_Obj_Ptr--;</div><div class='add'>+		  SLang_free_object (Switch_Obj_Ptr);</div><div class='add'>+		  Switch_Obj_Ptr-&gt;data_type = 0;</div><div class='add'>+		  block = NULL;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case _SLANG_BCST_ANDELSE:</div><div class='add'>+		case _SLANG_BCST_ORELSE:</div><div class='add'>+		  if (block == NULL) block = addr;</div><div class='add'>+		  lang_do_and_orelse (addr-&gt;bc_sub_type, block, addr);</div><div class='add'>+		  block = NULL;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		default:</div><div class='add'>+		  if (block == NULL) block =  addr;</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	     if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_RETURN:</div><div class='add'>+	     Lang_Break_Condition = Lang_Return = Lang_Break = 1; return 1;</div><div class='add'>+	   case _SLANG_BC_BREAK:</div><div class='add'>+	     Lang_Break_Condition = Lang_Break = 1; return 1;</div><div class='add'>+	   case _SLANG_BC_CONTINUE:</div><div class='add'>+	     Lang_Break_Condition = /* Lang_Continue = */ 1; return 1;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_EXCH:</div><div class='add'>+	     (void) SLreverse_stack (2);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_LABEL:</div><div class='add'>+	       {</div><div class='add'>+		  int test;</div><div class='add'>+		  if ((0 == SLang_pop_integer (&amp;test))</div><div class='add'>+		      &amp;&amp; (test == 0))</div><div class='add'>+		    return 0;</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_LOBJPTR:</div><div class='add'>+	     (void)_SLang_push_ref (0, (VOID_STAR)(Local_Variable_Frame - addr-&gt;b.i_blk));</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_GOBJPTR:</div><div class='add'>+	     (void)_SLang_push_ref (1, (VOID_STAR)addr-&gt;b.nt_blk);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_X_ERROR:</div><div class='add'>+	     if (err_block != NULL)</div><div class='add'>+	       {</div><div class='add'>+		  inner_interp(err_block-&gt;b.blk);</div><div class='add'>+		  if (SLang_Error) err_block = NULL;</div><div class='add'>+	       }</div><div class='add'>+	     else SLang_verror(SL_SYNTAX_ERROR, "No ERROR_BLOCK");</div><div class='add'>+	     if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_X_USER0:</div><div class='add'>+	   case _SLANG_BC_X_USER1:</div><div class='add'>+	   case _SLANG_BC_X_USER2:</div><div class='add'>+	   case _SLANG_BC_X_USER3:</div><div class='add'>+	   case _SLANG_BC_X_USER4:</div><div class='add'>+	     if (User_Block_Ptr[addr-&gt;bc_main_type - _SLANG_BC_X_USER0] != NULL)</div><div class='add'>+	       {</div><div class='add'>+		  inner_interp(User_Block_Ptr[addr-&gt;bc_main_type - _SLANG_BC_X_USER0]);</div><div class='add'>+	       }</div><div class='add'>+	     else SLang_verror(SL_SYNTAX_ERROR, "No block for X_USERBLOCK");</div><div class='add'>+	     if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_CALL_DIRECT:</div><div class='add'>+	     (*addr-&gt;b.call_function) ();</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_CALL_DIRECT_FRAME:</div><div class='add'>+	     do_bc_call_direct_frame (addr-&gt;b.call_function);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_UNARY:</div><div class='add'>+	     do_unary (addr-&gt;b.i_blk, _SLANG_BC_UNARY);</div><div class='add'>+	     break;</div><div class='add'>+	     </div><div class='add'>+	   case _SLANG_BC_UNARY_FUNC:</div><div class='add'>+	     /* Make sure we treat these like function calls since the</div><div class='add'>+	      * parser took abs(x) to be a function call.</div><div class='add'>+	      */</div><div class='add'>+	     if (0 == _SL_increment_frame_pointer ())</div><div class='add'>+	       {</div><div class='add'>+		  do_unary (addr-&gt;b.i_blk, _SLANG_BC_UNARY);</div><div class='add'>+		  (void) _SL_decrement_frame_pointer ();</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+	     </div><div class='add'>+	   case _SLANG_BC_DEREF_ASSIGN:</div><div class='add'>+	     set_deref_lvalue (addr);</div><div class='add'>+	     break;</div><div class='add'>+	   case _SLANG_BC_SET_LOCAL_LVALUE:</div><div class='add'>+	     set_lvalue_obj (addr-&gt;bc_sub_type, Local_Variable_Frame - addr-&gt;b.i_blk);</div><div class='add'>+	     break;</div><div class='add'>+	   case _SLANG_BC_SET_GLOBAL_LVALUE:</div><div class='add'>+	     if (-1 == set_lvalue_obj (addr-&gt;bc_sub_type, &amp;addr-&gt;b.nt_gvar_blk-&gt;obj))</div><div class='add'>+	       do_name_type_error (addr-&gt;b.nt_blk);</div><div class='add'>+	     break;</div><div class='add'>+	   case _SLANG_BC_SET_INTRIN_LVALUE:</div><div class='add'>+	     set_intrin_lvalue (addr);</div><div class='add'>+	     break;</div><div class='add'>+	   case _SLANG_BC_SET_STRUCT_LVALUE:</div><div class='add'>+	     set_struct_lvalue (addr);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_FIELD:</div><div class='add'>+	     (void) push_struct_field (addr-&gt;b.s_blk);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_SET_ARRAY_LVALUE:</div><div class='add'>+	     set_array_lvalue (addr-&gt;bc_sub_type);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+	   case _SLANG_BC_LINE_NUM:</div><div class='add'>+	     break;</div><div class='add'>+#endif</div><div class='add'>+	     </div><div class='add'>+	   case _SLANG_BC_TMP:</div><div class='add'>+	     tmp_variable_function (addr);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	   case _SLANG_BC_LVARIABLE_AGET:</div><div class='add'>+	     if (0 == push_local_variable (addr-&gt;b.i_blk))</div><div class='add'>+	       do_bc_call_direct_frame (_SLarray_aget);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_LVARIABLE_APUT:</div><div class='add'>+	     if (0 == push_local_variable (addr-&gt;b.i_blk))</div><div class='add'>+	       do_bc_call_direct_frame (_SLarray_aput);</div><div class='add'>+	     break;</div><div class='add'>+	   case _SLANG_BC_INTEGER_PLUS:</div><div class='add'>+	     if (0 == SLclass_push_int_obj (addr-&gt;bc_sub_type, (int) addr-&gt;b.l_blk))</div><div class='add'>+	       do_binary (SLANG_PLUS);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_INTEGER_MINUS:</div><div class='add'>+	     if (0 == SLclass_push_int_obj (addr-&gt;bc_sub_type, (int) addr-&gt;b.l_blk))</div><div class='add'>+	       do_binary (SLANG_MINUS);</div><div class='add'>+	     break;</div><div class='add'>+#endif</div><div class='add'>+#if 0</div><div class='add'>+	   case _SLANG_BC_ARG_LVARIABLE:</div><div class='add'>+	     (void) SLang_start_arg_list ();</div><div class='add'>+	     push_local_variable (addr-&gt;b.i_blk);</div><div class='add'>+	     break;</div><div class='add'>+#endif</div><div class='add'>+	   case _SLANG_BC_EARG_LVARIABLE:</div><div class='add'>+	     push_local_variable (addr-&gt;b.i_blk);</div><div class='add'>+	     (void) SLang_end_arg_list ();</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+#if USE_COMBINED_BYTECODES</div><div class='add'>+	   case _SLANG_BC_CALL_DIRECT_INTRINSIC:</div><div class='add'>+	     (*addr-&gt;b.call_function) ();</div><div class='add'>+	     addr++;</div><div class='add'>+	     execute_intrinsic_fun (addr-&gt;b.nt_ifun_blk);</div><div class='add'>+	     if (SLang_Error)</div><div class='add'>+	       do_traceback(addr-&gt;b.nt_ifun_blk-&gt;name, 0, NULL);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_INTRINSIC_CALL_DIRECT:</div><div class='add'>+	     execute_intrinsic_fun (addr-&gt;b.nt_ifun_blk);</div><div class='add'>+	     if (SLang_Error)</div><div class='add'>+	       {</div><div class='add'>+		  do_traceback(addr-&gt;b.nt_ifun_blk-&gt;name, 0, NULL);</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	     addr++;</div><div class='add'>+	     (*addr-&gt;b.call_function) ();</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_CALL_DIRECT_LSTR:</div><div class='add'>+	     (*addr-&gt;b.call_function) ();</div><div class='add'>+	     addr++;</div><div class='add'>+	     _SLang_dup_and_push_slstring (addr-&gt;b.s_blk);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_CALL_DIRECT_SLFUN:</div><div class='add'>+	     (*addr-&gt;b.call_function) ();</div><div class='add'>+	     addr++;</div><div class='add'>+	     execute_slang_fun (addr-&gt;b.nt_fun_blk);</div><div class='add'>+	     if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_CALL_DIRECT_INTRSTOP:</div><div class='add'>+	     (*addr-&gt;b.call_function) ();</div><div class='add'>+	     addr++;</div><div class='add'>+	     /* drop */</div><div class='add'>+	   case _SLANG_BC_INTRINSIC_STOP:</div><div class='add'>+	     execute_intrinsic_fun (addr-&gt;b.nt_ifun_blk);</div><div class='add'>+	     if (SLang_Error == 0)</div><div class='add'>+	       return 1;</div><div class='add'>+	     do_traceback(addr-&gt;b.nt_ifun_blk-&gt;name, 0, NULL);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_CALL_DIRECT_EARG_LVAR:</div><div class='add'>+	     (*addr-&gt;b.call_function) ();</div><div class='add'>+	     addr++;</div><div class='add'>+	     push_local_variable (addr-&gt;b.i_blk);</div><div class='add'>+	     (void) SLang_end_arg_list ();</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_CALL_DIRECT_LINT:</div><div class='add'>+	     (*addr-&gt;b.call_function) ();</div><div class='add'>+	     addr++;</div><div class='add'>+	     SLclass_push_int_obj (addr-&gt;bc_sub_type, (int) addr-&gt;b.l_blk);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_CALL_DIRECT_LVAR:</div><div class='add'>+	     (*addr-&gt;b.call_function) ();</div><div class='add'>+	     addr++;</div><div class='add'>+	     push_local_variable (addr-&gt;b.i_blk);</div><div class='add'>+	     break;</div><div class='add'>+#endif				       /* USE_COMBINED_BYTECODES */</div><div class='add'>+</div><div class='add'>+	   default:</div><div class='add'>+	     SLang_verror (SL_INTERNAL_ERROR, "Byte-Code 0x%X is not valid", addr-&gt;bc_main_type);</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* Someday I plan to add a 'signal' intrinsic function.  Then when a</div><div class='add'>+	 * signal is caught, a variable will be set to one and that value of</div><div class='add'>+	 * that variable will need to be monitored here, e.g.,</div><div class='add'>+	 * if (Handle_Signal) handle_signal ();</div><div class='add'>+	 * It would be nice to check only one variable instead of Handle_Signal</div><div class='add'>+	 * and SLang_Error.  Perhaps I should phase out SLang_Error = xxx</div><div class='add'>+	 * and used something like: SLang_set_error (code);  Then, I could</div><div class='add'>+	 * use:</div><div class='add'>+	 * if (Handle_Condition)</div><div class='add'>+	 *   {</div><div class='add'>+	 *      Handle_Condition = 0;</div><div class='add'>+	 *      if (SLang_Error) ....</div><div class='add'>+	 *      else if (Handle_Signal) handle_signal ();</div><div class='add'>+	 *      else....</div><div class='add'>+	 *   }</div><div class='add'>+	 */</div><div class='add'>+	if (SLang_Error)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == do_inner_interp_error (err_block, addr_start, addr))</div><div class='add'>+	       return 1;</div><div class='add'>+	     if (SLang_Error)</div><div class='add'>+	       return 1;</div><div class='add'>+</div><div class='add'>+	     /* Otherwise, error cleared.  Continue onto next bytecode.</div><div class='add'>+	      * Someday I need to add something to indicate where the</div><div class='add'>+	      * next statement begins since continuing on the next</div><div class='add'>+	      * bytecode is not really what is desired.</div><div class='add'>+	      */</div><div class='add'>+	     if (Lang_Break_Condition) goto handle_break_condition;</div><div class='add'>+	  }</div><div class='add'>+	addr++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   handle_break_condition:</div><div class='add'>+   /* Get here if Lang_Break_Condition != 0, which implies that either</div><div class='add'>+    * Lang_Return, Lang_Break, or Lang_Continue is non zero</div><div class='add'>+    */</div><div class='add'>+   if (Lang_Return)</div><div class='add'>+     Lang_Break = 1;</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* The functions below this point are used to implement the parsed token</div><div class='add'>+ * to byte-compiled code.</div><div class='add'>+ */</div><div class='add'>+/* static SLang_Name_Type **Static_Hash_Table; */</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type **Locals_Hash_Table;</div><div class='add'>+static int Local_Variable_Number;</div><div class='add'>+static unsigned int Function_Args_Number;</div><div class='add'>+int _SLang_Auto_Declare_Globals = 0;</div><div class='add'>+int (*SLang_Auto_Declare_Var_Hook) (char *);</div><div class='add'>+</div><div class='add'>+static SLang_NameSpace_Type *This_Static_NameSpace;</div><div class='add'>+static SLang_NameSpace_Type *Global_NameSpace;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+static char *This_Compile_Filename;</div><div class='add'>+#endif</div><div class='add'>+static SLBlock_Type SLShort_Blocks[6];</div><div class='add'>+/* These are initialized in add_table below.  I cannot init a Union!! */</div><div class='add'>+</div><div class='add'>+static int Lang_Defining_Function;</div><div class='add'>+static void (*Default_Variable_Mode) (_SLang_Token_Type *);</div><div class='add'>+static void (*Default_Define_Function) (char *, unsigned long);</div><div class='add'>+</div><div class='add'>+static int push_compile_context (char *);</div><div class='add'>+static int pop_compile_context (void);</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   int block_type;</div><div class='add'>+   SLBlock_Type *block;		       /* beginning of block definition */</div><div class='add'>+   SLBlock_Type *block_ptr;	       /* current location */</div><div class='add'>+   SLBlock_Type *block_max;	       /* end of definition */</div><div class='add'>+   SLang_NameSpace_Type *static_namespace;</div><div class='add'>+}</div><div class='add'>+Block_Context_Type;</div><div class='add'>+</div><div class='add'>+static Block_Context_Type Block_Context_Stack [SLANG_MAX_BLOCK_STACK_LEN];</div><div class='add'>+static unsigned int Block_Context_Stack_Len;</div><div class='add'>+</div><div class='add'>+static SLBlock_Type *Compile_ByteCode_Ptr;</div><div class='add'>+static SLBlock_Type *This_Compile_Block;</div><div class='add'>+static SLBlock_Type *This_Compile_Block_Max;</div><div class='add'>+static int This_Compile_Block_Type;</div><div class='add'>+#define COMPILE_BLOCK_TYPE_FUNCTION	1</div><div class='add'>+#define COMPILE_BLOCK_TYPE_BLOCK	2</div><div class='add'>+#define COMPILE_BLOCK_TYPE_TOP_LEVEL	3</div><div class='add'>+</div><div class='add'>+/* If it returns 0, DO NOT FREE p */</div><div class='add'>+static int lang_free_branch (SLBlock_Type *p)</div><div class='add'>+{</div><div class='add'>+   /* Note: we look at 0,2,4, since these blocks are 0 terminated */</div><div class='add'>+   if ((p == SLShort_Blocks)</div><div class='add'>+       || (p == SLShort_Blocks + 2)</div><div class='add'>+       || (p == SLShort_Blocks + 4)</div><div class='add'>+       )</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+        switch (p-&gt;bc_main_type)</div><div class='add'>+	  {</div><div class='add'>+	   case _SLANG_BC_BLOCK:</div><div class='add'>+	     if (lang_free_branch(p-&gt;b.blk))</div><div class='add'>+	       SLfree((char *)p-&gt;b.blk);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_LITERAL:</div><div class='add'>+	   case _SLANG_BC_LITERAL_STR:</div><div class='add'>+	     /* No user types should be here. */</div><div class='add'>+	     cl = _SLclass_get_class (p-&gt;bc_sub_type);</div><div class='add'>+	     (*cl-&gt;cl_byte_code_destroy) (p-&gt;bc_sub_type, (VOID_STAR) &amp;p-&gt;b.ptr_blk);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_FIELD:</div><div class='add'>+	   case _SLANG_BC_SET_STRUCT_LVALUE:</div><div class='add'>+	     SLang_free_slstring (p-&gt;b.s_blk);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   default:</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 0:</div><div class='add'>+	     return 1;</div><div class='add'>+	  }</div><div class='add'>+	p++;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_function_header (_SLBlock_Header_Type *h)</div><div class='add'>+{</div><div class='add'>+   if (h-&gt;num_refs &gt; 1)</div><div class='add'>+     {</div><div class='add'>+	h-&gt;num_refs--;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (h-&gt;body != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (lang_free_branch (h-&gt;body))</div><div class='add'>+	  SLfree ((char *) h-&gt;body);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLfree ((char *) h);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_block_context (int type)</div><div class='add'>+{</div><div class='add'>+   Block_Context_Type *c;</div><div class='add'>+   unsigned int num;</div><div class='add'>+   SLBlock_Type *b;</div><div class='add'>+</div><div class='add'>+   if (Block_Context_Stack_Len == SLANG_MAX_BLOCK_STACK_LEN)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_STACK_OVERFLOW, "Block stack overflow");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   num = 5;    /* 40 bytes */</div><div class='add'>+   if (NULL == (b = (SLBlock_Type *) SLcalloc (num, sizeof (SLBlock_Type))))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   c = Block_Context_Stack + Block_Context_Stack_Len;</div><div class='add'>+   c-&gt;block = This_Compile_Block;</div><div class='add'>+   c-&gt;block_ptr = Compile_ByteCode_Ptr;</div><div class='add'>+   c-&gt;block_max = This_Compile_Block_Max;</div><div class='add'>+   c-&gt;block_type = This_Compile_Block_Type;</div><div class='add'>+   c-&gt;static_namespace = This_Static_NameSpace;</div><div class='add'>+</div><div class='add'>+   Compile_ByteCode_Ptr = This_Compile_Block = b;</div><div class='add'>+   This_Compile_Block_Max = b + num;</div><div class='add'>+   This_Compile_Block_Type = type;</div><div class='add'>+</div><div class='add'>+   Block_Context_Stack_Len += 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_block_context (void)</div><div class='add'>+{</div><div class='add'>+   Block_Context_Type *c;</div><div class='add'>+</div><div class='add'>+   if (Block_Context_Stack_Len == 0)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   Block_Context_Stack_Len -= 1;</div><div class='add'>+   c = Block_Context_Stack + Block_Context_Stack_Len;</div><div class='add'>+</div><div class='add'>+   This_Compile_Block = c-&gt;block;</div><div class='add'>+   This_Compile_Block_Max = c-&gt;block_max;</div><div class='add'>+   This_Compile_Block_Type = c-&gt;block_type;</div><div class='add'>+   Compile_ByteCode_Ptr = c-&gt;block_ptr;</div><div class='add'>+   This_Static_NameSpace = c-&gt;static_namespace;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLcompile_push_context (SLang_Load_Type *load_object)</div><div class='add'>+{</div><div class='add'>+   if (-1 == push_compile_context (load_object-&gt;name))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (NULL == (This_Static_NameSpace = _SLns_allocate_namespace (load_object-&gt;name, SLSTATIC_HASH_TABLE_SIZE)))</div><div class='add'>+     {</div><div class='add'>+	pop_compile_context ();</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == push_block_context (COMPILE_BLOCK_TYPE_TOP_LEVEL))</div><div class='add'>+     {</div><div class='add'>+	pop_compile_context ();</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLcompile_pop_context (void)</div><div class='add'>+{</div><div class='add'>+   if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+     {</div><div class='add'>+	Compile_ByteCode_Ptr-&gt;bc_main_type = 0;</div><div class='add'>+	if (lang_free_branch (This_Compile_Block))</div><div class='add'>+	  SLfree ((char *) This_Compile_Block);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   (void) pop_block_context ();</div><div class='add'>+   (void) pop_compile_context ();</div><div class='add'>+</div><div class='add'>+   if (This_Compile_Block == NULL)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+   if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INTERNAL_ERROR, "Not at top-level");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*{{{ Hash and Name Table Functions */</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type *locate_name_in_table (char *name, unsigned long hash,</div><div class='add'>+					      SLang_Name_Type **table, unsigned int table_size)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *t;</div><div class='add'>+   char ch;</div><div class='add'>+</div><div class='add'>+   t = table [(unsigned int) (hash % table_size)];</div><div class='add'>+   ch = *name++;</div><div class='add'>+</div><div class='add'>+   while (t != NULL)</div><div class='add'>+     {</div><div class='add'>+	if ((ch == t-&gt;name[0])</div><div class='add'>+	    &amp;&amp; (0 == strcmp (t-&gt;name + 1, name)))</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	t = t-&gt;next;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return t;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type *locate_namespace_encoded_name (char *name, int err_on_bad_ns)</div><div class='add'>+{</div><div class='add'>+   char *ns, *ns1;</div><div class='add'>+   SLang_NameSpace_Type *table;</div><div class='add'>+   SLang_Name_Type *nt;</div><div class='add'>+</div><div class='add'>+   ns = name;</div><div class='add'>+   name = strchr (name, '-');</div><div class='add'>+   if ((name == NULL) || (name [1] != '&gt;'))</div><div class='add'>+     name = ns;</div><div class='add'>+</div><div class='add'>+   ns1 = SLang_create_nslstring (ns, (unsigned int) (name - ns));</div><div class='add'>+   if (ns1 == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+   if (ns != name)</div><div class='add'>+     name += 2;</div><div class='add'>+   ns = ns1;</div><div class='add'>+</div><div class='add'>+   if (*ns == 0)</div><div class='add'>+     {</div><div class='add'>+	/* Use Global Namespace */</div><div class='add'>+	SLang_free_slstring (ns);</div><div class='add'>+	return locate_name_in_table (name, _SLcompute_string_hash (name),</div><div class='add'>+				     Global_NameSpace-&gt;table, Global_NameSpace-&gt;table_size);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (table = _SLns_find_namespace (ns)))</div><div class='add'>+     {</div><div class='add'>+	if (err_on_bad_ns)</div><div class='add'>+	  SLang_verror (SL_SYNTAX_ERROR, "Unable to find namespace called %s", ns);</div><div class='add'>+	SLang_free_slstring (ns);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   SLang_free_slstring (ns);</div><div class='add'>+</div><div class='add'>+   /* FIXME: the hash table size should be stored in the hash table itself */</div><div class='add'>+   nt = locate_name_in_table (name, _SLcompute_string_hash (name),</div><div class='add'>+			      table-&gt;table, table-&gt;table_size);</div><div class='add'>+   if (nt == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   switch (nt-&gt;name_type)</div><div class='add'>+     {</div><div class='add'>+	/* These are private and cannot be accessed through the namespace. */</div><div class='add'>+      case SLANG_PVARIABLE:</div><div class='add'>+      case SLANG_PFUNCTION:</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   return nt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type *locate_hashed_name (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *t;</div><div class='add'>+</div><div class='add'>+   if (Lang_Defining_Function)</div><div class='add'>+     {</div><div class='add'>+	t = locate_name_in_table (name, hash, Locals_Hash_Table, SLLOCALS_HASH_TABLE_SIZE);</div><div class='add'>+	if (t != NULL)</div><div class='add'>+	  return t;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((This_Static_NameSpace != NULL)</div><div class='add'>+       &amp;&amp; (NULL != (t = locate_name_in_table (name, hash, This_Static_NameSpace-&gt;table, This_Static_NameSpace-&gt;table_size))))</div><div class='add'>+     return t;</div><div class='add'>+</div><div class='add'>+   t = locate_name_in_table (name, hash, Global_NameSpace-&gt;table, Global_NameSpace-&gt;table_size);</div><div class='add'>+   if (NULL != t)</div><div class='add'>+     return t;</div><div class='add'>+</div><div class='add'>+   return locate_namespace_encoded_name (name, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Name_Type *_SLlocate_name (char *name)</div><div class='add'>+{</div><div class='add'>+   return locate_hashed_name (name, _SLcompute_string_hash (name));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type *</div><div class='add'>+add_name_to_hash_table (char *name, unsigned long hash,</div><div class='add'>+			unsigned int sizeof_obj, unsigned char name_type,</div><div class='add'>+			SLang_Name_Type **table, unsigned int table_size,</div><div class='add'>+			int check_existing)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *t;</div><div class='add'>+</div><div class='add'>+   if (check_existing)</div><div class='add'>+     {</div><div class='add'>+	t = locate_name_in_table (name, hash, table, table_size);</div><div class='add'>+	if (t != NULL)</div><div class='add'>+	  return t;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLcheck_identifier_syntax (name))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   t = (SLang_Name_Type *) SLmalloc (sizeof_obj);</div><div class='add'>+   if (t == NULL)</div><div class='add'>+     return t;</div><div class='add'>+</div><div class='add'>+   memset ((char *) t, 0, sizeof_obj);</div><div class='add'>+   if (NULL == (t-&gt;name = _SLstring_dup_hashed_string (name, hash)))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) t);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   t-&gt;name_type = name_type;</div><div class='add'>+</div><div class='add'>+   hash = hash % table_size;</div><div class='add'>+   t-&gt;next = table [(unsigned int)hash];</div><div class='add'>+   table [(unsigned int) hash] = t;</div><div class='add'>+</div><div class='add'>+   return t;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type *</div><div class='add'>+add_global_name (char *name, unsigned long hash,</div><div class='add'>+		 unsigned char name_type, unsigned int sizeof_obj,</div><div class='add'>+		 SLang_NameSpace_Type *ns)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *nt;</div><div class='add'>+   SLang_Name_Type **table;</div><div class='add'>+   unsigned int table_size;</div><div class='add'>+   </div><div class='add'>+   table = ns-&gt;table;</div><div class='add'>+   table_size = ns-&gt;table_size;</div><div class='add'>+</div><div class='add'>+   nt = locate_name_in_table (name, hash, table, table_size);</div><div class='add'>+   if (nt != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (nt-&gt;name_type == name_type)</div><div class='add'>+	  return nt;</div><div class='add'>+</div><div class='add'>+	SLang_verror (SL_DUPLICATE_DEFINITION, "%s cannot be re-defined", name);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return add_name_to_hash_table (name, hash, sizeof_obj, name_type,</div><div class='add'>+				  table, table_size, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int add_intrinsic_function (SLang_NameSpace_Type *ns,</div><div class='add'>+				   char *name, FVOID_STAR addr, unsigned char ret_type,</div><div class='add'>+				   unsigned int nargs, va_list ap)</div><div class='add'>+{</div><div class='add'>+   SLang_Intrin_Fun_Type *f;</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   if (-1 == init_interpreter ())</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   if (ns == NULL) ns = Global_NameSpace;</div><div class='add'>+</div><div class='add'>+   if (nargs &gt; SLANG_MAX_INTRIN_ARGS)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_APPLICATION_ERROR, "Function %s requires too many arguments", name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (ret_type == SLANG_FLOAT_TYPE)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED, "Function %s is not permitted to return float", name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   f = (SLang_Intrin_Fun_Type *) add_global_name (name, _SLcompute_string_hash (name),</div><div class='add'>+						  SLANG_INTRINSIC, sizeof (SLang_Intrin_Fun_Type),</div><div class='add'>+						  ns);</div><div class='add'>+</div><div class='add'>+   if (f == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   f-&gt;i_fun = addr;</div><div class='add'>+   f-&gt;num_args = nargs;</div><div class='add'>+   f-&gt;return_type = ret_type;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; nargs; i++)</div><div class='add'>+     f-&gt;arg_types [i] = va_arg (ap, unsigned int);</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_intrinsic_function (char *name, FVOID_STAR addr, unsigned char ret_type,</div><div class='add'>+			      unsigned int nargs, ...)</div><div class='add'>+{</div><div class='add'>+   va_list ap;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   va_start (ap, nargs);</div><div class='add'>+   status = add_intrinsic_function (NULL, name, addr, ret_type, nargs, ap);</div><div class='add'>+   va_end (ap);</div><div class='add'>+</div><div class='add'>+   return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLns_add_intrinsic_function (SLang_NameSpace_Type *ns, </div><div class='add'>+				 char *name, FVOID_STAR addr, unsigned char ret_type,</div><div class='add'>+				 unsigned int nargs, ...)</div><div class='add'>+{</div><div class='add'>+   va_list ap;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   va_start (ap, nargs);</div><div class='add'>+   status = add_intrinsic_function (ns, name, addr, ret_type, nargs, ap);</div><div class='add'>+   va_end (ap);</div><div class='add'>+</div><div class='add'>+   return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLns_add_intrinsic_variable (SLang_NameSpace_Type *ns,</div><div class='add'>+				   char *name, VOID_STAR addr, unsigned char data_type, int ro)</div><div class='add'>+{</div><div class='add'>+   SLang_Intrin_Var_Type *v;</div><div class='add'>+</div><div class='add'>+   if (-1 == init_interpreter ())</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   if (ns == NULL) ns = Global_NameSpace;</div><div class='add'>+</div><div class='add'>+   v = (SLang_Intrin_Var_Type *)add_global_name (name,</div><div class='add'>+						 _SLcompute_string_hash (name),</div><div class='add'>+						 (ro ? SLANG_RVARIABLE : SLANG_IVARIABLE),</div><div class='add'>+						 sizeof (SLang_Intrin_Var_Type),</div><div class='add'>+						 ns);</div><div class='add'>+   if (v == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   v-&gt;addr = addr;</div><div class='add'>+   v-&gt;type = data_type;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+  </div><div class='add'>+int SLadd_intrinsic_variable (char *name, VOID_STAR addr, unsigned char data_type, int ro)</div><div class='add'>+{</div><div class='add'>+   return SLns_add_intrinsic_variable (NULL, name, addr, data_type, ro);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+add_slang_function (char *name, unsigned char type, unsigned long hash,</div><div class='add'>+		    unsigned int num_args, unsigned int num_locals,</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+		    char *file,</div><div class='add'>+#endif</div><div class='add'>+		    _SLBlock_Header_Type *h, </div><div class='add'>+		    SLang_NameSpace_Type *ns)</div><div class='add'>+{</div><div class='add'>+   _SLang_Function_Type *f;</div><div class='add'>+   </div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   if ((file != NULL)</div><div class='add'>+       &amp;&amp; (NULL == (file = SLang_create_slstring (file))))</div><div class='add'>+     return -1;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   f = (_SLang_Function_Type *)add_global_name (name, hash,</div><div class='add'>+						type,</div><div class='add'>+						sizeof (_SLang_Function_Type),</div><div class='add'>+						ns);</div><div class='add'>+   if (f == NULL)</div><div class='add'>+     {</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+	SLang_free_slstring (file);    /* NULL ok */</div><div class='add'>+#endif</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (f-&gt;v.header != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (f-&gt;nlocals == AUTOLOAD_NUM_LOCALS)</div><div class='add'>+	  SLang_free_slstring ((char *)f-&gt;v.autoload_filename); /* autoloaded filename */</div><div class='add'>+	else</div><div class='add'>+	  free_function_header (f-&gt;v.header);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   if (f-&gt;file != NULL) SLang_free_slstring (f-&gt;file);</div><div class='add'>+   f-&gt;file = file;</div><div class='add'>+#endif</div><div class='add'>+   f-&gt;v.header = h;</div><div class='add'>+   f-&gt;nlocals = num_locals;</div><div class='add'>+   f-&gt;nargs = num_args;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_autoload (char *name, char *file)</div><div class='add'>+{</div><div class='add'>+   _SLang_Function_Type *f;</div><div class='add'>+   unsigned long hash;</div><div class='add'>+</div><div class='add'>+   hash = _SLcompute_string_hash (name);</div><div class='add'>+   f = (_SLang_Function_Type *)locate_name_in_table (name, hash, Global_NameSpace-&gt;table, Global_NameSpace-&gt;table_size);</div><div class='add'>+</div><div class='add'>+   if ((f != NULL)</div><div class='add'>+       &amp;&amp; (f-&gt;name_type == SLANG_FUNCTION)</div><div class='add'>+       &amp;&amp; (f-&gt;v.header != NULL)</div><div class='add'>+       &amp;&amp; (f-&gt;nlocals != AUTOLOAD_NUM_LOCALS))</div><div class='add'>+     {</div><div class='add'>+	/* already loaded */</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   file = SLang_create_slstring (file);</div><div class='add'>+   if (-1 == add_slang_function (name, SLANG_FUNCTION, hash, 0, AUTOLOAD_NUM_LOCALS,</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+				 file,</div><div class='add'>+#endif</div><div class='add'>+				 (_SLBlock_Header_Type *) file,</div><div class='add'>+				 Global_NameSpace))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (file);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Name_Type *_SLlocate_global_name (char *name)</div><div class='add'>+{</div><div class='add'>+   unsigned long hash;</div><div class='add'>+</div><div class='add'>+   hash = _SLcompute_string_hash (name);</div><div class='add'>+   return locate_name_in_table (name, hash, Global_NameSpace-&gt;table, </div><div class='add'>+				Global_NameSpace-&gt;table_size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void free_local_variable_table (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+   SLang_Name_Type *t, *t1;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; SLLOCALS_HASH_TABLE_SIZE; i++)</div><div class='add'>+     {</div><div class='add'>+	t = Locals_Hash_Table [i];</div><div class='add'>+	while (t != NULL)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_slstring (t-&gt;name);</div><div class='add'>+	     t1 = t-&gt;next;</div><div class='add'>+	     SLfree ((char *) t);</div><div class='add'>+	     t = t1;</div><div class='add'>+	  }</div><div class='add'>+	Locals_Hash_Table [i] = NULL;</div><div class='add'>+     }</div><div class='add'>+   Local_Variable_Number = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* call inner interpreter or return for more */</div><div class='add'>+static void lang_try_now(void)</div><div class='add'>+{</div><div class='add'>+   Compile_ByteCode_Ptr++;</div><div class='add'>+   if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = 0;  /* so next command stops after this */</div><div class='add'>+</div><div class='add'>+   /* now do it */</div><div class='add'>+   inner_interp (This_Compile_Block);</div><div class='add'>+   (void) lang_free_branch (This_Compile_Block);</div><div class='add'>+   Compile_ByteCode_Ptr = This_Compile_Block;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Name_Type *SLang_get_fun_from_ref (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+   if (ref-&gt;is_global)</div><div class='add'>+     {</div><div class='add'>+	SLang_Name_Type *nt = ref-&gt;v.nt;</div><div class='add'>+</div><div class='add'>+	switch (nt-&gt;name_type)</div><div class='add'>+	  {</div><div class='add'>+	   case SLANG_PFUNCTION:</div><div class='add'>+	   case SLANG_FUNCTION:</div><div class='add'>+	   case SLANG_INTRINSIC:</div><div class='add'>+	   case SLANG_MATH_UNARY:</div><div class='add'>+	   case SLANG_APP_UNARY:</div><div class='add'>+	     return nt;</div><div class='add'>+	  }</div><div class='add'>+	SLang_verror (SL_TYPE_MISMATCH,</div><div class='add'>+		      "Reference to a function expected.  Found &amp;%s", </div><div class='add'>+		      nt-&gt;name);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_verror (SL_TYPE_MISMATCH,</div><div class='add'>+		 "Reference to a function expected");</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLexecute_function (SLang_Name_Type *nt)</div><div class='add'>+{</div><div class='add'>+   unsigned char type;</div><div class='add'>+   char *name;</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   type = nt-&gt;name_type;</div><div class='add'>+   name = nt-&gt;name;</div><div class='add'>+</div><div class='add'>+   switch (type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_PFUNCTION:</div><div class='add'>+      case SLANG_FUNCTION:</div><div class='add'>+	execute_slang_fun ((_SLang_Function_Type *) nt);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_INTRINSIC:</div><div class='add'>+	execute_intrinsic_fun ((SLang_Intrin_Fun_Type *) nt);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_MATH_UNARY:</div><div class='add'>+      case SLANG_APP_UNARY:</div><div class='add'>+	inner_interp_nametype (nt);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	SLang_verror (SL_TYPE_MISMATCH, "%s is not a function", name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SLang_Error, "Error while executing %s", name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_execute_function (char *name)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *entry;</div><div class='add'>+</div><div class='add'>+   if (NULL == (entry = SLang_get_function (name)))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   return SLexecute_function (entry);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* return S-Lang function or NULL */</div><div class='add'>+SLang_Name_Type *SLang_get_function (char *name)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *entry;</div><div class='add'>+</div><div class='add'>+   if (NULL == (entry = locate_namespace_encoded_name (name, 0)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   if ((entry-&gt;name_type == SLANG_FUNCTION)</div><div class='add'>+       || (entry-&gt;name_type == SLANG_INTRINSIC))</div><div class='add'>+     return entry;</div><div class='add'>+</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void lang_begin_function (void)</div><div class='add'>+{</div><div class='add'>+   if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "Function nesting is illegal");</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   Lang_Defining_Function = 1;</div><div class='add'>+   (void) push_block_context (COMPILE_BLOCK_TYPE_FUNCTION);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if USE_COMBINED_BYTECODES</div><div class='add'>+static void optimize_block (SLBlock_Type *b)</div><div class='add'>+{</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	switch (b-&gt;bc_main_type)</div><div class='add'>+	  {</div><div class='add'>+	   case 0:</div><div class='add'>+	     return;</div><div class='add'>+	     </div><div class='add'>+	   default:</div><div class='add'>+	     b++;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case _SLANG_BC_CALL_DIRECT:</div><div class='add'>+	     b++;</div><div class='add'>+	     switch (b-&gt;bc_main_type)</div><div class='add'>+	       {</div><div class='add'>+		case 0:</div><div class='add'>+		  return;</div><div class='add'>+		case _SLANG_BC_INTRINSIC:</div><div class='add'>+		  if ((b+1)-&gt;bc_main_type == 0)</div><div class='add'>+		    {</div><div class='add'>+		       (b-1)-&gt;bc_main_type = _SLANG_BC_CALL_DIRECT_INTRSTOP;</div><div class='add'>+		       return;</div><div class='add'>+		    }</div><div class='add'>+		  (b-1)-&gt;bc_main_type = _SLANG_BC_CALL_DIRECT_INTRINSIC;</div><div class='add'>+		  b++;</div><div class='add'>+		  break;</div><div class='add'>+		case _SLANG_BC_LITERAL_STR:</div><div class='add'>+		  (b-1)-&gt;bc_main_type = _SLANG_BC_CALL_DIRECT_LSTR;</div><div class='add'>+		  b++;</div><div class='add'>+		  break;</div><div class='add'>+		case _SLANG_BC_FUNCTION:</div><div class='add'>+		case _SLANG_BC_PFUNCTION:</div><div class='add'>+		  (b-1)-&gt;bc_main_type = _SLANG_BC_CALL_DIRECT_SLFUN;</div><div class='add'>+		  b++;</div><div class='add'>+		  break;</div><div class='add'>+		case _SLANG_BC_EARG_LVARIABLE:</div><div class='add'>+		  (b-1)-&gt;bc_main_type = _SLANG_BC_CALL_DIRECT_EARG_LVAR;</div><div class='add'>+		  b++;</div><div class='add'>+		  break;</div><div class='add'>+		case _SLANG_BC_LITERAL_INT:</div><div class='add'>+		  (b-1)-&gt;bc_main_type = _SLANG_BC_CALL_DIRECT_LINT;</div><div class='add'>+		  b++;</div><div class='add'>+		  break;</div><div class='add'>+		case _SLANG_BC_LVARIABLE:</div><div class='add'>+		  (b-1)-&gt;bc_main_type = _SLANG_BC_CALL_DIRECT_LVAR;</div><div class='add'>+		  b++;</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+	     </div><div class='add'>+	   case _SLANG_BC_INTRINSIC:</div><div class='add'>+	     b++;</div><div class='add'>+	     switch (b-&gt;bc_main_type)</div><div class='add'>+	       {</div><div class='add'>+		case _SLANG_BC_CALL_DIRECT:</div><div class='add'>+		  (b-1)-&gt;bc_main_type = _SLANG_BC_INTRINSIC_CALL_DIRECT;</div><div class='add'>+		  b++;</div><div class='add'>+		  break;</div><div class='add'>+#if 0</div><div class='add'>+		case _SLANG_BC_BLOCK:</div><div class='add'>+		  (b-1)-&gt;bc_main_type = _SLANG_BC_INTRINSIC_BLOCK;</div><div class='add'>+		  b++;</div><div class='add'>+		  break;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+		case 0:</div><div class='add'>+		  (b-1)-&gt;bc_main_type = _SLANG_BC_INTRINSIC_STOP;</div><div class='add'>+		  return;</div><div class='add'>+	       }	     </div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* name will be NULL if the object is to simply terminate the function</div><div class='add'>+ * definition.  See SLang_restart.</div><div class='add'>+ */</div><div class='add'>+static int lang_define_function (char *name, unsigned char type, unsigned long hash,</div><div class='add'>+				 SLang_NameSpace_Type *ns)</div><div class='add'>+{</div><div class='add'>+   if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_FUNCTION)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "Premature end of function");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* terminate function */</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = 0;</div><div class='add'>+</div><div class='add'>+   if (name != NULL)</div><div class='add'>+     {</div><div class='add'>+	_SLBlock_Header_Type *h;</div><div class='add'>+</div><div class='add'>+	h = (_SLBlock_Header_Type *)SLmalloc (sizeof (_SLBlock_Header_Type));</div><div class='add'>+	if (h != NULL)</div><div class='add'>+	  {</div><div class='add'>+	     h-&gt;num_refs = 1;</div><div class='add'>+	     h-&gt;body = This_Compile_Block;</div><div class='add'>+	     </div><div class='add'>+#if USE_COMBINED_BYTECODES</div><div class='add'>+	     optimize_block (h-&gt;body);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+	     if (-1 == add_slang_function (name, type, hash,</div><div class='add'>+					   Function_Args_Number,</div><div class='add'>+					   Local_Variable_Number,</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+					   This_Compile_Filename,</div><div class='add'>+#endif</div><div class='add'>+					   h, ns))</div><div class='add'>+	       SLfree ((char *) h);</div><div class='add'>+	  }</div><div class='add'>+	/* Drop through for clean-up */</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   free_local_variable_table ();</div><div class='add'>+</div><div class='add'>+   Function_Args_Number = 0;</div><div class='add'>+   Lang_Defining_Function = 0;</div><div class='add'>+</div><div class='add'>+   if (SLang_Error) return -1;</div><div class='add'>+   /* SLang_restart will finish this if there is a slang error. */</div><div class='add'>+</div><div class='add'>+   pop_block_context ();</div><div class='add'>+</div><div class='add'>+   /* A function is only defined at top-level */</div><div class='add'>+   if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INTERNAL_ERROR, "Not at top-level");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   Compile_ByteCode_Ptr = This_Compile_Block;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void define_static_function (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   (void) lang_define_function (name, SLANG_FUNCTION, hash, This_Static_NameSpace);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void define_private_function (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   (void) lang_define_function (name, SLANG_PFUNCTION, hash, This_Static_NameSpace);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void define_public_function (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   (void) lang_define_function (name, SLANG_FUNCTION, hash, Global_NameSpace);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void lang_end_block (void)</div><div class='add'>+{</div><div class='add'>+   SLBlock_Type *node, *branch;</div><div class='add'>+   unsigned char mtype;</div><div class='add'>+</div><div class='add'>+   if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_BLOCK)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "Not defining a block");</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* terminate the block */</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = 0;</div><div class='add'>+   branch = This_Compile_Block;</div><div class='add'>+</div><div class='add'>+   /* Try to save some space by using the cached blocks. */</div><div class='add'>+   if (Compile_ByteCode_Ptr == branch + 1)</div><div class='add'>+     {</div><div class='add'>+	mtype = branch-&gt;bc_main_type;</div><div class='add'>+	if (((mtype == _SLANG_BC_BREAK)</div><div class='add'>+	     || (mtype == _SLANG_BC_CONTINUE)</div><div class='add'>+	     || (mtype == _SLANG_BC_RETURN))</div><div class='add'>+	    &amp;&amp; (SLang_Error == 0))</div><div class='add'>+	  {</div><div class='add'>+	     SLfree ((char *)branch);</div><div class='add'>+	     branch = SLShort_Blocks + 2 * (int) (mtype - _SLANG_BC_RETURN);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#if USE_COMBINED_BYTECODES</div><div class='add'>+   optimize_block (branch);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   pop_block_context ();</div><div class='add'>+   node = Compile_ByteCode_Ptr++;</div><div class='add'>+</div><div class='add'>+   node-&gt;bc_main_type = _SLANG_BC_BLOCK;</div><div class='add'>+   node-&gt;bc_sub_type = 0;</div><div class='add'>+   node-&gt;b.blk = branch;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int lang_begin_block (void)</div><div class='add'>+{</div><div class='add'>+   return push_block_context (COMPILE_BLOCK_TYPE_BLOCK);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int lang_check_space (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int n;</div><div class='add'>+   SLBlock_Type *p;</div><div class='add'>+</div><div class='add'>+   if (NULL == (p = This_Compile_Block))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INTERNAL_ERROR, "Top-level block not present");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Allow 1 extra for terminator */</div><div class='add'>+   if (Compile_ByteCode_Ptr + 1 &lt; This_Compile_Block_Max)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   n = (unsigned int) (This_Compile_Block_Max - p);</div><div class='add'>+</div><div class='add'>+   /* enlarge the space by 2 objects */</div><div class='add'>+   n += 2;</div><div class='add'>+</div><div class='add'>+   if (NULL == (p = (SLBlock_Type *) SLrealloc((char *)p, n * sizeof(SLBlock_Type))))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   This_Compile_Block_Max = p + n;</div><div class='add'>+   n = (unsigned int) (Compile_ByteCode_Ptr - This_Compile_Block);</div><div class='add'>+   This_Compile_Block = p;</div><div class='add'>+   Compile_ByteCode_Ptr = p + n;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* returns positive number if name is a function or negative number if it</div><div class='add'>+ is a variable.  If it is intrinsic, it returns magnitude of 1, else 2 */</div><div class='add'>+int SLang_is_defined(char *name)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *t;</div><div class='add'>+</div><div class='add'>+   if (-1 == init_interpreter ())</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   t = locate_namespace_encoded_name (name, 0);</div><div class='add'>+   if (t == NULL)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   switch (t-&gt;name_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_FUNCTION:</div><div class='add'>+      /* case SLANG_PFUNCTION: */</div><div class='add'>+	return 2;</div><div class='add'>+      case SLANG_GVARIABLE:</div><div class='add'>+      /* case SLANG_PVARIABLE: */</div><div class='add'>+	return -2;</div><div class='add'>+</div><div class='add'>+      case SLANG_ICONSTANT:</div><div class='add'>+      case SLANG_DCONSTANT:</div><div class='add'>+      case SLANG_RVARIABLE:</div><div class='add'>+      case SLANG_IVARIABLE:</div><div class='add'>+	return -1;</div><div class='add'>+</div><div class='add'>+      case SLANG_INTRINSIC:</div><div class='add'>+      default:</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int add_global_variable (char *name, char name_type, unsigned long hash,</div><div class='add'>+				SLang_NameSpace_Type *ns)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *g;</div><div class='add'>+</div><div class='add'>+   /* Note the importance of checking if it is already defined or not.  For example,</div><div class='add'>+    * suppose X is defined as an intrinsic variable.  Then S-Lang code like:</div><div class='add'>+    * !if (is_defined("X")) { variable X; }</div><div class='add'>+    * will not result in a global variable X.  On the other hand, this would</div><div class='add'>+    * not be an issue if 'variable' statements always were not processed</div><div class='add'>+    * immediately.  That is, as it is now, 'if (0) {variable ZZZZ;}' will result</div><div class='add'>+    * in the variable ZZZZ being defined because of the immediate processing.</div><div class='add'>+    * The current solution is to do: if (0) { eval("variable ZZZZ;"); }</div><div class='add'>+    */</div><div class='add'>+   /* hash = _SLcompute_string_hash (name); */</div><div class='add'>+   g = locate_name_in_table (name, hash, ns-&gt;table, ns-&gt;table_size);</div><div class='add'>+</div><div class='add'>+   if (g != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (g-&gt;name_type == name_type)</div><div class='add'>+	  return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == add_global_name (name, hash, name_type,</div><div class='add'>+				sizeof (SLang_Global_Var_Type), ns))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_global_variable (char *name)</div><div class='add'>+{</div><div class='add'>+   if (-1 == init_interpreter ())</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return add_global_variable (name, SLANG_GVARIABLE,</div><div class='add'>+			       _SLcompute_string_hash (name),</div><div class='add'>+			       Global_NameSpace);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int add_local_variable (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   SLang_Local_Var_Type *t;</div><div class='add'>+</div><div class='add'>+   /* local variable */</div><div class='add'>+   if (Local_Variable_Number &gt;= SLANG_MAX_LOCAL_VARIABLES)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "Too many local variables");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL != locate_name_in_table (name, hash, Locals_Hash_Table, SLLOCALS_HASH_TABLE_SIZE))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "Local variable %s has already been defined", name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   t = (SLang_Local_Var_Type *)</div><div class='add'>+     add_name_to_hash_table (name, hash,</div><div class='add'>+			     sizeof (SLang_Local_Var_Type), SLANG_LVARIABLE,</div><div class='add'>+			     Locals_Hash_Table, SLLOCALS_HASH_TABLE_SIZE, 0);</div><div class='add'>+   if (t == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   t-&gt;local_var_number = Local_Variable_Number;</div><div class='add'>+   Local_Variable_Number++;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void (*Compile_Mode_Function) (_SLang_Token_Type *);</div><div class='add'>+static void compile_basic_token_mode (_SLang_Token_Type *);</div><div class='add'>+</div><div class='add'>+/* if an error occurs, discard current object, block, function, etc... */</div><div class='add'>+void SLang_restart (int localv)</div><div class='add'>+{</div><div class='add'>+   int save = SLang_Error;</div><div class='add'>+</div><div class='add'>+   SLang_Error = SL_UNKNOWN_ERROR;</div><div class='add'>+</div><div class='add'>+   _SLcompile_ptr = _SLcompile;</div><div class='add'>+   Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+</div><div class='add'>+   Lang_Break = /* Lang_Continue = */ Lang_Return = 0;</div><div class='add'>+   Trace_Mode = 0;</div><div class='add'>+</div><div class='add'>+   while (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_BLOCK)</div><div class='add'>+     lang_end_block();</div><div class='add'>+</div><div class='add'>+   if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_FUNCTION)</div><div class='add'>+     {</div><div class='add'>+	/* Terminate function definition and free variables */</div><div class='add'>+	lang_define_function (NULL, SLANG_FUNCTION, 0, Global_NameSpace);</div><div class='add'>+	if (lang_free_branch (This_Compile_Block))</div><div class='add'>+	  SLfree((char *)This_Compile_Block);</div><div class='add'>+     }</div><div class='add'>+   Lang_Defining_Function = 0;</div><div class='add'>+</div><div class='add'>+   SLang_Error = save;</div><div class='add'>+</div><div class='add'>+   if (SLang_Error == SL_STACK_OVERFLOW)</div><div class='add'>+     {</div><div class='add'>+	/* This loop guarantees that the stack is properly cleaned. */</div><div class='add'>+	while (_SLStack_Pointer != _SLRun_Stack)</div><div class='add'>+	  {</div><div class='add'>+	     SLdo_pop ();</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while ((This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+	  &amp;&amp; (0 == pop_block_context ()))</div><div class='add'>+     ;</div><div class='add'>+</div><div class='add'>+   if (localv)</div><div class='add'>+     {</div><div class='add'>+	Next_Function_Num_Args = SLang_Num_Function_Args = 0;</div><div class='add'>+	Local_Variable_Frame = Local_Variable_Stack;</div><div class='add'>+	Recursion_Depth = 0;</div><div class='add'>+	Frame_Pointer = _SLStack_Pointer;</div><div class='add'>+	Frame_Pointer_Depth = 0;</div><div class='add'>+	Switch_Obj_Ptr = Switch_Objects;</div><div class='add'>+	while (Switch_Obj_Ptr &lt; Switch_Obj_Max)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_object (Switch_Obj_Ptr);</div><div class='add'>+	     Switch_Obj_Ptr++;</div><div class='add'>+	  }</div><div class='add'>+	Switch_Obj_Ptr = Switch_Objects;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_directive (unsigned char sub_type)</div><div class='add'>+{</div><div class='add'>+   /* This function is called only from compile_directive_mode which is</div><div class='add'>+    * only possible when a block is available.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   /* use BLOCK */</div><div class='add'>+   Compile_ByteCode_Ptr--;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = sub_type;</div><div class='add'>+</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_unary (int op, unsigned char mt)</div><div class='add'>+{</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = mt;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.i_blk = op;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = 0;</div><div class='add'>+</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static void compile_binary (int op)</div><div class='add'>+{</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_BINARY;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.i_blk = op;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = 0;</div><div class='add'>+</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+static int try_compressed_bytecode (unsigned char last_bc, unsigned char bc)</div><div class='add'>+{</div><div class='add'>+   if (Compile_ByteCode_Ptr != This_Compile_Block)</div><div class='add'>+     {</div><div class='add'>+	SLBlock_Type *b;</div><div class='add'>+	b = Compile_ByteCode_Ptr - 1;</div><div class='add'>+	if (b-&gt;bc_main_type == last_bc)</div><div class='add'>+	  {</div><div class='add'>+	     Compile_ByteCode_Ptr = b;</div><div class='add'>+	     b-&gt;bc_main_type = bc;</div><div class='add'>+	     lang_try_now ();</div><div class='add'>+	     return 0;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void compile_fast_binary (int op, unsigned char bc)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (0 == try_compressed_bytecode (_SLANG_BC_LITERAL_INT, bc))</div><div class='add'>+     return;</div><div class='add'>+#else</div><div class='add'>+   (void) bc;</div><div class='add'>+#endif</div><div class='add'>+   compile_binary (op);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is a hack */</div><div class='add'>+typedef struct _Special_NameTable_Type</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   int (*fun) (struct _Special_NameTable_Type *, _SLang_Token_Type *);</div><div class='add'>+   VOID_STAR blk_data;</div><div class='add'>+   unsigned char main_type;</div><div class='add'>+}</div><div class='add'>+Special_NameTable_Type;</div><div class='add'>+</div><div class='add'>+static int handle_special (Special_NameTable_Type *nt, _SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+   (void) tok;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = nt-&gt;main_type;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.ptr_blk = nt-&gt;blk_data;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int handle_special_file (Special_NameTable_Type *nt, _SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+</div><div class='add'>+   (void) nt; (void) tok;</div><div class='add'>+</div><div class='add'>+   if (This_Static_NameSpace == NULL) name = "***Unknown***";</div><div class='add'>+   else</div><div class='add'>+     name = This_Static_NameSpace-&gt;name;</div><div class='add'>+</div><div class='add'>+   name = SLang_create_slstring (name);</div><div class='add'>+   if (name == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.s_blk = name;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_LITERAL_STR;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = SLANG_STRING_TYPE;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int handle_special_line (Special_NameTable_Type *nt, _SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+   (void) nt;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.l_blk = (long) tok-&gt;line_number;</div><div class='add'>+#endif</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_LITERAL;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = SLANG_UINT_TYPE;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static Special_NameTable_Type Special_Name_Table [] =</div><div class='add'>+{</div><div class='add'>+     {"EXECUTE_ERROR_BLOCK", handle_special, NULL, _SLANG_BC_X_ERROR},</div><div class='add'>+     {"X_USER_BLOCK0", handle_special, NULL, _SLANG_BC_X_USER0},</div><div class='add'>+     {"X_USER_BLOCK1", handle_special, NULL, _SLANG_BC_X_USER1},</div><div class='add'>+     {"X_USER_BLOCK2", handle_special, NULL, _SLANG_BC_X_USER2},</div><div class='add'>+     {"X_USER_BLOCK3", handle_special, NULL, _SLANG_BC_X_USER3},</div><div class='add'>+     {"X_USER_BLOCK4", handle_special, NULL, _SLANG_BC_X_USER4},</div><div class='add'>+     {"__FILE__", handle_special_file, NULL, 0},</div><div class='add'>+     {"__LINE__", handle_special_line, NULL, 0},</div><div class='add'>+#if 0</div><div class='add'>+     {"__NAMESPACE__", handle_special_namespace, NULL, 0},</div><div class='add'>+#endif</div><div class='add'>+     {NULL, NULL, NULL, 0}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void compile_hashed_identifier (char *name, unsigned long hash, _SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *entry;</div><div class='add'>+   unsigned char name_type;</div><div class='add'>+</div><div class='add'>+   entry = locate_hashed_name (name, hash);</div><div class='add'>+</div><div class='add'>+   if (entry == NULL)</div><div class='add'>+     {</div><div class='add'>+	Special_NameTable_Type *nt = Special_Name_Table;</div><div class='add'>+</div><div class='add'>+	while (nt-&gt;name != NULL)</div><div class='add'>+	  {</div><div class='add'>+	     if (strcmp (name, nt-&gt;name))</div><div class='add'>+	       {</div><div class='add'>+		  nt++;</div><div class='add'>+		  continue;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     if (0 == (*nt-&gt;fun)(nt, tok))</div><div class='add'>+	       lang_try_now ();</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   name_type = entry-&gt;name_type;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = name_type;</div><div class='add'>+</div><div class='add'>+   if (name_type == SLANG_LVARIABLE)</div><div class='add'>+     Compile_ByteCode_Ptr-&gt;b.i_blk = ((SLang_Local_Var_Type *) entry)-&gt;local_var_number;</div><div class='add'>+   else</div><div class='add'>+     Compile_ByteCode_Ptr-&gt;b.nt_blk = entry;</div><div class='add'>+</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_tmp_variable (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *entry;</div><div class='add'>+   unsigned char name_type;</div><div class='add'>+</div><div class='add'>+   if (NULL == (entry = locate_hashed_name (name, hash)))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   name_type = entry-&gt;name_type;</div><div class='add'>+   switch (name_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_LVARIABLE:</div><div class='add'>+	Compile_ByteCode_Ptr-&gt;b.i_blk = ((SLang_Local_Var_Type *) entry)-&gt;local_var_number;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_GVARIABLE:</div><div class='add'>+      case SLANG_PVARIABLE:</div><div class='add'>+	Compile_ByteCode_Ptr-&gt;b.nt_blk = entry;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "__tmp(%s) does not specifiy a variable", name);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_TMP;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = name_type;</div><div class='add'>+</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_simple (unsigned char main_type)</div><div class='add'>+{</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = main_type;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = 0;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.blk = NULL;</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_identifier (char *name, _SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+   compile_hashed_identifier (name, _SLcompute_string_hash (name), tok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_call_direct (int (*f) (void), unsigned char byte_code)</div><div class='add'>+{</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.call_function = f;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = byte_code;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = 0;</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_lvar_call_direct (int (*f)(void), unsigned char bc,</div><div class='add'>+				      unsigned char frame_op)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (0 == try_compressed_bytecode (_SLANG_BC_LVARIABLE, bc))</div><div class='add'>+     return;</div><div class='add'>+#else</div><div class='add'>+   (void) bc;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   compile_call_direct (f, frame_op);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_integer (long i, unsigned char bc_main_type, unsigned char bc_sub_type)</div><div class='add'>+{</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.l_blk = i;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = bc_main_type;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = bc_sub_type;</div><div class='add'>+</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+static void compile_double (char *str, unsigned char type)</div><div class='add'>+{</div><div class='add'>+   double d;</div><div class='add'>+   unsigned int factor = 1;</div><div class='add'>+   double *ptr;</div><div class='add'>+</div><div class='add'>+#if 1</div><div class='add'>+   d = _SLang_atof (str);</div><div class='add'>+#else</div><div class='add'>+   if (1 != sscanf (str, "%lf", &amp;d))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "Unable to convert %s to double", str);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+   if (type == SLANG_COMPLEX_TYPE) factor = 2;</div><div class='add'>+#endif</div><div class='add'>+   if (NULL == (ptr = (double *) SLmalloc(factor * sizeof(double))))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.double_blk = ptr;</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+   if (type == SLANG_COMPLEX_TYPE)</div><div class='add'>+     *ptr++ = 0;</div><div class='add'>+#endif</div><div class='add'>+   *ptr = d;</div><div class='add'>+</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_LITERAL;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = type;</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_float (char *s)</div><div class='add'>+{</div><div class='add'>+   float x;</div><div class='add'>+</div><div class='add'>+#if 1</div><div class='add'>+   x = (float) _SLang_atof (s);</div><div class='add'>+#else</div><div class='add'>+   if (1 != sscanf (s, "%f", &amp;x))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "Unable to convert %s to float", s);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.float_blk = x;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_LITERAL;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = SLANG_FLOAT_TYPE;</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void compile_string (char *s, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   if (NULL == (Compile_ByteCode_Ptr-&gt;b.s_blk = _SLstring_dup_hashed_string (s, hash)))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_LITERAL_STR;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = SLANG_STRING_TYPE;</div><div class='add'>+</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_bstring (SLang_BString_Type *s)</div><div class='add'>+{</div><div class='add'>+   if (NULL == (Compile_ByteCode_Ptr-&gt;b.bs_blk = SLbstring_dup (s)))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_LITERAL;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = SLANG_BSTRING_TYPE;</div><div class='add'>+</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* assign_type is one of _SLANG_BCST_ASSIGN, ... values */</div><div class='add'>+static void compile_assign (unsigned char assign_type,</div><div class='add'>+			    char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *v;</div><div class='add'>+   unsigned char main_type;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   v = locate_hashed_name (name, hash);</div><div class='add'>+   if (v == NULL)</div><div class='add'>+     {</div><div class='add'>+	if ((_SLang_Auto_Declare_Globals == 0)</div><div class='add'>+	    || (NULL != strchr (name, '-'))   /* namespace-&gt;name form */</div><div class='add'>+	    || Lang_Defining_Function</div><div class='add'>+	    || (assign_type != _SLANG_BCST_ASSIGN)</div><div class='add'>+	    || (This_Static_NameSpace == NULL))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name);</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+	/* Note that function local variables are not at top level */</div><div class='add'>+</div><div class='add'>+	/* Variables that are automatically declared are given static</div><div class='add'>+	 * scope.</div><div class='add'>+	 */</div><div class='add'>+	if ((NULL != SLang_Auto_Declare_Var_Hook)</div><div class='add'>+	    &amp;&amp; (-1 == (*SLang_Auto_Declare_Var_Hook) (name)))</div><div class='add'>+	  return;</div><div class='add'>+</div><div class='add'>+	if ((-1 == add_global_variable (name, SLANG_GVARIABLE, hash, This_Static_NameSpace))</div><div class='add'>+	    || (NULL == (v = locate_hashed_name (name, hash))))</div><div class='add'>+	  return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   switch (v-&gt;name_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_LVARIABLE:</div><div class='add'>+	main_type = _SLANG_BC_SET_LOCAL_LVALUE;</div><div class='add'>+	Compile_ByteCode_Ptr-&gt;b.i_blk = ((SLang_Local_Var_Type *) v)-&gt;local_var_number;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_GVARIABLE:</div><div class='add'>+      case SLANG_PVARIABLE:</div><div class='add'>+	main_type = _SLANG_BC_SET_GLOBAL_LVALUE;</div><div class='add'>+	Compile_ByteCode_Ptr-&gt;b.nt_blk = v;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_IVARIABLE:</div><div class='add'>+	cl = _SLclass_get_class (((SLang_Intrin_Var_Type *)v)-&gt;type);</div><div class='add'>+	if (cl-&gt;cl_class_type != SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_SYNTAX_ERROR, "Assignment to %s is not allowed", name);</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+	main_type = _SLANG_BC_SET_INTRIN_LVALUE;</div><div class='add'>+	Compile_ByteCode_Ptr-&gt;b.nt_blk = v;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_RVARIABLE:</div><div class='add'>+	SLang_verror (SL_READONLY_ERROR, "%s is read-only", name);</div><div class='add'>+	return;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	SLang_verror (SL_DUPLICATE_DEFINITION, "%s may not be used as an lvalue", name);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = assign_type;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = main_type;</div><div class='add'>+</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_deref_assign (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *v;</div><div class='add'>+</div><div class='add'>+   v = locate_hashed_name (name, hash);</div><div class='add'>+</div><div class='add'>+   if (v == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   switch (v-&gt;name_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_LVARIABLE:</div><div class='add'>+	Compile_ByteCode_Ptr-&gt;b.i_blk = ((SLang_Local_Var_Type *) v)-&gt;local_var_number;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_GVARIABLE:</div><div class='add'>+      case SLANG_PVARIABLE:</div><div class='add'>+	Compile_ByteCode_Ptr-&gt;b.nt_blk = v;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	/* FIXME: Priority=low</div><div class='add'>+	 * This could be made to work.  It is not a priority because</div><div class='add'>+	 * I cannot imagine application intrinsics which are references.</div><div class='add'>+	 */</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED, "Deref assignment to %s is not allowed", name);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = v-&gt;name_type;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_DEREF_ASSIGN;</div><div class='add'>+</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+compile_struct_assign (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = _SLANG_BCST_ASSIGN + (t-&gt;type - _STRUCT_ASSIGN_TOKEN);</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_SET_STRUCT_LVALUE;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.s_blk = _SLstring_dup_hashed_string (t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+compile_array_assign (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = _SLANG_BCST_ASSIGN + (t-&gt;type - _ARRAY_ASSIGN_TOKEN);</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_SET_ARRAY_LVALUE;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.s_blk = NULL;</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_dot(_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_FIELD;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;b.s_blk = _SLstring_dup_hashed_string(t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_ref (char *name, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *entry;</div><div class='add'>+   unsigned char main_type;</div><div class='add'>+</div><div class='add'>+   if (NULL == (entry = locate_hashed_name (name, hash)))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   main_type = entry-&gt;name_type;</div><div class='add'>+</div><div class='add'>+   if (main_type == SLANG_LVARIABLE)</div><div class='add'>+     {</div><div class='add'>+	main_type = _SLANG_BC_LOBJPTR;</div><div class='add'>+	Compile_ByteCode_Ptr-&gt;b.i_blk = ((SLang_Local_Var_Type *)entry)-&gt;local_var_number;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	main_type = _SLANG_BC_GOBJPTR;</div><div class='add'>+	Compile_ByteCode_Ptr-&gt;b.nt_blk = entry;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = main_type;</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_break (unsigned char break_type,</div><div class='add'>+			   int requires_block, int requires_fun,</div><div class='add'>+			   char *str)</div><div class='add'>+{</div><div class='add'>+   if ((requires_fun</div><div class='add'>+	&amp;&amp; (Lang_Defining_Function == 0))</div><div class='add'>+       || (requires_block</div><div class='add'>+	   &amp;&amp; (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_BLOCK)))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "misplaced %s", str);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_main_type = break_type;</div><div class='add'>+   Compile_ByteCode_Ptr-&gt;bc_sub_type = 0;</div><div class='add'>+</div><div class='add'>+   lang_try_now ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_public_variable_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   if (t-&gt;type == IDENT_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	/* If the variable is already defined in the static hash table,</div><div class='add'>+	 * generate an error.</div><div class='add'>+	 */</div><div class='add'>+	if ((This_Static_NameSpace != NULL)</div><div class='add'>+	    &amp;&amp; (NULL != locate_name_in_table (t-&gt;v.s_val, t-&gt;hash, This_Static_NameSpace-&gt;table, This_Static_NameSpace-&gt;table_size)))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_DUPLICATE_DEFINITION,</div><div class='add'>+			   "%s already has static or private linkage in this unit",</div><div class='add'>+			   t-&gt;v.s_val);</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+	add_global_variable (t-&gt;v.s_val, SLANG_GVARIABLE, t-&gt;hash, Global_NameSpace);</div><div class='add'>+     }</div><div class='add'>+   else if (t-&gt;type == CBRACKET_TOKEN)</div><div class='add'>+     Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+   else</div><div class='add'>+     SLang_verror (SL_SYNTAX_ERROR, "Misplaced token in variable list");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_local_variable_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   if (t-&gt;type == IDENT_TOKEN)</div><div class='add'>+     add_local_variable (t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+   else if (t-&gt;type == CBRACKET_TOKEN)</div><div class='add'>+     Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+   else</div><div class='add'>+     SLang_verror (SL_SYNTAX_ERROR, "Misplaced token in variable list");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_static_variable_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   if (t-&gt;type == IDENT_TOKEN)</div><div class='add'>+     add_global_variable (t-&gt;v.s_val, SLANG_GVARIABLE, t-&gt;hash, This_Static_NameSpace);</div><div class='add'>+   else if (t-&gt;type == CBRACKET_TOKEN)</div><div class='add'>+     Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+   else</div><div class='add'>+     SLang_verror (SL_SYNTAX_ERROR, "Misplaced token in variable list");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_private_variable_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   if (t-&gt;type == IDENT_TOKEN)</div><div class='add'>+     add_global_variable (t-&gt;v.s_val, SLANG_PVARIABLE, t-&gt;hash, This_Static_NameSpace);</div><div class='add'>+   else if (t-&gt;type == CBRACKET_TOKEN)</div><div class='add'>+     Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+   else</div><div class='add'>+     SLang_verror (SL_SYNTAX_ERROR, "Misplaced token in variable list");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_function_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   if (-1 == lang_check_space ())</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (t-&gt;type != IDENT_TOKEN)</div><div class='add'>+     SLang_verror (SL_SYNTAX_ERROR, "Expecting function name");</div><div class='add'>+   else</div><div class='add'>+     lang_define_function (t-&gt;v.s_val, SLANG_FUNCTION, t-&gt;hash, Global_NameSpace);</div><div class='add'>+</div><div class='add'>+   Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* An error block is not permitted to contain continue or break statements.</div><div class='add'>+ * This restriction may be removed later but for now reject them.</div><div class='add'>+ */</div><div class='add'>+static int check_error_block (void)</div><div class='add'>+{</div><div class='add'>+   SLBlock_Type *p;</div><div class='add'>+   unsigned char t;</div><div class='add'>+</div><div class='add'>+   /* Back up to the block and then scan it. */</div><div class='add'>+   p = (Compile_ByteCode_Ptr - 1)-&gt;b.blk;</div><div class='add'>+</div><div class='add'>+   while (0 != (t = p-&gt;bc_main_type))</div><div class='add'>+     {</div><div class='add'>+	if ((t == _SLANG_BC_BREAK)</div><div class='add'>+	    || (t == _SLANG_BC_CONTINUE))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_SYNTAX_ERROR,</div><div class='add'>+			   "An ERROR_BLOCK is not permitted to contain continue or break statements");</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	p++;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* The only allowed tokens are the directives and another block start.</div><div class='add'>+ * The mode is only active if a block is available.  The inner_interp routine</div><div class='add'>+ * expects such safety checks.</div><div class='add'>+ */</div><div class='add'>+static void compile_directive_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   int bc_sub_type;</div><div class='add'>+</div><div class='add'>+   if (-1 == lang_check_space ())</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   bc_sub_type = -1;</div><div class='add'>+</div><div class='add'>+   switch (t-&gt;type)</div><div class='add'>+     {</div><div class='add'>+      case FOREVER_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_FOREVER;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case IFNOT_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_IFNOT;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case IF_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_IF;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case ANDELSE_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_ANDELSE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SWITCH_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_SWITCH;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case EXITBLK_TOKEN:</div><div class='add'>+	if (Lang_Defining_Function == 0)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_SYNTAX_ERROR, "misplaced EXIT_BLOCK");</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	bc_sub_type = _SLANG_BCST_EXIT_BLOCK;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case ERRBLK_TOKEN:</div><div class='add'>+	if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_SYNTAX_ERROR, "misplaced ERROR_BLOCK");</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	if (0 == check_error_block ())</div><div class='add'>+	  bc_sub_type = _SLANG_BCST_ERROR_BLOCK;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case USRBLK0_TOKEN:</div><div class='add'>+      case USRBLK1_TOKEN:</div><div class='add'>+      case USRBLK2_TOKEN:</div><div class='add'>+      case USRBLK3_TOKEN:</div><div class='add'>+      case USRBLK4_TOKEN:</div><div class='add'>+	if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_TOP_LEVEL)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_SYNTAX_ERROR, "misplaced USER_BLOCK");</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	bc_sub_type = _SLANG_BCST_USER_BLOCK0 + (t-&gt;type - USRBLK0_TOKEN);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case NOTELSE_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_NOTELSE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case ELSE_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_ELSE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case LOOP_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_LOOP;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case DOWHILE_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_DOWHILE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case WHILE_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_WHILE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case ORELSE_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_ORELSE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _FOR_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_FOR;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case FOR_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_CFOR;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case FOREACH_TOKEN:</div><div class='add'>+	bc_sub_type = _SLANG_BCST_FOREACH;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case OBRACE_TOKEN:</div><div class='add'>+	lang_begin_block ();</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "Expecting directive token.  Found 0x%X", t-&gt;type);</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Reset this pointer first because compile_directive may cause a</div><div class='add'>+    * file to be loaded.</div><div class='add'>+    */</div><div class='add'>+   Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+</div><div class='add'>+   if (bc_sub_type != -1)</div><div class='add'>+     compile_directive (bc_sub_type);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned int Assign_Mode_Type;</div><div class='add'>+static void compile_assign_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   if (t-&gt;type != IDENT_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "Expecting identifier for assignment");</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   compile_assign (Assign_Mode_Type, t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+   Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void compile_basic_token_mode (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   if (-1 == lang_check_space ())</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   switch (t-&gt;type)</div><div class='add'>+     {</div><div class='add'>+      case PUSH_TOKEN:</div><div class='add'>+      case NOP_TOKEN:</div><div class='add'>+      case EOF_TOKEN:</div><div class='add'>+      case READONLY_TOKEN:</div><div class='add'>+      case DO_TOKEN:</div><div class='add'>+      case VARIABLE_TOKEN:</div><div class='add'>+      case SEMICOLON_TOKEN:</div><div class='add'>+      default:</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "Unknown or unsupported token type 0x%X", t-&gt;type);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case DEREF_TOKEN:</div><div class='add'>+	compile_call_direct (dereference_object, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case STRUCT_TOKEN:</div><div class='add'>+	compile_call_direct (_SLstruct_define_struct, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case TYPEDEF_TOKEN:</div><div class='add'>+	compile_call_direct (_SLstruct_define_typedef, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case TMP_TOKEN:</div><div class='add'>+	compile_tmp_variable (t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case DOT_TOKEN:		       /* X . field */</div><div class='add'>+	compile_dot (t);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case COMMA_TOKEN:</div><div class='add'>+	break;			       /* do nothing */</div><div class='add'>+</div><div class='add'>+      case IDENT_TOKEN:</div><div class='add'>+	compile_hashed_identifier (t-&gt;v.s_val, t-&gt;hash, t);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _REF_TOKEN:</div><div class='add'>+	compile_ref (t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case ARG_TOKEN:</div><div class='add'>+	compile_call_direct (SLang_start_arg_list, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case EARG_TOKEN:</div><div class='add'>+	compile_lvar_call_direct (SLang_end_arg_list, _SLANG_BC_EARG_LVARIABLE, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case COLON_TOKEN:</div><div class='add'>+	if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_BLOCK)</div><div class='add'>+	  compile_simple (_SLANG_BC_LABEL);</div><div class='add'>+	else SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case POP_TOKEN:</div><div class='add'>+	compile_call_direct (SLdo_pop, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case CASE_TOKEN:</div><div class='add'>+	if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_BLOCK)</div><div class='add'>+	  SLang_verror (SL_SYNTAX_ERROR, "Misplaced 'case'");</div><div class='add'>+	else</div><div class='add'>+	  compile_call_direct (case_function, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case CHAR_TOKEN:</div><div class='add'>+	compile_integer (t-&gt;v.long_val, _SLANG_BC_LITERAL, SLANG_CHAR_TYPE);</div><div class='add'>+	break;</div><div class='add'>+      case SHORT_TOKEN:</div><div class='add'>+	compile_integer (t-&gt;v.long_val, _SLANG_BC_LITERAL, SLANG_SHORT_TYPE);</div><div class='add'>+	break;</div><div class='add'>+      case INT_TOKEN:</div><div class='add'>+	compile_integer (t-&gt;v.long_val, _SLANG_BC_LITERAL_INT, SLANG_INT_TYPE);</div><div class='add'>+	break;</div><div class='add'>+      case UCHAR_TOKEN:</div><div class='add'>+	compile_integer (t-&gt;v.long_val, _SLANG_BC_LITERAL, SLANG_UCHAR_TYPE);</div><div class='add'>+	break;</div><div class='add'>+      case USHORT_TOKEN:</div><div class='add'>+	compile_integer (t-&gt;v.long_val, _SLANG_BC_LITERAL, SLANG_USHORT_TYPE);</div><div class='add'>+	break;</div><div class='add'>+      case UINT_TOKEN:</div><div class='add'>+	compile_integer (t-&gt;v.long_val, _SLANG_BC_LITERAL_INT, SLANG_UINT_TYPE);</div><div class='add'>+	break;</div><div class='add'>+      case LONG_TOKEN:</div><div class='add'>+	compile_integer (t-&gt;v.long_val, _SLANG_BC_LITERAL, SLANG_LONG_TYPE);</div><div class='add'>+	break;</div><div class='add'>+      case ULONG_TOKEN:</div><div class='add'>+	compile_integer (t-&gt;v.long_val, _SLANG_BC_LITERAL, SLANG_ULONG_TYPE);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+      case FLOAT_TOKEN:</div><div class='add'>+	compile_float (t-&gt;v.s_val);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case DOUBLE_TOKEN:</div><div class='add'>+	compile_double (t-&gt;v.s_val, SLANG_DOUBLE_TYPE);</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+      case COMPLEX_TOKEN:</div><div class='add'>+	compile_double (t-&gt;v.s_val, SLANG_COMPLEX_TYPE);</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+      case STRING_TOKEN:</div><div class='add'>+	compile_string (t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _BSTRING_TOKEN:</div><div class='add'>+	compile_bstring (SLbstring_create ((unsigned char *)t-&gt;v.s_val, (unsigned int) t-&gt;hash));</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case BSTRING_TOKEN:</div><div class='add'>+	compile_bstring (t-&gt;v.b_val);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _NULL_TOKEN:</div><div class='add'>+	compile_identifier ("NULL", t);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _INLINE_WILDCARD_ARRAY_TOKEN:</div><div class='add'>+	compile_call_direct (_SLarray_wildcard_array, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _INLINE_ARRAY_TOKEN:</div><div class='add'>+	compile_call_direct (_SLarray_inline_array, _SLANG_BC_CALL_DIRECT_FRAME);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _INLINE_IMPLICIT_ARRAY_TOKEN:</div><div class='add'>+	compile_call_direct (_SLarray_inline_implicit_array, _SLANG_BC_CALL_DIRECT_FRAME);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case ARRAY_TOKEN:</div><div class='add'>+	compile_lvar_call_direct (_SLarray_aget, _SLANG_BC_LVARIABLE_AGET, _SLANG_BC_CALL_DIRECT_FRAME);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+	/* Note: I need to add the other _ARRAY assign tokens. */</div><div class='add'>+      case _ARRAY_PLUSEQS_TOKEN:</div><div class='add'>+      case _ARRAY_MINUSEQS_TOKEN:</div><div class='add'>+      case _ARRAY_TIMESEQS_TOKEN:</div><div class='add'>+      case _ARRAY_DIVEQS_TOKEN:</div><div class='add'>+      case _ARRAY_BOREQS_TOKEN:</div><div class='add'>+      case _ARRAY_BANDEQS_TOKEN:</div><div class='add'>+      case _ARRAY_POST_MINUSMINUS_TOKEN:</div><div class='add'>+      case _ARRAY_MINUSMINUS_TOKEN:</div><div class='add'>+      case _ARRAY_POST_PLUSPLUS_TOKEN:</div><div class='add'>+      case _ARRAY_PLUSPLUS_TOKEN:</div><div class='add'>+	compile_array_assign (t);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _ARRAY_ASSIGN_TOKEN:</div><div class='add'>+	compile_lvar_call_direct (_SLarray_aput, _SLANG_BC_LVARIABLE_APUT, _SLANG_BC_CALL_DIRECT_FRAME);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _STRUCT_ASSIGN_TOKEN:</div><div class='add'>+      case _STRUCT_PLUSEQS_TOKEN:</div><div class='add'>+      case _STRUCT_MINUSEQS_TOKEN:</div><div class='add'>+      case _STRUCT_TIMESEQS_TOKEN:</div><div class='add'>+      case _STRUCT_DIVEQS_TOKEN:</div><div class='add'>+      case _STRUCT_BOREQS_TOKEN:</div><div class='add'>+      case _STRUCT_BANDEQS_TOKEN:</div><div class='add'>+      case _STRUCT_POST_MINUSMINUS_TOKEN:</div><div class='add'>+      case _STRUCT_MINUSMINUS_TOKEN:</div><div class='add'>+      case _STRUCT_POST_PLUSPLUS_TOKEN:</div><div class='add'>+      case _STRUCT_PLUSPLUS_TOKEN:</div><div class='add'>+	compile_struct_assign (t);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SCALAR_ASSIGN_TOKEN:</div><div class='add'>+      case _SCALAR_PLUSEQS_TOKEN:</div><div class='add'>+      case _SCALAR_MINUSEQS_TOKEN:</div><div class='add'>+      case _SCALAR_TIMESEQS_TOKEN:</div><div class='add'>+      case _SCALAR_DIVEQS_TOKEN:</div><div class='add'>+      case _SCALAR_BOREQS_TOKEN:</div><div class='add'>+      case _SCALAR_BANDEQS_TOKEN:</div><div class='add'>+      case _SCALAR_POST_MINUSMINUS_TOKEN:</div><div class='add'>+      case _SCALAR_MINUSMINUS_TOKEN:</div><div class='add'>+      case _SCALAR_POST_PLUSPLUS_TOKEN:</div><div class='add'>+      case _SCALAR_PLUSPLUS_TOKEN:</div><div class='add'>+	compile_assign (_SLANG_BCST_ASSIGN + (t-&gt;type - _SCALAR_ASSIGN_TOKEN),</div><div class='add'>+			t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _DEREF_ASSIGN_TOKEN:</div><div class='add'>+	compile_deref_assign (t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+ 	/* For processing RPN tokens */</div><div class='add'>+      case ASSIGN_TOKEN:</div><div class='add'>+      case PLUSEQS_TOKEN:</div><div class='add'>+      case MINUSEQS_TOKEN:</div><div class='add'>+      case TIMESEQS_TOKEN:</div><div class='add'>+      case DIVEQS_TOKEN:</div><div class='add'>+      case BOREQS_TOKEN:</div><div class='add'>+      case BANDEQS_TOKEN:</div><div class='add'>+      case POST_MINUSMINUS_TOKEN:</div><div class='add'>+      case MINUSMINUS_TOKEN:</div><div class='add'>+      case POST_PLUSPLUS_TOKEN:</div><div class='add'>+      case PLUSPLUS_TOKEN:</div><div class='add'>+	Compile_Mode_Function = compile_assign_mode;</div><div class='add'>+	Assign_Mode_Type = _SLANG_BCST_ASSIGN + (t-&gt;type - ASSIGN_TOKEN);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case LT_TOKEN:</div><div class='add'>+	compile_binary (SLANG_LT);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case LE_TOKEN:</div><div class='add'>+	compile_binary (SLANG_LE);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case GT_TOKEN:</div><div class='add'>+	compile_binary (SLANG_GT);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case GE_TOKEN:</div><div class='add'>+	compile_binary (SLANG_GE);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case EQ_TOKEN:</div><div class='add'>+	compile_binary (SLANG_EQ);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case NE_TOKEN:</div><div class='add'>+	compile_binary (SLANG_NE);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case AND_TOKEN:</div><div class='add'>+	compile_binary (SLANG_AND);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case ADD_TOKEN:</div><div class='add'>+	compile_fast_binary (SLANG_PLUS, _SLANG_BC_INTEGER_PLUS);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SUB_TOKEN:</div><div class='add'>+	compile_fast_binary (SLANG_MINUS, _SLANG_BC_INTEGER_MINUS);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case TIMES_TOKEN:</div><div class='add'>+	compile_binary (SLANG_TIMES);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case DIV_TOKEN:</div><div class='add'>+	compile_binary (SLANG_DIVIDE);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case POW_TOKEN:</div><div class='add'>+	compile_binary (SLANG_POW);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case BXOR_TOKEN:</div><div class='add'>+	compile_binary (SLANG_BXOR);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case BAND_TOKEN:</div><div class='add'>+	compile_binary (SLANG_BAND);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case BOR_TOKEN:</div><div class='add'>+	compile_binary (SLANG_BOR);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SHR_TOKEN:</div><div class='add'>+	compile_binary (SLANG_SHR);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SHL_TOKEN:</div><div class='add'>+	compile_binary (SLANG_SHL);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case MOD_TOKEN:</div><div class='add'>+	compile_binary (SLANG_MOD);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case OR_TOKEN:</div><div class='add'>+	compile_binary (SLANG_OR);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case NOT_TOKEN:</div><div class='add'>+	compile_unary (SLANG_NOT, _SLANG_BC_UNARY);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case BNOT_TOKEN:</div><div class='add'>+	compile_unary (SLANG_BNOT, _SLANG_BC_UNARY);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case MUL2_TOKEN:</div><div class='add'>+	compile_unary (SLANG_MUL2, _SLANG_BC_UNARY_FUNC);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case CHS_TOKEN:</div><div class='add'>+	compile_unary (SLANG_CHS, _SLANG_BC_UNARY_FUNC);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case ABS_TOKEN:</div><div class='add'>+	compile_unary (SLANG_ABS, _SLANG_BC_UNARY_FUNC);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SQR_TOKEN:</div><div class='add'>+	compile_unary (SLANG_SQR, _SLANG_BC_UNARY_FUNC);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SIGN_TOKEN:</div><div class='add'>+	compile_unary (SLANG_SIGN, _SLANG_BC_UNARY_FUNC);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case BREAK_TOKEN:</div><div class='add'>+	compile_break (_SLANG_BC_BREAK, 1, 0, "break");</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case RETURN_TOKEN:</div><div class='add'>+	compile_break (_SLANG_BC_RETURN, 0, 1, "return");</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case CONT_TOKEN:</div><div class='add'>+	compile_break (_SLANG_BC_CONTINUE, 1, 0, "continue");</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case EXCH_TOKEN:</div><div class='add'>+	compile_break (_SLANG_BC_EXCH, 0, 0, "");   /* FIXME: Priority=low */</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case STATIC_TOKEN:</div><div class='add'>+	if (Lang_Defining_Function == 0)</div><div class='add'>+	  Compile_Mode_Function = compile_static_variable_mode;</div><div class='add'>+	else</div><div class='add'>+	  SLang_verror (SL_NOT_IMPLEMENTED, "static variables not permitted in functions");</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case PRIVATE_TOKEN:</div><div class='add'>+	if (Lang_Defining_Function == 0)</div><div class='add'>+	  Compile_Mode_Function = compile_private_variable_mode;</div><div class='add'>+	else</div><div class='add'>+	  SLang_verror (SL_NOT_IMPLEMENTED, "private variables not permitted in functions");</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case PUBLIC_TOKEN:</div><div class='add'>+	if (Lang_Defining_Function == 0)</div><div class='add'>+	  Compile_Mode_Function = compile_public_variable_mode;</div><div class='add'>+	else</div><div class='add'>+	  SLang_verror (SL_NOT_IMPLEMENTED, "public variables not permitted in functions");</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case OBRACKET_TOKEN:</div><div class='add'>+	if (Lang_Defining_Function == 0)</div><div class='add'>+	  Compile_Mode_Function = Default_Variable_Mode;</div><div class='add'>+	else</div><div class='add'>+	  Compile_Mode_Function = compile_local_variable_mode;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case OPAREN_TOKEN:</div><div class='add'>+	lang_begin_function ();</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case DEFINE_STATIC_TOKEN:</div><div class='add'>+	if (Lang_Defining_Function)</div><div class='add'>+	  define_static_function (t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+	else SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case DEFINE_PRIVATE_TOKEN:</div><div class='add'>+	if (Lang_Defining_Function)</div><div class='add'>+	  define_private_function (t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+	else SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case DEFINE_PUBLIC_TOKEN:</div><div class='add'>+	if (Lang_Defining_Function)</div><div class='add'>+	  define_public_function (t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+	else SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case DEFINE_TOKEN:</div><div class='add'>+	if (Lang_Defining_Function)</div><div class='add'>+	  (*Default_Define_Function) (t-&gt;v.s_val, t-&gt;hash);</div><div class='add'>+	else</div><div class='add'>+	  SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case CPAREN_TOKEN:</div><div class='add'>+	if (Lang_Defining_Function)</div><div class='add'>+	  Compile_Mode_Function = compile_function_mode;</div><div class='add'>+	else SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case CBRACE_TOKEN:</div><div class='add'>+	lang_end_block ();</div><div class='add'>+	Compile_Mode_Function = compile_directive_mode;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case OBRACE_TOKEN:</div><div class='add'>+	lang_begin_block ();</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case FARG_TOKEN:</div><div class='add'>+	Function_Args_Number = Local_Variable_Number;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+      case LINE_NUM_TOKEN:</div><div class='add'>+	Compile_ByteCode_Ptr-&gt;bc_main_type = _SLANG_BC_LINE_NUM;</div><div class='add'>+	Compile_ByteCode_Ptr-&gt;b.l_blk = t-&gt;v.long_val;</div><div class='add'>+	lang_try_now ();</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+      case POUND_TOKEN:</div><div class='add'>+	compile_call_direct (_SLarray_matrix_multiply, _SLANG_BC_CALL_DIRECT);</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLcompile (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   if (SLang_Error == 0)</div><div class='add'>+     {</div><div class='add'>+	if (Compile_Mode_Function != compile_basic_token_mode)</div><div class='add'>+	  {</div><div class='add'>+	     if (Compile_Mode_Function == NULL)</div><div class='add'>+	       Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+	     if (t-&gt;type == LINE_NUM_TOKEN)</div><div class='add'>+	       {</div><div class='add'>+		  compile_basic_token_mode (t);</div><div class='add'>+		  return;</div><div class='add'>+	       }</div><div class='add'>+#endif</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	(*Compile_Mode_Function) (t);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     {</div><div class='add'>+	Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+	SLang_restart (0);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void (*_SLcompile_ptr)(_SLang_Token_Type *) = _SLcompile;</div><div class='add'>+</div><div class='add'>+typedef struct _Compile_Context_Type</div><div class='add'>+{</div><div class='add'>+   struct _Compile_Context_Type *next;</div><div class='add'>+   SLang_NameSpace_Type *static_namespace;</div><div class='add'>+   void (*compile_variable_mode) (_SLang_Token_Type *);</div><div class='add'>+   void (*define_function) (char *, unsigned long);</div><div class='add'>+   int lang_defining_function;</div><div class='add'>+   int local_variable_number;</div><div class='add'>+   unsigned int function_args_number;</div><div class='add'>+   SLang_Name_Type **locals_hash_table;</div><div class='add'>+   void (*compile_mode_function)(_SLang_Token_Type *);</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   char *compile_filename;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+Compile_Context_Type;</div><div class='add'>+</div><div class='add'>+static Compile_Context_Type *Compile_Context_Stack;</div><div class='add'>+</div><div class='add'>+/* The only way the push/pop_context functions can get called is via</div><div class='add'>+ * an eval type function.  That can only happen when executed from a</div><div class='add'>+ * top level block.  This means that Compile_ByteCode_Ptr can always be</div><div class='add'>+ * rest back to the beginning of a block.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static int pop_compile_context (void)</div><div class='add'>+{</div><div class='add'>+   Compile_Context_Type *cc;</div><div class='add'>+</div><div class='add'>+   if (NULL == (cc = Compile_Context_Stack))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   This_Static_NameSpace = cc-&gt;static_namespace;</div><div class='add'>+   Compile_Context_Stack = cc-&gt;next;</div><div class='add'>+   Default_Variable_Mode = cc-&gt;compile_variable_mode;</div><div class='add'>+   Default_Define_Function = cc-&gt;define_function;</div><div class='add'>+   Compile_Mode_Function = cc-&gt;compile_mode_function;</div><div class='add'>+</div><div class='add'>+   Lang_Defining_Function = cc-&gt;lang_defining_function;</div><div class='add'>+   Local_Variable_Number = cc-&gt;local_variable_number;</div><div class='add'>+   Function_Args_Number = cc-&gt;function_args_number;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   SLang_free_slstring (This_Compile_Filename);</div><div class='add'>+   This_Compile_Filename = cc-&gt;compile_filename;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   SLfree ((char *) Locals_Hash_Table);</div><div class='add'>+   Locals_Hash_Table = cc-&gt;locals_hash_table;</div><div class='add'>+</div><div class='add'>+   SLfree ((char *) cc);</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_compile_context (char *name)</div><div class='add'>+{</div><div class='add'>+   Compile_Context_Type *cc;</div><div class='add'>+   SLang_Name_Type **lns;</div><div class='add'>+</div><div class='add'>+   cc = (Compile_Context_Type *)SLmalloc (sizeof (Compile_Context_Type));</div><div class='add'>+   if (cc == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+   memset ((char *) cc, 0, sizeof (Compile_Context_Type));</div><div class='add'>+</div><div class='add'>+   lns = (SLang_Name_Type **) SLcalloc (sizeof (SLang_Name_Type *), SLLOCALS_HASH_TABLE_SIZE);</div><div class='add'>+   if (lns == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) cc);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   if ((name != NULL)</div><div class='add'>+       &amp;&amp; (NULL == (name = SLang_create_slstring (name))))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) cc);</div><div class='add'>+	SLfree ((char *) lns);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+		</div><div class='add'>+   cc-&gt;compile_filename = This_Compile_Filename;</div><div class='add'>+   This_Compile_Filename = name;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   cc-&gt;static_namespace = This_Static_NameSpace;</div><div class='add'>+   cc-&gt;compile_variable_mode = Default_Variable_Mode;</div><div class='add'>+   cc-&gt;define_function = Default_Define_Function;</div><div class='add'>+   cc-&gt;locals_hash_table = Locals_Hash_Table;</div><div class='add'>+</div><div class='add'>+   cc-&gt;lang_defining_function = Lang_Defining_Function;</div><div class='add'>+   cc-&gt;local_variable_number = Local_Variable_Number;</div><div class='add'>+   cc-&gt;function_args_number = Function_Args_Number;</div><div class='add'>+   cc-&gt;locals_hash_table = Locals_Hash_Table;</div><div class='add'>+   cc-&gt;compile_mode_function = Compile_Mode_Function;</div><div class='add'>+</div><div class='add'>+   cc-&gt;next = Compile_Context_Stack;</div><div class='add'>+   Compile_Context_Stack = cc;</div><div class='add'>+</div><div class='add'>+   Compile_Mode_Function = compile_basic_token_mode;</div><div class='add'>+   Default_Variable_Mode = compile_public_variable_mode;</div><div class='add'>+   Default_Define_Function = define_public_function;</div><div class='add'>+   Lang_Defining_Function = 0;</div><div class='add'>+   Local_Variable_Number = 0;</div><div class='add'>+   Function_Args_Number = 0;</div><div class='add'>+   Locals_Hash_Table = lns;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int init_interpreter (void)</div><div class='add'>+{</div><div class='add'>+   SLang_NameSpace_Type *ns;</div><div class='add'>+</div><div class='add'>+   if (Global_NameSpace != NULL)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   if (NULL == (ns = _SLns_allocate_namespace ("***GLOBAL***", SLGLOBALS_HASH_TABLE_SIZE)))</div><div class='add'>+     return -1;</div><div class='add'>+   if (-1 == _SLns_set_namespace_name (ns, "Global"))</div><div class='add'>+     return -1;</div><div class='add'>+   Global_NameSpace = ns;</div><div class='add'>+</div><div class='add'>+   _SLRun_Stack = (SLang_Object_Type *) SLcalloc (SLANG_MAX_STACK_LEN,</div><div class='add'>+						  sizeof (SLang_Object_Type));</div><div class='add'>+   if (_SLRun_Stack == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   _SLStack_Pointer = _SLRun_Stack;</div><div class='add'>+   _SLStack_Pointer_Max = _SLRun_Stack + SLANG_MAX_STACK_LEN;</div><div class='add'>+</div><div class='add'>+   SLShort_Blocks[0].bc_main_type = _SLANG_BC_RETURN;</div><div class='add'>+   SLShort_Blocks[2].bc_main_type = _SLANG_BC_BREAK;</div><div class='add'>+   SLShort_Blocks[4].bc_main_type = _SLANG_BC_CONTINUE;</div><div class='add'>+</div><div class='add'>+   Num_Args_Stack = (int *) SLmalloc (sizeof (int) * SLANG_MAX_RECURSIVE_DEPTH);</div><div class='add'>+   if (Num_Args_Stack == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) _SLRun_Stack);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   Recursion_Depth = 0;</div><div class='add'>+   Frame_Pointer_Stack = (unsigned int *) SLmalloc (sizeof (unsigned int) * SLANG_MAX_RECURSIVE_DEPTH);</div><div class='add'>+   if (Frame_Pointer_Stack == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) _SLRun_Stack);</div><div class='add'>+	SLfree ((char *)Num_Args_Stack);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   Frame_Pointer_Depth = 0;</div><div class='add'>+   Frame_Pointer = _SLRun_Stack;</div><div class='add'>+</div><div class='add'>+   Default_Variable_Mode = compile_public_variable_mode;</div><div class='add'>+   Default_Define_Function = define_public_function;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int add_generic_table (SLang_NameSpace_Type *ns,</div><div class='add'>+			      SLang_Name_Type *table, char *pp_name,</div><div class='add'>+			      unsigned int entry_len)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *t, **ns_table;</div><div class='add'>+   char *name;</div><div class='add'>+   unsigned int table_size;</div><div class='add'>+   </div><div class='add'>+   if (-1 == init_interpreter ())</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   if (ns == NULL) </div><div class='add'>+     ns = Global_NameSpace;</div><div class='add'>+   </div><div class='add'>+   ns_table = ns-&gt;table;</div><div class='add'>+   table_size = ns-&gt;table_size;</div><div class='add'>+	</div><div class='add'>+   if ((pp_name != NULL)</div><div class='add'>+       &amp;&amp; (-1 == SLdefine_for_ifdef (pp_name)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   t = table;</div><div class='add'>+   while (NULL != (name = t-&gt;name))</div><div class='add'>+     {</div><div class='add'>+	unsigned long hash;</div><div class='add'>+</div><div class='add'>+	/* Backward compatibility: '.' WAS used as hash marker */</div><div class='add'>+	if (*name == '.')</div><div class='add'>+	  {</div><div class='add'>+	     name++;</div><div class='add'>+	     t-&gt;name = name;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (NULL == (name = SLang_create_slstring (name)))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	t-&gt;name = name;</div><div class='add'>+</div><div class='add'>+	hash = _SLcompute_string_hash (name);</div><div class='add'>+	hash = hash % table_size;</div><div class='add'>+</div><div class='add'>+	t-&gt;next = ns_table [(unsigned int) hash];</div><div class='add'>+	ns_table [(unsigned int) hash] = t;</div><div class='add'>+</div><div class='add'>+	t = (SLang_Name_Type *) ((char *)t + entry_len);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_intrin_fun_table (SLang_Intrin_Fun_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+   return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Intrin_Fun_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_intrin_var_table (SLang_Intrin_Var_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+   return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Intrin_Var_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_app_unary_table (SLang_App_Unary_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+   return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_App_Unary_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_math_unary_table (SLang_Math_Unary_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+   return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Math_Unary_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_iconstant_table (SLang_IConstant_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+   return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_IConstant_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+int SLadd_dconstant_table (SLang_DConstant_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+   return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_DConstant_Type));</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* ----------- */</div><div class='add'>+int SLns_add_intrin_fun_table (SLang_NameSpace_Type *ns, SLang_Intrin_Fun_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+   return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Intrin_Fun_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLns_add_intrin_var_table (SLang_NameSpace_Type *ns, SLang_Intrin_Var_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+   return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Intrin_Var_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLns_add_app_unary_table (SLang_NameSpace_Type *ns, SLang_App_Unary_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+   return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_App_Unary_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLns_add_math_unary_table (SLang_NameSpace_Type *ns, SLang_Math_Unary_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+   return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Math_Unary_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLns_add_iconstant_table (SLang_NameSpace_Type *ns, SLang_IConstant_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+   return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_IConstant_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+int SLns_add_dconstant_table (SLang_NameSpace_Type *ns, SLang_DConstant_Type *tbl, char *pp)</div><div class='add'>+{</div><div class='add'>+   return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_DConstant_Type));</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* what is a bitmapped value:</div><div class='add'>+ * 1 intrin fun</div><div class='add'>+ * 2 user fun</div><div class='add'>+ * 4 intrin var</div><div class='add'>+ * 8 user defined var</div><div class='add'>+ */</div><div class='add'>+SLang_Array_Type *_SLang_apropos (char *namespace_name, char *pat, unsigned int what)</div><div class='add'>+{</div><div class='add'>+   SLang_NameSpace_Type *ns;</div><div class='add'>+</div><div class='add'>+   if (namespace_name == NULL)</div><div class='add'>+     namespace_name = "Global";</div><div class='add'>+</div><div class='add'>+   if (*namespace_name == 0)</div><div class='add'>+     ns = This_Static_NameSpace;</div><div class='add'>+   else ns = _SLns_find_namespace (namespace_name);</div><div class='add'>+</div><div class='add'>+   return _SLnspace_apropos (ns, pat, what);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLang_implements_intrinsic (char *name)</div><div class='add'>+{</div><div class='add'>+   if (This_Static_NameSpace == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INTRINSIC_ERROR, "No namespace available");</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   (void) _SLns_set_namespace_name (This_Static_NameSpace, name);</div><div class='add'>+</div><div class='add'>+   Default_Define_Function = define_static_function;</div><div class='add'>+   Default_Variable_Mode = compile_static_variable_mode;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLang_use_namespace_intrinsic (char *name)</div><div class='add'>+{</div><div class='add'>+   SLang_NameSpace_Type *ns;</div><div class='add'>+   </div><div class='add'>+   if (NULL == (ns = _SLns_find_namespace (name)))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INTRINSIC_ERROR, "Namespace %s does not exist", name);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   This_Static_NameSpace = ns;</div><div class='add'>+   if (Global_NameSpace == ns)</div><div class='add'>+     {</div><div class='add'>+	Default_Define_Function = define_public_function;</div><div class='add'>+	Default_Variable_Mode = compile_public_variable_mode;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	Default_Define_Function = define_static_function;</div><div class='add'>+	Default_Variable_Mode = compile_static_variable_mode;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+char *_SLang_cur_namespace_intrinsic (void)</div><div class='add'>+{</div><div class='add'>+   if (This_Static_NameSpace == NULL)</div><div class='add'>+     return "Global";</div><div class='add'>+</div><div class='add'>+   if (This_Static_NameSpace-&gt;namespace_name == NULL)</div><div class='add'>+     return "";</div><div class='add'>+   </div><div class='add'>+   return This_Static_NameSpace-&gt;namespace_name;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slang.h b/mdk-stage1/slang/slang.h<br/>new file mode 100644<br/>index 000000000..900b14043<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slang.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slang.h</a></div><div class='hunk'>@@ -0,0 +1,1930 @@</div><div class='add'>+#ifndef DAVIS_SLANG_H_</div><div class='add'>+#define DAVIS_SLANG_H_</div><div class='add'>+/* -*- mode: C; mode: fold; -*- */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_VERSION 10404</div><div class='add'>+#define SLANG_VERSION_STRING "1.4.4"</div><div class='add'>+</div><div class='add'>+/*{{{ System Dependent Macros and Typedefs */</div><div class='add'>+</div><div class='add'>+#if defined(__WATCOMC__) &amp;&amp; defined(DOS)</div><div class='add'>+# ifndef __MSDOS__</div><div class='add'>+#  define __MSDOS__</div><div class='add'>+# endif</div><div class='add'>+# ifndef  DOS386</div><div class='add'>+#  define  DOS386</div><div class='add'>+# endif</div><div class='add'>+# ifndef IBMPC_SYSTEM</div><div class='add'>+#  define IBMPC_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif /* __watcomc__ */</div><div class='add'>+</div><div class='add'>+#if defined(unix) || defined(__unix)</div><div class='add'>+# ifndef __unix__</div><div class='add'>+#  define __unix__ 1</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if !defined(__GO32__)</div><div class='add'>+# ifdef __unix__</div><div class='add'>+#  define REAL_UNIX_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Set of the various defines for pc systems.  This includes OS/2 */</div><div class='add'>+#ifdef __GO32__</div><div class='add'>+# ifndef __DJGPP__</div><div class='add'>+#  define __DJGPP__ 1</div><div class='add'>+# endif</div><div class='add'>+# ifndef IBMPC_SYSTEM</div><div class='add'>+#   define IBMPC_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __BORLANDC__</div><div class='add'>+# ifndef IBMPC_SYSTEM</div><div class='add'>+#  define IBMPC_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __MSDOS__</div><div class='add'>+# ifndef IBMPC_SYSTEM</div><div class='add'>+#   define IBMPC_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(OS2) || defined(__os2__)</div><div class='add'>+# ifndef IBMPC_SYSTEM</div><div class='add'>+#   define IBMPC_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+# ifndef __os2__</div><div class='add'>+#  define __os2__</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__NT__) || defined(__MINGW32__) || defined(__CYGWIN32__)</div><div class='add'>+# ifndef IBMPC_SYSTEM</div><div class='add'>+#  define IBMPC_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(IBMPC_SYSTEM) || defined(VMS)</div><div class='add'>+# ifdef REAL_UNIX_SYSTEM</div><div class='add'>+#  undef REAL_UNIX_SYSTEM</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+extern "C" {</div><div class='add'>+#endif</div><div class='add'>+#if 0</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#if defined(__STDC__) || defined(__BORLANDC__) || defined(__cplusplus)</div><div class='add'>+# include &lt;stddef.h&gt;		       /* for offsetof */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* ---------------------------- Generic Macros ----------------------------- */</div><div class='add'>+</div><div class='add'>+/*  __SC__ is defined for Symantec C++</div><div class='add'>+   DOS386 is defined for -mx memory model, 32 bit DOS extender. */</div><div class='add'>+</div><div class='add'>+#if defined(__SC__) &amp;&amp; !defined(DOS386)</div><div class='add'>+# include &lt;dos.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include &lt;alloc.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined (__cplusplus) || defined(__STDC__) || defined(IBMPC_SYSTEM)</div><div class='add'>+  typedef void *VOID_STAR;</div><div class='add'>+#else</div><div class='add'>+  typedef unsigned char *VOID_STAR;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef int (*FVOID_STAR)(void);</div><div class='add'>+</div><div class='add'>+#if defined(__MSDOS_) &amp;&amp; defined(__BORLANDC__)</div><div class='add'>+# define SLFREE(buf)  farfree((void far *)(buf))</div><div class='add'>+# define SLMALLOC(x) farmalloc((unsigned long) (x))</div><div class='add'>+# define SLREALLOC(buf, n) farrealloc((void far *) (buf), (unsigned long) (n))</div><div class='add'>+# define SLCALLOC(n, m) farcalloc((unsigned long) (n), (unsigned long) (m))</div><div class='add'>+#else</div><div class='add'>+# if defined(VMS) &amp;&amp; !defined(__DECC)</div><div class='add'>+#  define SLFREE VAXC$FREE_OPT</div><div class='add'>+#  define SLMALLOC VAXC$MALLOC_OPT</div><div class='add'>+#  define SLREALLOC VAXC$REALLOC_OPT</div><div class='add'>+#  define SLCALLOC VAXC$CALLOC_OPT</div><div class='add'>+# else</div><div class='add'>+#  define SLFREE(x) free((char *)(x))</div><div class='add'>+#  define SLMALLOC malloc</div><div class='add'>+#  define SLREALLOC realloc</div><div class='add'>+#  define SLCALLOC calloc</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   extern char *SLdebug_malloc (unsigned long);</div><div class='add'>+   extern char *SLdebug_calloc (unsigned long, unsigned long);</div><div class='add'>+   extern char *SLdebug_realloc (char *, unsigned long);</div><div class='add'>+   extern void SLdebug_free (char *);</div><div class='add'>+   extern void SLmalloc_dump_statistics (void);</div><div class='add'>+   extern char *SLstrcpy(register char *, register char *);</div><div class='add'>+   extern int SLstrcmp(register char *, register char *);</div><div class='add'>+   extern char *SLstrncpy(char *, register char *, register  int);</div><div class='add'>+</div><div class='add'>+   extern void SLmemset (char *, char, int);</div><div class='add'>+   extern char *SLmemchr (register char *, register char, register int);</div><div class='add'>+   extern char *SLmemcpy (char *, char *, int);</div><div class='add'>+   extern int SLmemcmp (char *, char *, int);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Interpreter Typedefs */</div><div class='add'>+</div><div class='add'>+typedef struct _SLang_Name_Type</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   struct _SLang_Name_Type *next;</div><div class='add'>+   char name_type;</div><div class='add'>+   /* These values must be less than 0x10 because they map directly</div><div class='add'>+    * to byte codes.  See _slang.h.</div><div class='add'>+    */</div><div class='add'>+#define SLANG_LVARIABLE		0x01</div><div class='add'>+#define SLANG_GVARIABLE 	0x02</div><div class='add'>+#define SLANG_IVARIABLE 	0x03           /* intrinsic variables */</div><div class='add'>+   /* Note!!! For Macro MAKE_VARIABLE below to work, SLANG_IVARIABLE Must</div><div class='add'>+    be 1 less than SLANG_RVARIABLE!!! */</div><div class='add'>+#define SLANG_RVARIABLE		0x04	       /* read only variable */</div><div class='add'>+#define SLANG_INTRINSIC 	0x05</div><div class='add'>+#define SLANG_FUNCTION  	0x06</div><div class='add'>+#define SLANG_MATH_UNARY  	0x07</div><div class='add'>+#define SLANG_APP_UNARY  	0x08</div><div class='add'>+#define SLANG_ICONSTANT		0x09</div><div class='add'>+#define SLANG_DCONSTANT		0x0A</div><div class='add'>+#define SLANG_PVARIABLE		0x0B   /* private */</div><div class='add'>+#define SLANG_PFUNCTION		0x0C   /* private */</div><div class='add'>+</div><div class='add'>+   /* Rest of fields depend on name type */</div><div class='add'>+}</div><div class='add'>+SLang_Name_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   struct _SLang_Name_Type *next;      /* this is for the hash table */</div><div class='add'>+   char name_type;</div><div class='add'>+</div><div class='add'>+   FVOID_STAR i_fun;		       /* address of object */</div><div class='add'>+</div><div class='add'>+   /* Do not change this without modifying slang.c:execute_intrinsic_fun */</div><div class='add'>+#define SLANG_MAX_INTRIN_ARGS	7</div><div class='add'>+   unsigned char arg_types [SLANG_MAX_INTRIN_ARGS];</div><div class='add'>+   unsigned char num_args;</div><div class='add'>+   unsigned char return_type;</div><div class='add'>+}</div><div class='add'>+SLang_Intrin_Fun_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   SLang_Name_Type *next;</div><div class='add'>+   char name_type;</div><div class='add'>+</div><div class='add'>+   VOID_STAR addr;</div><div class='add'>+   unsigned char type;</div><div class='add'>+}</div><div class='add'>+SLang_Intrin_Var_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   SLang_Name_Type *next;</div><div class='add'>+   char name_type;</div><div class='add'>+</div><div class='add'>+   int unary_op;</div><div class='add'>+}</div><div class='add'>+SLang_App_Unary_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   SLang_Name_Type *next;</div><div class='add'>+   char name_type;</div><div class='add'>+</div><div class='add'>+   int unary_op;</div><div class='add'>+}</div><div class='add'>+SLang_Math_Unary_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   SLang_Name_Type *next;</div><div class='add'>+   char name_type;</div><div class='add'>+   int i;</div><div class='add'>+}</div><div class='add'>+SLang_IConstant_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   SLang_Name_Type *next;</div><div class='add'>+   char name_type;</div><div class='add'>+   double d;</div><div class='add'>+}</div><div class='add'>+SLang_DConstant_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *field_name;</div><div class='add'>+   unsigned int offset;</div><div class='add'>+   unsigned char type;</div><div class='add'>+   unsigned char read_only;</div><div class='add'>+}</div><div class='add'>+SLang_IStruct_Field_Type;</div><div class='add'>+</div><div class='add'>+extern int SLadd_intrin_fun_table (SLang_Intrin_Fun_Type *, char *);</div><div class='add'>+extern int SLadd_intrin_var_table (SLang_Intrin_Var_Type *, char *);</div><div class='add'>+extern int SLadd_app_unary_table (SLang_App_Unary_Type *, char *);</div><div class='add'>+extern int SLadd_math_unary_table (SLang_Math_Unary_Type *, char *);</div><div class='add'>+extern int SLadd_iconstant_table (SLang_IConstant_Type *, char *);</div><div class='add'>+extern int SLadd_dconstant_table (SLang_DConstant_Type *, char *);</div><div class='add'>+extern int SLadd_istruct_table (SLang_IStruct_Field_Type *, VOID_STAR, char *);</div><div class='add'>+</div><div class='add'>+typedef struct _SLang_NameSpace_Type SLang_NameSpace_Type;</div><div class='add'>+</div><div class='add'>+extern int SLns_add_intrin_fun_table (SLang_NameSpace_Type *, SLang_Intrin_Fun_Type *, char *);</div><div class='add'>+extern int SLns_add_intrin_var_table (SLang_NameSpace_Type *, SLang_Intrin_Var_Type *, char *);</div><div class='add'>+extern int SLns_add_app_unary_table (SLang_NameSpace_Type *, SLang_App_Unary_Type *, char *);</div><div class='add'>+extern int SLns_add_math_unary_table (SLang_NameSpace_Type *, SLang_Math_Unary_Type *, char *);</div><div class='add'>+extern int SLns_add_iconstant_table (SLang_NameSpace_Type *, SLang_IConstant_Type *, char *);</div><div class='add'>+extern int SLns_add_dconstant_table (SLang_NameSpace_Type *, SLang_DConstant_Type *, char *);</div><div class='add'>+extern int SLns_add_istruct_table (SLang_NameSpace_Type *, SLang_IStruct_Field_Type *, VOID_STAR, char *);</div><div class='add'>+</div><div class='add'>+extern SLang_NameSpace_Type *SLns_create_namespace (char *);</div><div class='add'>+extern void SLns_delete_namespace (SLang_NameSpace_Type *);</div><div class='add'>+</div><div class='add'>+typedef struct SLang_Load_Type</div><div class='add'>+{</div><div class='add'>+   int type;</div><div class='add'>+</div><div class='add'>+   VOID_STAR client_data;</div><div class='add'>+   /* Pointer to data that client needs for loading */</div><div class='add'>+</div><div class='add'>+   int auto_declare_globals;</div><div class='add'>+   /* if non-zero, undefined global variables are declared as static */</div><div class='add'>+</div><div class='add'>+   char *(*read)(struct SLang_Load_Type *);</div><div class='add'>+   /* function to call to read next line from obj. */</div><div class='add'>+</div><div class='add'>+   unsigned int line_num;</div><div class='add'>+   /* Number of lines read, used for error reporting */</div><div class='add'>+</div><div class='add'>+   int parse_level;</div><div class='add'>+   /* 0 if at top level of parsing */</div><div class='add'>+</div><div class='add'>+   char *name;</div><div class='add'>+   /* Name of this object, e.g., filename.  This name should be unique because</div><div class='add'>+    * it alone determines the name space for static objects associated with</div><div class='add'>+    * the compilable unit.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   unsigned long reserved[4];</div><div class='add'>+   /* For future expansion */</div><div class='add'>+} SLang_Load_Type;</div><div class='add'>+</div><div class='add'>+extern SLang_Load_Type *SLallocate_load_type (char *);</div><div class='add'>+extern void SLdeallocate_load_type (SLang_Load_Type *);</div><div class='add'>+</div><div class='add'>+/* Returns SLang_Error upon failure */</div><div class='add'>+extern int SLang_load_object (SLang_Load_Type *);</div><div class='add'>+extern int (*SLang_Load_File_Hook)(char *);</div><div class='add'>+extern int (*SLang_Auto_Declare_Var_Hook) (char *);</div><div class='add'>+</div><div class='add'>+extern int SLang_generate_debug_info (int);</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#if defined(ultrix) &amp;&amp; !defined(__GNUC__)</div><div class='add'>+# ifndef NO_PROTOTYPES</div><div class='add'>+#  define NO_PROTOTYPES</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef NO_PROTOTYPES</div><div class='add'>+# define _PROTO(x) x</div><div class='add'>+#else</div><div class='add'>+# define _PROTO(x) ()</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct SL_OOBinary_Type</div><div class='add'>+{</div><div class='add'>+   unsigned char data_type;	       /* partner type for binary op */</div><div class='add'>+</div><div class='add'>+    int (*binary_function)_PROTO((int,</div><div class='add'>+				 unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+				 unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+				 VOID_STAR));</div><div class='add'>+</div><div class='add'>+   int (*binary_result) _PROTO((int, unsigned char, unsigned char, unsigned char *));</div><div class='add'>+   struct SL_OOBinary_Type *next;</div><div class='add'>+}</div><div class='add'>+SL_OOBinary_Type;</div><div class='add'>+</div><div class='add'>+typedef struct _SL_Typecast_Type</div><div class='add'>+{</div><div class='add'>+   unsigned char data_type;	       /* to_type */</div><div class='add'>+   int allow_implicit;</div><div class='add'>+</div><div class='add'>+   int (*typecast)_PROTO((unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+			  unsigned char, VOID_STAR));</div><div class='add'>+   struct _SL_Typecast_Type *next;</div><div class='add'>+}</div><div class='add'>+SL_Typecast_Type;</div><div class='add'>+</div><div class='add'>+typedef struct _SLang_Struct_Type SLang_Struct_Type;</div><div class='add'>+</div><div class='add'>+#if defined(SL_APP_WANTS_FOREACH)</div><div class='add'>+/* It is up to the application to define struct _SLang_Foreach_Context_Type */</div><div class='add'>+typedef struct _SLang_Foreach_Context_Type SLang_Foreach_Context_Type;</div><div class='add'>+#else</div><div class='add'>+typedef int SLang_Foreach_Context_Type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   unsigned char cl_class_type;</div><div class='add'>+#define SLANG_CLASS_TYPE_MMT		0</div><div class='add'>+#define SLANG_CLASS_TYPE_SCALAR		1</div><div class='add'>+#define SLANG_CLASS_TYPE_VECTOR		2</div><div class='add'>+#define SLANG_CLASS_TYPE_PTR		3</div><div class='add'>+</div><div class='add'>+   unsigned int cl_data_type;	       /* SLANG_INTEGER_TYPE, etc... */</div><div class='add'>+   char *cl_name;			       /* slstring type */</div><div class='add'>+</div><div class='add'>+   unsigned int cl_sizeof_type;</div><div class='add'>+   VOID_STAR cl_transfer_buf;	       /* cl_sizeof_type bytes*/</div><div class='add'>+</div><div class='add'>+   /* Methods */</div><div class='add'>+</div><div class='add'>+   /* Most of the method functions are prototyped:</div><div class='add'>+    * int method (unsigned char type, VOID_STAR addr);</div><div class='add'>+    * Here, @type@ represents the type of object that the method is asked</div><div class='add'>+    * to deal with.  The second parameter @addr@ will contain the ADDRESS of</div><div class='add'>+    * the object.  For example, if type is SLANG_INT_TYPE, then @addr@ will</div><div class='add'>+    * actually be int *.  Similary, if type is SLANG_STRING_TYPE,</div><div class='add'>+    * then @addr@ will contain the address of the string, i.e., char **.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   void (*cl_destroy)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+   /* Prototype: void destroy(unsigned type, VOID_STAR val)</div><div class='add'>+    * Called to delete/free the object */</div><div class='add'>+</div><div class='add'>+   char *(*cl_string)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+   /* Prototype: char *to_string (unsigned char t, VOID_STAR p);</div><div class='add'>+    * Here p is a pointer to the object for which a string representation</div><div class='add'>+    * is to be returned.  The returned pointer is to be a MALLOCED string.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   /* Prototype: void push(unsigned char type, VOID_STAR v);</div><div class='add'>+    * Push a copy of the object of type @type@ at address @v@ onto the</div><div class='add'>+    * stack.</div><div class='add'>+    */</div><div class='add'>+   int (*cl_push)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+</div><div class='add'>+   /* Prototype: int pop(unsigned char type, VOID_STAR v);</div><div class='add'>+    * Pops value from stack and assign it to object, whose address is @v@.</div><div class='add'>+    */</div><div class='add'>+   int (*cl_pop)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+</div><div class='add'>+   int (*cl_unary_op_result_type)_PROTO((int, unsigned char, unsigned char *));</div><div class='add'>+   int (*cl_unary_op)_PROTO((int, unsigned char, VOID_STAR, unsigned int, VOID_STAR));</div><div class='add'>+</div><div class='add'>+   int (*cl_app_unary_op_result_type)_PROTO((int, unsigned char, unsigned char *));</div><div class='add'>+   int (*cl_app_unary_op)_PROTO((int, unsigned char, VOID_STAR, unsigned int, VOID_STAR));</div><div class='add'>+</div><div class='add'>+   /* If this function is non-NULL, it will be called for sin, cos, etc... */</div><div class='add'>+#define SLMATH_SIN	1</div><div class='add'>+#define SLMATH_COS	2</div><div class='add'>+#define SLMATH_TAN	3</div><div class='add'>+#define SLMATH_ATAN	4</div><div class='add'>+#define SLMATH_ASIN	5</div><div class='add'>+#define SLMATH_ACOS	6</div><div class='add'>+#define SLMATH_EXP	7</div><div class='add'>+#define SLMATH_LOG	8</div><div class='add'>+#define SLMATH_SQRT	9</div><div class='add'>+#define SLMATH_LOG10	10</div><div class='add'>+#define SLMATH_REAL	11</div><div class='add'>+#define SLMATH_IMAG	12</div><div class='add'>+#define SLMATH_SINH	13</div><div class='add'>+#define SLMATH_COSH	14</div><div class='add'>+#define SLMATH_TANH	15</div><div class='add'>+#define SLMATH_ATANH	16</div><div class='add'>+#define SLMATH_ASINH	17</div><div class='add'>+#define SLMATH_ACOSH	18</div><div class='add'>+#define SLMATH_TODOUBLE	19</div><div class='add'>+#define SLMATH_CONJ	20</div><div class='add'>+</div><div class='add'>+   int (*cl_math_op)_PROTO((int, unsigned char, VOID_STAR, unsigned int, VOID_STAR));</div><div class='add'>+   int (*cl_math_op_result_type)_PROTO((int, unsigned char, unsigned char *));</div><div class='add'>+</div><div class='add'>+   SL_OOBinary_Type *cl_binary_ops;</div><div class='add'>+   SL_Typecast_Type *cl_typecast_funs;</div><div class='add'>+</div><div class='add'>+   void (*cl_byte_code_destroy)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+   void (*cl_user_destroy_fun)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+   int (*cl_init_array_object)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+   int (*cl_datatype_deref)_PROTO((unsigned char));</div><div class='add'>+   SLang_Struct_Type *cl_struct_def;</div><div class='add'>+   int (*cl_dereference) _PROTO((unsigned char, VOID_STAR));</div><div class='add'>+   int (*cl_acopy) (unsigned char, VOID_STAR, VOID_STAR);</div><div class='add'>+   int (*cl_apop) _PROTO((unsigned char, VOID_STAR));</div><div class='add'>+   int (*cl_apush) _PROTO((unsigned char, VOID_STAR));</div><div class='add'>+   int (*cl_push_literal) _PROTO((unsigned char, VOID_STAR));</div><div class='add'>+   void (*cl_adestroy)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+   int (*cl_push_intrinsic)_PROTO((unsigned char, VOID_STAR));</div><div class='add'>+   int (*cl_void_typecast)_PROTO((unsigned char, VOID_STAR, unsigned int, unsigned char, VOID_STAR));</div><div class='add'>+</div><div class='add'>+   int (*cl_anytype_typecast)_PROTO((unsigned char, VOID_STAR, unsigned int, unsigned char, VOID_STAR));</div><div class='add'>+</div><div class='add'>+   /* Array access functions */</div><div class='add'>+   int (*cl_aput) (unsigned char, unsigned int);</div><div class='add'>+   int (*cl_aget) (unsigned char, unsigned int);</div><div class='add'>+   int (*cl_anew) (unsigned char, unsigned int);</div><div class='add'>+</div><div class='add'>+   /* length method */</div><div class='add'>+   int (*cl_length) (unsigned char, VOID_STAR, unsigned int *);</div><div class='add'>+</div><div class='add'>+   /* foreach */</div><div class='add'>+   SLang_Foreach_Context_Type *(*cl_foreach_open) (unsigned char, unsigned int);</div><div class='add'>+   void (*cl_foreach_close) (unsigned char, SLang_Foreach_Context_Type *);</div><div class='add'>+   int (*cl_foreach) (unsigned char, SLang_Foreach_Context_Type *);</div><div class='add'>+</div><div class='add'>+   /* Structure access: get and put (assign to) fields */</div><div class='add'>+   int (*cl_sput) (unsigned char, char *);</div><div class='add'>+   int (*cl_sget) (unsigned char, char *);</div><div class='add'>+</div><div class='add'>+   /* File I/O */</div><div class='add'>+   int (*cl_fread) (unsigned char, FILE *, VOID_STAR, unsigned int, unsigned int *);</div><div class='add'>+   int (*cl_fwrite) (unsigned char, FILE *, VOID_STAR, unsigned int, unsigned int *);</div><div class='add'>+   int (*cl_fdread) (unsigned char, int, VOID_STAR, unsigned int, unsigned int *);</div><div class='add'>+   int (*cl_fdwrite) (unsigned char, int, VOID_STAR, unsigned int, unsigned int *);</div><div class='add'>+</div><div class='add'>+   int (*cl_to_bool) (unsigned char, int *);</div><div class='add'>+   </div><div class='add'>+   int (*cl_cmp)(unsigned char, VOID_STAR, VOID_STAR, int *);</div><div class='add'>+</div><div class='add'>+} SLang_Class_Type;</div><div class='add'>+</div><div class='add'>+/* These are the low-level functions for building push/pop methods.  They</div><div class='add'>+ * know nothing about memory management.  For SLANG_CLASS_TYPE_MMT, use the</div><div class='add'>+ * MMT push/pop functions instead.</div><div class='add'>+ */</div><div class='add'>+extern int SLclass_push_double_obj (unsigned char, double);</div><div class='add'>+extern int SLclass_push_float_obj (unsigned char, float);</div><div class='add'>+extern int SLclass_push_long_obj (unsigned char, long);</div><div class='add'>+extern int SLclass_push_int_obj (unsigned char, int);</div><div class='add'>+extern int SLclass_push_short_obj (unsigned char, short);</div><div class='add'>+extern int SLclass_push_char_obj (unsigned char, char);</div><div class='add'>+extern int SLclass_push_ptr_obj (unsigned char, VOID_STAR);</div><div class='add'>+extern int SLclass_pop_double_obj (unsigned char, double *);</div><div class='add'>+extern int SLclass_pop_float_obj (unsigned char, float *);</div><div class='add'>+extern int SLclass_pop_long_obj (unsigned char, long *);</div><div class='add'>+extern int SLclass_pop_int_obj (unsigned char, int *);</div><div class='add'>+extern int SLclass_pop_short_obj (unsigned char, short *);</div><div class='add'>+extern int SLclass_pop_char_obj (unsigned char, char *);</div><div class='add'>+extern int SLclass_pop_ptr_obj (unsigned char, VOID_STAR *);</div><div class='add'>+</div><div class='add'>+extern SLang_Class_Type *SLclass_allocate_class (char *);</div><div class='add'>+extern int SLclass_get_class_id (SLang_Class_Type *cl);</div><div class='add'>+extern int SLclass_create_synonym (char *, unsigned char);</div><div class='add'>+extern int SLclass_is_class_defined (unsigned char);</div><div class='add'>+</div><div class='add'>+extern int SLclass_register_class (SLang_Class_Type *, unsigned char, unsigned int, unsigned char);</div><div class='add'>+extern int SLclass_set_string_function (SLang_Class_Type *, char *(*)(unsigned char, VOID_STAR));</div><div class='add'>+extern int SLclass_set_destroy_function (SLang_Class_Type *, void (*)(unsigned char, VOID_STAR));</div><div class='add'>+extern int SLclass_set_push_function (SLang_Class_Type *, int (*)(unsigned char, VOID_STAR));</div><div class='add'>+extern int SLclass_set_pop_function (SLang_Class_Type *, int (*)(unsigned char, VOID_STAR));</div><div class='add'>+</div><div class='add'>+extern int SLclass_set_aget_function (SLang_Class_Type *, int (*)(unsigned char, unsigned int));</div><div class='add'>+extern int SLclass_set_aput_function (SLang_Class_Type *, int (*)(unsigned char, unsigned int));</div><div class='add'>+extern int SLclass_set_anew_function (SLang_Class_Type *, int (*)(unsigned char, unsigned int));</div><div class='add'>+</div><div class='add'>+extern int SLclass_set_sget_function (SLang_Class_Type *, int (*)(unsigned char, char *));</div><div class='add'>+extern int SLclass_set_sput_function (SLang_Class_Type *, int (*)(unsigned char, char *));</div><div class='add'>+</div><div class='add'>+/* Typecast object on the stack to type p1.  p2 and p3 should be set to 1 */</div><div class='add'>+extern int SLclass_typecast (unsigned char, int, int);</div><div class='add'>+</div><div class='add'>+extern int SLclass_add_unary_op (unsigned char,</div><div class='add'>+				 int (*) (int,</div><div class='add'>+					  unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+					  VOID_STAR),</div><div class='add'>+				 int (*) (int, unsigned char, unsigned char *));</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+SLclass_add_app_unary_op (unsigned char,</div><div class='add'>+			  int (*) (int,</div><div class='add'>+				   unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+				   VOID_STAR),</div><div class='add'>+			  int (*) (int, unsigned char, unsigned char *));</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+SLclass_add_binary_op (unsigned char, unsigned char,</div><div class='add'>+		       int (*) (int,</div><div class='add'>+				unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+				unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+				VOID_STAR),</div><div class='add'>+		       int (*) (int, unsigned char, unsigned char, unsigned char *));</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+SLclass_add_math_op (unsigned char,</div><div class='add'>+		     int (*)(int,</div><div class='add'>+			     unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+			     VOID_STAR),</div><div class='add'>+		     int (*)(int, unsigned char, unsigned char *));</div><div class='add'>+</div><div class='add'>+extern int</div><div class='add'>+SLclass_add_typecast (unsigned char /* from */, unsigned char /* to */,</div><div class='add'>+		      int (*)_PROTO((unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+				     unsigned char, VOID_STAR)),</div><div class='add'>+		      int	       /* allow implicit typecasts */</div><div class='add'>+		      );</div><div class='add'>+</div><div class='add'>+extern char *SLclass_get_datatype_name (unsigned char);</div><div class='add'>+</div><div class='add'>+extern double SLcomplex_abs (double *);</div><div class='add'>+extern double *SLcomplex_times (double *, double *, double *);</div><div class='add'>+extern double *SLcomplex_divide (double *, double *, double *);</div><div class='add'>+extern double *SLcomplex_sin (double *, double *);</div><div class='add'>+extern double *SLcomplex_cos (double *, double *);</div><div class='add'>+extern double *SLcomplex_tan (double *, double *);</div><div class='add'>+extern double *SLcomplex_asin (double *, double *);</div><div class='add'>+extern double *SLcomplex_acos (double *, double *);</div><div class='add'>+extern double *SLcomplex_atan (double *, double *);</div><div class='add'>+extern double *SLcomplex_exp (double *, double *);</div><div class='add'>+extern double *SLcomplex_log (double *, double *);</div><div class='add'>+extern double *SLcomplex_log10 (double *, double *);</div><div class='add'>+extern double *SLcomplex_sqrt (double *, double *);</div><div class='add'>+extern double *SLcomplex_sinh (double *, double *);</div><div class='add'>+extern double *SLcomplex_cosh (double *, double *);</div><div class='add'>+extern double *SLcomplex_tanh (double *, double *);</div><div class='add'>+extern double *SLcomplex_pow (double *, double *, double *);</div><div class='add'>+extern double SLmath_hypot (double x, double y);</div><div class='add'>+</div><div class='add'>+/* Not implemented yet */</div><div class='add'>+extern double *SLcomplex_asinh (double *, double *);</div><div class='add'>+extern double *SLcomplex_acosh (double *, double *);</div><div class='add'>+extern double *SLcomplex_atanh (double *, double *);</div><div class='add'>+</div><div class='add'>+#ifdef _SLANG_SOURCE_</div><div class='add'>+typedef struct _SLang_MMT_Type SLang_MMT_Type;</div><div class='add'>+#else</div><div class='add'>+typedef int SLang_MMT_Type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern void SLang_free_mmt (SLang_MMT_Type *);</div><div class='add'>+extern VOID_STAR SLang_object_from_mmt (SLang_MMT_Type *);</div><div class='add'>+extern SLang_MMT_Type *SLang_create_mmt (unsigned char, VOID_STAR);</div><div class='add'>+extern int SLang_push_mmt (SLang_MMT_Type *);</div><div class='add'>+extern SLang_MMT_Type *SLang_pop_mmt (unsigned char);</div><div class='add'>+extern void SLang_inc_mmt (SLang_MMT_Type *);</div><div class='add'>+</div><div class='add'>+/* Maximum number of dimensions of an array. */</div><div class='add'>+#define SLARRAY_MAX_DIMS		7</div><div class='add'>+typedef struct _SLang_Array_Type</div><div class='add'>+{</div><div class='add'>+   unsigned char data_type;</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   VOID_STAR data;</div><div class='add'>+   unsigned int num_elements;</div><div class='add'>+   unsigned int num_dims;</div><div class='add'>+   int dims [SLARRAY_MAX_DIMS];</div><div class='add'>+   VOID_STAR (*index_fun)_PROTO((struct _SLang_Array_Type *, int *));</div><div class='add'>+   /* This function is designed to allow a type to store an array in</div><div class='add'>+    * any manner it chooses.  This function returns the address of the data</div><div class='add'>+    * value at the specified index location.</div><div class='add'>+    */</div><div class='add'>+   unsigned int flags;</div><div class='add'>+#define SLARR_DATA_VALUE_IS_READ_ONLY		1</div><div class='add'>+#define SLARR_DATA_VALUE_IS_POINTER		2</div><div class='add'>+#define SLARR_DATA_VALUE_IS_RANGE		4</div><div class='add'>+#define SLARR_DATA_VALUE_IS_INTRINSIC		8</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   unsigned int num_refs;</div><div class='add'>+}</div><div class='add'>+SLang_Array_Type;</div><div class='add'>+</div><div class='add'>+extern int SLang_pop_array_of_type (SLang_Array_Type **, unsigned char);</div><div class='add'>+extern int SLang_pop_array (SLang_Array_Type **, int);</div><div class='add'>+extern int SLang_push_array (SLang_Array_Type *, int);</div><div class='add'>+extern void SLang_free_array (SLang_Array_Type *);</div><div class='add'>+extern SLang_Array_Type *SLang_create_array (unsigned char, int, VOID_STAR, int *, unsigned int);</div><div class='add'>+extern SLang_Array_Type *SLang_duplicate_array (SLang_Array_Type *);</div><div class='add'>+extern int SLang_get_array_element (SLang_Array_Type *, int *, VOID_STAR);</div><div class='add'>+extern int SLang_set_array_element (SLang_Array_Type *, int *, VOID_STAR);</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Interpreter Function Prototypes */</div><div class='add'>+</div><div class='add'>+  extern volatile int SLang_Error;</div><div class='add'>+/* Non zero if error occurs.  Must be reset to zero to continue. */</div><div class='add'>+/* error codes, severe errors are less than 0 */</div><div class='add'>+#define SL_APPLICATION_ERROR		-2</div><div class='add'>+#define SL_VARIABLE_UNINITIALIZED	-3</div><div class='add'>+#define SL_INTERNAL_ERROR		-5</div><div class='add'>+#define SL_STACK_OVERFLOW		-6</div><div class='add'>+#define SL_STACK_UNDERFLOW		-7</div><div class='add'>+#define SL_UNDEFINED_NAME		-8</div><div class='add'>+#define SL_SYNTAX_ERROR			-9</div><div class='add'>+#define SL_DUPLICATE_DEFINITION		-10</div><div class='add'>+#define SL_TYPE_MISMATCH		-11</div><div class='add'>+#define SL_OBJ_UNKNOWN			-13</div><div class='add'>+#define SL_UNKNOWN_ERROR		-14</div><div class='add'>+#define SL_TYPE_UNDEFINED_OP_ERROR	-16</div><div class='add'>+</div><div class='add'>+#define SL_INTRINSIC_ERROR		1</div><div class='add'>+/* Intrinsic error is an error generated by intrinsic functions */</div><div class='add'>+#define SL_USER_BREAK			2</div><div class='add'>+#define SL_DIVIDE_ERROR			3</div><div class='add'>+#define SL_OBJ_NOPEN			4</div><div class='add'>+#define SL_USER_ERROR			5</div><div class='add'>+#define SL_USAGE_ERROR			6</div><div class='add'>+#define SL_READONLY_ERROR		7</div><div class='add'>+#define SL_INVALID_PARM			8</div><div class='add'>+#define SL_NOT_IMPLEMENTED		9</div><div class='add'>+#define SL_MALLOC_ERROR			10</div><div class='add'>+#define SL_OVERFLOW			11</div><div class='add'>+#define SL_FLOATING_EXCEPTION		12</div><div class='add'>+</div><div class='add'>+/* Compatibility */</div><div class='add'>+#define USER_BREAK SL_USER_BREAK</div><div class='add'>+#define INTRINSIC_ERROR SL_INTRINSIC_ERROR</div><div class='add'>+</div><div class='add'>+  extern int SLang_Traceback;</div><div class='add'>+  /* If non-zero, dump an S-Lang traceback upon error.  Available as</div><div class='add'>+     _traceback in S-Lang. */</div><div class='add'>+</div><div class='add'>+  extern char *SLang_User_Prompt;</div><div class='add'>+  /* Prompt to use when reading from stdin */</div><div class='add'>+  extern int SLang_Version;</div><div class='add'>+  extern char *SLang_Version_String;</div><div class='add'>+extern char *SLang_Doc_Dir;</div><div class='add'>+</div><div class='add'>+extern void (*SLang_VMessage_Hook) (char *, va_list);</div><div class='add'>+extern void SLang_vmessage (char *, ...);</div><div class='add'>+</div><div class='add'>+  extern void (*SLang_Error_Hook)(char *);</div><div class='add'>+  /* Pointer to application dependent error messaging routine.  By default,</div><div class='add'>+     messages are displayed on stderr. */</div><div class='add'>+</div><div class='add'>+  extern void (*SLang_Exit_Error_Hook)(char *, va_list);</div><div class='add'>+  extern void SLang_exit_error (char *, ...);</div><div class='add'>+  extern void (*SLang_Dump_Routine)(char *);</div><div class='add'>+  /* Called if S-Lang traceback is enabled as well as other debugging</div><div class='add'>+     routines (e.g., trace).  By default, these messages go to stderr. */</div><div class='add'>+</div><div class='add'>+  extern void (*SLang_Interrupt)(void);</div><div class='add'>+  /* function to call whenever inner interpreter is entered.  This is</div><div class='add'>+     a good place to set SLang_Error to USER_BREAK. */</div><div class='add'>+</div><div class='add'>+  extern void (*SLang_User_Clear_Error)(void);</div><div class='add'>+  /* function that gets called when '_clear_error' is called. */</div><div class='add'>+</div><div class='add'>+  /* If non null, these call C functions before and after a slang function. */</div><div class='add'>+  extern void (*SLang_Enter_Function)(char *);</div><div class='add'>+extern void (*SLang_Exit_Function)(char *);</div><div class='add'>+</div><div class='add'>+extern int SLang_Num_Function_Args;</div><div class='add'>+</div><div class='add'>+/* Functions: */</div><div class='add'>+</div><div class='add'>+extern int SLang_init_all (void);</div><div class='add'>+/* Initializes interpreter and all modules */</div><div class='add'>+</div><div class='add'>+extern int SLang_init_slang (void);</div><div class='add'>+/* This function is mandatory and must be called by all applications that</div><div class='add'>+ * use the interpreter</div><div class='add'>+ */</div><div class='add'>+extern int SLang_init_posix_process (void);   /* process specific intrinsics */</div><div class='add'>+extern int SLang_init_stdio (void);    /* fgets, etc. stdio functions  */</div><div class='add'>+extern int SLang_init_posix_dir (void);</div><div class='add'>+extern int SLang_init_ospath (void);</div><div class='add'>+</div><div class='add'>+extern int SLang_init_slmath (void);</div><div class='add'>+/* called if math functions sin, cos, etc... are needed. */</div><div class='add'>+</div><div class='add'>+   extern int SLang_init_slfile (void);</div><div class='add'>+   extern int SLang_init_slunix (void);</div><div class='add'>+   /* These functions are obsolte.  Use init_stdio, posix_process, etc. */</div><div class='add'>+</div><div class='add'>+extern int SLang_init_slassoc (void);</div><div class='add'>+/* Assoc Arrays (Hashes) */</div><div class='add'>+</div><div class='add'>+extern int SLang_init_array (void);</div><div class='add'>+/* Additional arrays functions: transpose, etc... */</div><div class='add'>+</div><div class='add'>+/* Dynamic linking facility */</div><div class='add'>+extern int SLang_init_import (void);</div><div class='add'>+</div><div class='add'>+   extern int SLang_load_file (char *);</div><div class='add'>+   /* Load a file of S-Lang code for interpreting.  If the parameter is</div><div class='add'>+    * NULL, input comes from stdin. */</div><div class='add'>+</div><div class='add'>+   extern void SLang_restart(int);</div><div class='add'>+   /* should be called if an error occurs.  If the passed integer is</div><div class='add'>+    * non-zero, items are popped off the stack; otherwise, the stack is</div><div class='add'>+    * left intact.  Any time the stack is believed to be trashed, this routine</div><div class='add'>+    * should be called with a non-zero argument (e.g., if setjmp/longjmp is</div><div class='add'>+    * called). */</div><div class='add'>+</div><div class='add'>+   extern int SLang_byte_compile_file(char *, int);</div><div class='add'>+   /* takes a file of S-Lang code and ``byte-compiles'' it for faster</div><div class='add'>+    * loading.  The new filename is equivalent to the old except that a `c' is</div><div class='add'>+    * appended to the name.  (e.g., init.sl --&gt; init.slc).  The second</div><div class='add'>+    * specified the method; currently, it is not used.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   extern int SLang_autoload(char *, char *);</div><div class='add'>+   /* Automatically load S-Lang function p1 from file p2.  This function</div><div class='add'>+      is also available via S-Lang */</div><div class='add'>+</div><div class='add'>+   extern int SLang_load_string(char *);</div><div class='add'>+   /* Like SLang_load_file except input is from a null terminated string. */</div><div class='add'>+</div><div class='add'>+   extern int SLdo_pop(void);</div><div class='add'>+   /* pops item off stack and frees any memory associated with it */</div><div class='add'>+   extern int SLdo_pop_n(unsigned int);</div><div class='add'>+   /* pops n items off stack and frees any memory associated with them */</div><div class='add'>+</div><div class='add'>+extern int SLang_pop_integer(int *);</div><div class='add'>+extern int SLang_pop_uinteger(unsigned int *);</div><div class='add'>+   /* pops integer *p0 from the stack.  Returns 0 upon success and non-zero</div><div class='add'>+    * if the stack is empty or a type mismatch occurs, setting SLang_Error.</div><div class='add'>+    */</div><div class='add'>+extern int SLang_pop_char (char *);</div><div class='add'>+extern int SLang_pop_uchar (unsigned char *);</div><div class='add'>+extern int SLang_pop_short(short *);</div><div class='add'>+extern int SLang_pop_ushort(unsigned short *);</div><div class='add'>+extern int SLang_pop_long(long *);</div><div class='add'>+extern int SLang_pop_ulong(unsigned long *);</div><div class='add'>+</div><div class='add'>+extern int SLang_pop_float(float *);</div><div class='add'>+extern int SLang_pop_double(double *, int *, int *);</div><div class='add'>+   /* Pops double *p1 from stack.  If *p3 is non-zero, *p1 was derived</div><div class='add'>+      from the integer *p2. Returns zero upon success. */</div><div class='add'>+</div><div class='add'>+   extern int SLang_pop_complex (double *, double *);</div><div class='add'>+</div><div class='add'>+   extern int SLpop_string (char **);</div><div class='add'>+   extern int SLang_pop_string(char **, int *);</div><div class='add'>+   /* pops string *p0 from stack.  If *p1 is non-zero, the string must be</div><div class='add'>+    * freed after its use.  DO NOT FREE p0 if *p1 IS ZERO! Returns 0 upon</div><div class='add'>+    * success */</div><div class='add'>+</div><div class='add'>+   extern int SLang_push_complex (double, double);</div><div class='add'>+</div><div class='add'>+   extern int SLang_push_char (char);</div><div class='add'>+   extern int SLang_push_uchar (unsigned char);</div><div class='add'>+</div><div class='add'>+   extern int SLang_push_integer(int);</div><div class='add'>+   extern int SLang_push_uinteger(unsigned int);</div><div class='add'>+   /* push integer p1 on stack */</div><div class='add'>+</div><div class='add'>+   extern int SLang_push_short(short);</div><div class='add'>+   extern int SLang_push_ushort(unsigned short);</div><div class='add'>+   extern int SLang_push_long(long);</div><div class='add'>+   extern int SLang_push_ulong(unsigned long);</div><div class='add'>+   extern int SLang_push_float(float);</div><div class='add'>+   extern int SLang_push_double(double);</div><div class='add'>+   /* Push double onto stack */</div><div class='add'>+</div><div class='add'>+   extern int SLang_push_string(char *);</div><div class='add'>+   /* Push string p1 onto stack */</div><div class='add'>+</div><div class='add'>+   extern int SLang_push_malloced_string(char *);</div><div class='add'>+   /* The normal SLang_push_string pushes an slstring.  This one converts</div><div class='add'>+    * a normally malloced string to an slstring, and then frees the </div><div class='add'>+    * malloced string.  So, do NOT use the malloced string after calling</div><div class='add'>+    * this routine because it will be freed!  The routine returns -1 upon </div><div class='add'>+    * error, but the string will be freed.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+extern int SLang_push_null (void);</div><div class='add'>+extern int SLang_pop_null (void);</div><div class='add'>+</div><div class='add'>+extern int SLang_push_value (unsigned char type, VOID_STAR);</div><div class='add'>+extern int SLang_pop_value (unsigned char type, VOID_STAR);</div><div class='add'>+extern void SLang_free_value (unsigned char type, VOID_STAR);</div><div class='add'>+</div><div class='add'>+typedef struct _SLang_Object_Type SLang_Any_Type;</div><div class='add'>+</div><div class='add'>+extern int SLang_pop_anytype (SLang_Any_Type **);</div><div class='add'>+extern int SLang_push_anytype (SLang_Any_Type *);</div><div class='add'>+extern void SLang_free_anytype (SLang_Any_Type *);</div><div class='add'>+</div><div class='add'>+#ifdef _SLANG_SOURCE_</div><div class='add'>+typedef struct _SLang_Ref_Type SLang_Ref_Type;</div><div class='add'>+#else</div><div class='add'>+typedef int SLang_Ref_Type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern int SLang_pop_ref (SLang_Ref_Type **);</div><div class='add'>+extern void SLang_free_ref (SLang_Ref_Type *);</div><div class='add'>+extern int SLang_assign_to_ref (SLang_Ref_Type *, unsigned char, VOID_STAR);</div><div class='add'>+extern SLang_Name_Type *SLang_pop_function (void);</div><div class='add'>+extern SLang_Name_Type *SLang_get_fun_from_ref (SLang_Ref_Type *);</div><div class='add'>+extern void SLang_free_function (SLang_Name_Type *f);</div><div class='add'>+</div><div class='add'>+   extern int SLang_is_defined(char *);</div><div class='add'>+   /* Return non-zero is p1 is defined otherwise returns 0. */</div><div class='add'>+</div><div class='add'>+   extern int SLang_run_hooks(char *, unsigned int, ...);</div><div class='add'>+   /* calls S-Lang function p1 pushing p2 strings in the variable argument</div><div class='add'>+    * list onto the stack first.</div><div class='add'>+    * Returns -1 upon error, 1 if hooks exists and it ran,</div><div class='add'>+    * or 0 if hook does not exist.  Thus it returns non-zero is hook was called.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+/* These functions return 1 if the indicated function exists and the function</div><div class='add'>+ * runs without error.  If the function does not exist, the function returns</div><div class='add'>+ * 0.  Otherwise -1 is returned with SLang_Error set appropriately.</div><div class='add'>+ */</div><div class='add'>+extern int SLexecute_function (SLang_Name_Type *);</div><div class='add'>+extern int SLang_execute_function(char *);</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+extern int SLang_end_arg_list (void);</div><div class='add'>+extern int SLang_start_arg_list (void);</div><div class='add'>+</div><div class='add'>+extern void SLang_verror (int, char *, ...);</div><div class='add'>+</div><div class='add'>+extern void SLang_doerror(char *);</div><div class='add'>+   /* set SLang_Error and display p1 as error message */</div><div class='add'>+</div><div class='add'>+extern int SLang_add_intrinsic_array (char *,   /* name */</div><div class='add'>+				      unsigned char,   /* type */</div><div class='add'>+				      int,   /* readonly */</div><div class='add'>+				      VOID_STAR,   /* data */</div><div class='add'>+				      unsigned int, ...);   /* num dims */</div><div class='add'>+</div><div class='add'>+extern int SLextract_list_element (char *, unsigned int, char,</div><div class='add'>+				   char *, unsigned int);</div><div class='add'>+</div><div class='add'>+extern void SLexpand_escaped_string (register char *, register char *,</div><div class='add'>+				     register char *);</div><div class='add'>+</div><div class='add'>+extern SLang_Name_Type *SLang_get_function (char *);</div><div class='add'>+extern void SLang_release_function (SLang_Name_Type *);</div><div class='add'>+</div><div class='add'>+extern int SLreverse_stack (int);</div><div class='add'>+extern int SLroll_stack (int);</div><div class='add'>+/* If argument p is positive, the top p objects on the stack are rolled</div><div class='add'>+ * up.  If negative, the stack is rolled down.</div><div class='add'>+ */</div><div class='add'>+extern int SLdup_n (int n);</div><div class='add'>+/* Duplicate top n elements of stack */</div><div class='add'>+</div><div class='add'>+extern int SLang_peek_at_stack1 (void);</div><div class='add'>+extern int SLang_peek_at_stack (void);</div><div class='add'>+/* Returns type of next object on stack-- -1 upon stack underflow. */</div><div class='add'>+extern void SLmake_lut (unsigned char *, unsigned char *, unsigned char);</div><div class='add'>+</div><div class='add'>+   extern int SLang_guess_type (char *);</div><div class='add'>+</div><div class='add'>+extern int SLstruct_create_struct (unsigned int,</div><div class='add'>+				   char **,</div><div class='add'>+				   unsigned char *,</div><div class='add'>+				   VOID_STAR *);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Misc Functions */</div><div class='add'>+</div><div class='add'>+/* This is an interface to atexit */</div><div class='add'>+extern int SLang_add_cleanup_function (void (*)(void));</div><div class='add'>+</div><div class='add'>+extern char *SLmake_string (char *);</div><div class='add'>+extern char *SLmake_nstring (char *, unsigned int);</div><div class='add'>+/* Returns a null terminated string made from the first n characters of the</div><div class='add'>+ * string.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* The string created by this routine must be freed by SLang_free_slstring</div><div class='add'>+ * and nothing else!!  Also these strings must not be modified.  Use</div><div class='add'>+ * SLmake_string if you intend to modify them!!</div><div class='add'>+ */</div><div class='add'>+extern char *SLang_create_nslstring (char *, unsigned int);</div><div class='add'>+extern char *SLang_create_slstring (char *);</div><div class='add'>+extern void SLang_free_slstring (char *);    /* handles NULL */</div><div class='add'>+extern int SLang_pop_slstring (char **);   /* free with SLang_free_slstring */</div><div class='add'>+extern char *SLang_concat_slstrings (char *a, char *b);</div><div class='add'>+extern char *SLang_create_static_slstring (char *);   /* adds a string that will not get deleted */</div><div class='add'>+extern void SLstring_dump_stats (void);</div><div class='add'>+</div><div class='add'>+/* Binary strings */</div><div class='add'>+/* The binary string is an opaque type.  Use the SLbstring_get_pointer function</div><div class='add'>+ * to get a pointer and length.</div><div class='add'>+ */</div><div class='add'>+typedef struct _SLang_BString_Type SLang_BString_Type;</div><div class='add'>+extern unsigned char *SLbstring_get_pointer (SLang_BString_Type *, unsigned int *);</div><div class='add'>+</div><div class='add'>+extern SLang_BString_Type *SLbstring_dup (SLang_BString_Type *);</div><div class='add'>+extern SLang_BString_Type *SLbstring_create (unsigned char *, unsigned int);</div><div class='add'>+</div><div class='add'>+/* The create_malloced function used the first argument which is assumed</div><div class='add'>+ * to be a pointer to a len + 1 malloced string.  The extra byte is for</div><div class='add'>+ * \0 termination.</div><div class='add'>+ */</div><div class='add'>+extern SLang_BString_Type *SLbstring_create_malloced (unsigned char *, unsigned int, int);</div><div class='add'>+</div><div class='add'>+/* Create a bstring from an slstring */</div><div class='add'>+extern SLang_BString_Type *SLbstring_create_slstring (char *);</div><div class='add'>+</div><div class='add'>+extern void SLbstring_free (SLang_BString_Type *);</div><div class='add'>+extern int SLang_pop_bstring (SLang_BString_Type **);</div><div class='add'>+extern int SLang_push_bstring (SLang_BString_Type *);</div><div class='add'>+</div><div class='add'>+extern char *SLmalloc (unsigned int);</div><div class='add'>+extern char *SLcalloc (unsigned int, unsigned int);</div><div class='add'>+extern void SLfree(char *);	       /* This function handles NULL */</div><div class='add'>+extern char *SLrealloc (char *, unsigned int);</div><div class='add'>+</div><div class='add'>+extern char *SLcurrent_time_string (void);</div><div class='add'>+</div><div class='add'>+extern int SLatoi(unsigned char *);</div><div class='add'>+extern long SLatol (unsigned char *);</div><div class='add'>+extern unsigned long SLatoul (unsigned char *);</div><div class='add'>+</div><div class='add'>+extern int SLang_pop_fileptr (SLang_MMT_Type **, FILE **);</div><div class='add'>+extern char *SLang_get_name_from_fileptr (SLang_MMT_Type *);</div><div class='add'>+</div><div class='add'>+typedef struct _SLFile_FD_Type SLFile_FD_Type;</div><div class='add'>+extern SLFile_FD_Type *SLfile_create_fd (char *, int);</div><div class='add'>+extern void SLfile_free_fd (SLFile_FD_Type *);</div><div class='add'>+extern int SLfile_push_fd (SLFile_FD_Type *);</div><div class='add'>+extern int SLfile_pop_fd (SLFile_FD_Type **);</div><div class='add'>+extern int SLfile_get_fd (SLFile_FD_Type *, int *);</div><div class='add'>+extern SLFile_FD_Type *SLfile_dup_fd (SLFile_FD_Type *f0);</div><div class='add'>+extern int SLang_init_posix_io (void);</div><div class='add'>+</div><div class='add'>+typedef double (*SLang_To_Double_Fun_Type)(VOID_STAR);</div><div class='add'>+extern SLang_To_Double_Fun_Type SLarith_get_to_double_fun (unsigned char, unsigned int *);</div><div class='add'>+</div><div class='add'>+extern int SLang_set_argc_argv (int, char **);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang getkey interface Functions */</div><div class='add'>+</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+extern int SLang_TT_Baud_Rate;</div><div class='add'>+extern int SLang_TT_Read_FD;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern int SLang_init_tty (int, int, int);</div><div class='add'>+/* Initializes the tty for single character input.  If the first parameter *p1</div><div class='add'>+ * is in the range 0-255, it will be used for the abort character;</div><div class='add'>+ * otherwise, (unix only) if it is -1, the abort character will be the one</div><div class='add'>+ * used by the terminal.  If the second parameter p2 is non-zero, flow</div><div class='add'>+ * control is enabled.  If the last parmeter p3 is zero, output processing</div><div class='add'>+ * is NOT turned on.  A value of zero is required for the screen management</div><div class='add'>+ * routines. Returns 0 upon success. In addition, if SLang_TT_Baud_Rate ==</div><div class='add'>+ * 0 when this function is called, SLang will attempt to determine the</div><div class='add'>+ * terminals baud rate.  As far as the SLang library is concerned, if</div><div class='add'>+ * SLang_TT_Baud_Rate is less than or equal to zero, the baud rate is</div><div class='add'>+ * effectively infinite.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+extern void SLang_reset_tty (void);</div><div class='add'>+/* Resets tty to what it was prior to a call to SLang_init_tty */</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+extern void SLtty_set_suspend_state (int);</div><div class='add'>+   /* If non-zero argument, terminal driver will be told to react to the</div><div class='add'>+    * suspend character.  If 0, it will not.</div><div class='add'>+    */</div><div class='add'>+extern int (*SLang_getkey_intr_hook) (void);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define SLANG_GETKEY_ERROR 0xFFFF</div><div class='add'>+extern unsigned int SLang_getkey (void);</div><div class='add'>+/* reads a single key from the tty.  If the read fails,  0xFFFF is returned. */</div><div class='add'>+</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+extern int SLgetkey_map_to_ansi (int);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern int SLang_ungetkey_string (unsigned char *, unsigned int);</div><div class='add'>+extern int SLang_buffer_keystring (unsigned char *, unsigned int);</div><div class='add'>+extern int SLang_ungetkey (unsigned char);</div><div class='add'>+extern void SLang_flush_input (void);</div><div class='add'>+extern int SLang_input_pending (int);</div><div class='add'>+extern int SLang_Abort_Char;</div><div class='add'>+/* The value of the character (0-255) used to trigger SIGINT */</div><div class='add'>+extern int SLang_Ignore_User_Abort;</div><div class='add'>+/* If non-zero, pressing the abort character will not result in USER_BREAK</div><div class='add'>+ * SLang_Error. */</div><div class='add'>+</div><div class='add'>+extern int SLang_set_abort_signal (void (*)(int));</div><div class='add'>+/* If SIGINT is generated, the function p1 will be called.  If p1 is NULL</div><div class='add'>+ * the SLang_default signal handler is called.  This sets SLang_Error to</div><div class='add'>+ * USER_BREAK.  I suspect most users will simply want to pass NULL.</div><div class='add'>+ */</div><div class='add'>+extern unsigned int SLang_Input_Buffer_Len;</div><div class='add'>+</div><div class='add'>+extern volatile int SLKeyBoard_Quit;</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+/* If this function returns -1, ^Y will be added to input buffer. */</div><div class='add'>+extern int (*SLtty_VMS_Ctrl_Y_Hook) (void);</div><div class='add'>+#endif</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Keymap routines */</div><div class='add'>+</div><div class='add'>+typedef struct SLKeymap_Function_Type</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   int (*f)(void);</div><div class='add'>+}</div><div class='add'>+SLKeymap_Function_Type;</div><div class='add'>+</div><div class='add'>+#define SLANG_MAX_KEYMAP_KEY_SEQ	14</div><div class='add'>+typedef struct SLang_Key_Type</div><div class='add'>+{</div><div class='add'>+   struct SLang_Key_Type *next;</div><div class='add'>+   union</div><div class='add'>+     {</div><div class='add'>+	char *s;</div><div class='add'>+	FVOID_STAR f;</div><div class='add'>+	unsigned int keysym;</div><div class='add'>+     }</div><div class='add'>+     f;</div><div class='add'>+   unsigned char type;	       /* type of function */</div><div class='add'>+#define SLKEY_F_INTERPRET	0x01</div><div class='add'>+#define SLKEY_F_INTRINSIC	0x02</div><div class='add'>+#define SLKEY_F_KEYSYM		0x03</div><div class='add'>+   unsigned char str[SLANG_MAX_KEYMAP_KEY_SEQ + 1];/* key sequence */</div><div class='add'>+}</div><div class='add'>+SLang_Key_Type;</div><div class='add'>+</div><div class='add'>+typedef struct SLKeyMap_List_Type</div><div class='add'>+{</div><div class='add'>+   char *name;			       /* hashed string */</div><div class='add'>+   SLang_Key_Type *keymap;</div><div class='add'>+   SLKeymap_Function_Type *functions;  /* intrinsic functions */</div><div class='add'>+}</div><div class='add'>+SLKeyMap_List_Type;</div><div class='add'>+</div><div class='add'>+/* This is arbitrary but I have got to start somewhere */</div><div class='add'>+#define SLANG_MAX_KEYMAPS 30</div><div class='add'>+extern SLKeyMap_List_Type SLKeyMap_List[SLANG_MAX_KEYMAPS];</div><div class='add'>+</div><div class='add'>+extern char *SLang_process_keystring(char *);</div><div class='add'>+</div><div class='add'>+extern int SLkm_define_key (char *, FVOID_STAR, SLKeyMap_List_Type *);</div><div class='add'>+</div><div class='add'>+extern int SLang_define_key(char *, char *, SLKeyMap_List_Type *);</div><div class='add'>+/* Like define_key1 except that p2 is a string that is to be associated with</div><div class='add'>+ * a function in the functions field of p3.  This routine calls define_key1.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+extern int SLkm_define_keysym (char *, unsigned int, SLKeyMap_List_Type *);</div><div class='add'>+</div><div class='add'>+extern void SLang_undefine_key(char *, SLKeyMap_List_Type *);</div><div class='add'>+</div><div class='add'>+extern SLKeyMap_List_Type *SLang_create_keymap(char *, SLKeyMap_List_Type *);</div><div class='add'>+/* create and returns a pointer to a new keymap named p1 created by copying</div><div class='add'>+ * keymap p2.  If p2 is NULL, it is up to the calling routine to initialize</div><div class='add'>+ * the keymap.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+extern char *SLang_make_keystring(unsigned char *);</div><div class='add'>+</div><div class='add'>+extern SLang_Key_Type *SLang_do_key(SLKeyMap_List_Type *, int (*)(void));</div><div class='add'>+/* read a key using keymap p1 with getkey function p2 */</div><div class='add'>+</div><div class='add'>+extern</div><div class='add'>+     FVOID_STAR</div><div class='add'>+     SLang_find_key_function(char *, SLKeyMap_List_Type *);</div><div class='add'>+</div><div class='add'>+extern SLKeyMap_List_Type *SLang_find_keymap(char *);</div><div class='add'>+</div><div class='add'>+extern int SLang_Last_Key_Char;</div><div class='add'>+extern int SLang_Key_TimeOut_Flag;</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Readline Interface */</div><div class='add'>+</div><div class='add'>+typedef struct SLang_Read_Line_Type</div><div class='add'>+{</div><div class='add'>+   struct SLang_Read_Line_Type *prev, *next;</div><div class='add'>+   unsigned char *buf;</div><div class='add'>+   int buf_len;			       /* number of chars in the buffer */</div><div class='add'>+   int num;			       /* num and misc are application specific*/</div><div class='add'>+   int misc;</div><div class='add'>+} SLang_Read_Line_Type;</div><div class='add'>+</div><div class='add'>+/* Maximum size of display */</div><div class='add'>+#define SLRL_DISPLAY_BUFFER_SIZE 256</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   SLang_Read_Line_Type *root, *tail, *last;</div><div class='add'>+   unsigned char *buf;		       /* edit buffer */</div><div class='add'>+   int buf_len;			       /* sizeof buffer */</div><div class='add'>+   int point;			       /* current editing point */</div><div class='add'>+   int tab;			       /* tab width */</div><div class='add'>+   int len;			       /* current line size */</div><div class='add'>+</div><div class='add'>+   /* display variables */</div><div class='add'>+   int edit_width;		       /* length of display field */</div><div class='add'>+   int curs_pos;			       /* current column */</div><div class='add'>+   int start_column;		       /* column offset of display */</div><div class='add'>+   int dhscroll;		       /* amount to use for horiz scroll */</div><div class='add'>+   char *prompt;</div><div class='add'>+</div><div class='add'>+   FVOID_STAR last_fun;		       /* last function executed by rl */</div><div class='add'>+</div><div class='add'>+   /* These two contain an image of what is on the display */</div><div class='add'>+   unsigned char upd_buf1[SLRL_DISPLAY_BUFFER_SIZE];</div><div class='add'>+   unsigned char upd_buf2[SLRL_DISPLAY_BUFFER_SIZE];</div><div class='add'>+   unsigned char *old_upd, *new_upd;   /* pointers to previous two buffers */</div><div class='add'>+   int new_upd_len, old_upd_len;       /* length of output buffers */</div><div class='add'>+</div><div class='add'>+   SLKeyMap_List_Type *keymap;</div><div class='add'>+</div><div class='add'>+   /* tty variables */</div><div class='add'>+   unsigned int flags;		       /*  */</div><div class='add'>+#define SL_RLINE_NO_ECHO	1</div><div class='add'>+#define SL_RLINE_USE_ANSI	2</div><div class='add'>+#define SL_RLINE_BLINK_MATCH	4</div><div class='add'>+   unsigned int (*getkey)(void);       /* getkey function -- required */</div><div class='add'>+   void (*tt_goto_column)(int);</div><div class='add'>+   void (*tt_insert)(char);</div><div class='add'>+   void (*update_hook)(unsigned char *, int, int);</div><div class='add'>+   /* The update hook is called with a pointer to a buffer p1 that contains</div><div class='add'>+    * an image of what the update hook is suppoed to produce.  The length</div><div class='add'>+    * of the buffer is p2 and after the update, the cursor is to be placed</div><div class='add'>+    * in column p3.</div><div class='add'>+    */</div><div class='add'>+   /* This function is only called when blinking matches */</div><div class='add'>+   int (*input_pending)(int);</div><div class='add'>+   unsigned long reserved[4];</div><div class='add'>+} SLang_RLine_Info_Type;</div><div class='add'>+</div><div class='add'>+extern int SLang_RL_EOF_Char;</div><div class='add'>+</div><div class='add'>+extern SLang_Read_Line_Type * SLang_rline_save_line (SLang_RLine_Info_Type *);</div><div class='add'>+extern int SLang_init_readline (SLang_RLine_Info_Type *);</div><div class='add'>+extern int SLang_read_line (SLang_RLine_Info_Type *);</div><div class='add'>+extern int SLang_rline_insert (char *);</div><div class='add'>+extern void SLrline_redraw (SLang_RLine_Info_Type *);</div><div class='add'>+extern int SLang_Rline_Quit;</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Low Level Screen Output Interface */</div><div class='add'>+</div><div class='add'>+extern unsigned long SLtt_Num_Chars_Output;</div><div class='add'>+extern int SLtt_Baud_Rate;</div><div class='add'>+</div><div class='add'>+typedef unsigned long SLtt_Char_Type;</div><div class='add'>+</div><div class='add'>+#define SLTT_BOLD_MASK	0x01000000UL</div><div class='add'>+#define SLTT_BLINK_MASK	0x02000000UL</div><div class='add'>+#define SLTT_ULINE_MASK	0x04000000UL</div><div class='add'>+#define SLTT_REV_MASK	0x08000000UL</div><div class='add'>+#define SLTT_ALTC_MASK  0x10000000UL</div><div class='add'>+</div><div class='add'>+extern int SLtt_Screen_Rows;</div><div class='add'>+extern int SLtt_Screen_Cols;</div><div class='add'>+extern int SLtt_Term_Cannot_Insert;</div><div class='add'>+extern int SLtt_Term_Cannot_Scroll;</div><div class='add'>+extern int SLtt_Use_Ansi_Colors;</div><div class='add'>+extern int SLtt_Ignore_Beep;</div><div class='add'>+#if defined(REAL_UNIX_SYSTEM)</div><div class='add'>+extern int SLtt_Force_Keypad_Init;</div><div class='add'>+extern int SLang_TT_Write_FD;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+extern char *SLtt_Graphics_Char_Pairs;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef __GO32__</div><div class='add'>+#if defined(VMS) || defined(REAL_UNIX_SYSTEM)</div><div class='add'>+extern int SLtt_Blink_Mode;</div><div class='add'>+extern int SLtt_Use_Blink_For_ACS;</div><div class='add'>+extern int SLtt_Newline_Ok;</div><div class='add'>+extern int SLtt_Has_Alt_Charset;</div><div class='add'>+extern int SLtt_Has_Status_Line;       /* if 0, NO.  If &gt; 0, YES, IF -1, ?? */</div><div class='add'>+# ifndef VMS</div><div class='add'>+extern int SLtt_Try_Termcap;</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(IBMPC_SYSTEM)</div><div class='add'>+extern int SLtt_Msdos_Cheap_Video;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef unsigned short SLsmg_Char_Type;</div><div class='add'>+#define SLSMG_EXTRACT_CHAR(x) ((x) &amp; 0xFF)</div><div class='add'>+#define SLSMG_EXTRACT_COLOR(x) (((x)&gt;&gt;8)&amp;0xFF)</div><div class='add'>+#define SLSMG_BUILD_CHAR(ch,color) (((SLsmg_Char_Type)(unsigned char)(ch))|((color)&lt;&lt;8))</div><div class='add'>+</div><div class='add'>+extern int SLtt_flush_output (void);</div><div class='add'>+extern void SLtt_set_scroll_region(int, int);</div><div class='add'>+extern void SLtt_reset_scroll_region(void);</div><div class='add'>+extern void SLtt_reverse_video (int);</div><div class='add'>+extern void SLtt_bold_video (void);</div><div class='add'>+extern void SLtt_begin_insert(void);</div><div class='add'>+extern void SLtt_end_insert(void);</div><div class='add'>+extern void SLtt_del_eol(void);</div><div class='add'>+extern void SLtt_goto_rc (int, int);</div><div class='add'>+extern void SLtt_delete_nlines(int);</div><div class='add'>+extern void SLtt_delete_char(void);</div><div class='add'>+extern void SLtt_erase_line(void);</div><div class='add'>+extern void SLtt_normal_video(void);</div><div class='add'>+extern void SLtt_cls(void);</div><div class='add'>+extern void SLtt_beep(void);</div><div class='add'>+extern void SLtt_reverse_index(int);</div><div class='add'>+extern void SLtt_smart_puts(SLsmg_Char_Type *, SLsmg_Char_Type *, int, int);</div><div class='add'>+extern void SLtt_write_string (char *);</div><div class='add'>+extern void SLtt_putchar(char);</div><div class='add'>+extern int SLtt_init_video (void);</div><div class='add'>+extern int SLtt_reset_video (void);</div><div class='add'>+extern void SLtt_get_terminfo(void);</div><div class='add'>+extern void SLtt_get_screen_size (void);</div><div class='add'>+extern int SLtt_set_cursor_visibility (int);</div><div class='add'>+</div><div class='add'>+extern int SLtt_set_mouse_mode (int, int);</div><div class='add'>+</div><div class='add'>+#if defined(VMS) || defined(REAL_UNIX_SYSTEM)</div><div class='add'>+extern int SLtt_initialize (char *);</div><div class='add'>+extern void SLtt_enable_cursor_keys(void);</div><div class='add'>+extern void SLtt_set_term_vtxxx(int *);</div><div class='add'>+extern void SLtt_set_color_esc (int, char *);</div><div class='add'>+extern void SLtt_wide_width(void);</div><div class='add'>+extern void SLtt_narrow_width(void);</div><div class='add'>+extern void SLtt_set_alt_char_set (int);</div><div class='add'>+extern int SLtt_write_to_status_line (char *, int);</div><div class='add'>+extern void SLtt_disable_status_line (void);</div><div class='add'>+# ifdef REAL_UNIX_SYSTEM</div><div class='add'>+/* These are termcap/terminfo routines that assume SLtt_initialize has</div><div class='add'>+ * been called.</div><div class='add'>+ */</div><div class='add'>+extern char *SLtt_tgetstr (char *);</div><div class='add'>+extern int SLtt_tgetnum (char *);</div><div class='add'>+extern int SLtt_tgetflag (char *);</div><div class='add'>+</div><div class='add'>+/* The following are terminfo-only routines -- these prototypes will change</div><div class='add'>+ * in V2.x.</div><div class='add'>+ */</div><div class='add'>+extern char *SLtt_tigetent (char *);</div><div class='add'>+extern char *SLtt_tigetstr (char *, char **);</div><div class='add'>+extern int SLtt_tigetnum (char *, char **);</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern SLtt_Char_Type SLtt_get_color_object (int);</div><div class='add'>+extern void SLtt_set_color_object (int, SLtt_Char_Type);</div><div class='add'>+extern void SLtt_set_color (int, char *, char *, char *);</div><div class='add'>+extern void SLtt_set_mono (int, char *, SLtt_Char_Type);</div><div class='add'>+extern void SLtt_add_color_attribute (int, SLtt_Char_Type);</div><div class='add'>+extern void SLtt_set_color_fgbg (int, SLtt_Char_Type, SLtt_Char_Type);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Preprocessor Interface */</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   int this_level;</div><div class='add'>+   int exec_level;</div><div class='add'>+   int prev_exec_level;</div><div class='add'>+   char preprocess_char;</div><div class='add'>+   char comment_char;</div><div class='add'>+   unsigned char flags;</div><div class='add'>+#define SLPREP_BLANK_LINES_OK	1</div><div class='add'>+#define SLPREP_COMMENT_LINES_OK	2</div><div class='add'>+}</div><div class='add'>+SLPreprocess_Type;</div><div class='add'>+</div><div class='add'>+extern int SLprep_open_prep (SLPreprocess_Type *);</div><div class='add'>+extern void SLprep_close_prep (SLPreprocess_Type *);</div><div class='add'>+extern int SLprep_line_ok (char *, SLPreprocess_Type *);</div><div class='add'>+   extern int SLdefine_for_ifdef (char *);</div><div class='add'>+   /* Adds a string to the SLang #ifdef preparsing defines. SLang already</div><div class='add'>+      defines MSDOS, UNIX, and VMS on the appropriate system. */</div><div class='add'>+extern int (*SLprep_exists_hook) (char *, char);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLsmg Screen Management Functions */</div><div class='add'>+</div><div class='add'>+extern void SLsmg_fill_region (int, int, unsigned int, unsigned int, unsigned char);</div><div class='add'>+extern void SLsmg_set_char_set (int);</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+extern int SLsmg_Scroll_Hash_Border;</div><div class='add'>+#endif</div><div class='add'>+extern int SLsmg_suspend_smg (void);</div><div class='add'>+extern int SLsmg_resume_smg (void);</div><div class='add'>+extern void SLsmg_erase_eol (void);</div><div class='add'>+extern void SLsmg_gotorc (int, int);</div><div class='add'>+extern void SLsmg_erase_eos (void);</div><div class='add'>+extern void SLsmg_reverse_video (void);</div><div class='add'>+extern void SLsmg_set_color (int);</div><div class='add'>+extern void SLsmg_normal_video (void);</div><div class='add'>+extern void SLsmg_printf (char *, ...);</div><div class='add'>+extern void SLsmg_vprintf (char *, va_list);</div><div class='add'>+extern void SLsmg_write_string (char *);</div><div class='add'>+extern void SLsmg_write_nstring (char *, unsigned int);</div><div class='add'>+extern void SLsmg_write_char (char);</div><div class='add'>+extern void SLsmg_write_nchars (char *, unsigned int);</div><div class='add'>+extern void SLsmg_write_wrapped_string (char *, int, int, unsigned int, unsigned int, int);</div><div class='add'>+extern void SLsmg_cls (void);</div><div class='add'>+extern void SLsmg_refresh (void);</div><div class='add'>+extern void SLsmg_touch_lines (int, unsigned int);</div><div class='add'>+extern void SLsmg_touch_screen (void);</div><div class='add'>+extern int SLsmg_init_smg (void);</div><div class='add'>+extern int SLsmg_reinit_smg (void);</div><div class='add'>+extern void SLsmg_reset_smg (void);</div><div class='add'>+extern SLsmg_Char_Type SLsmg_char_at(void);</div><div class='add'>+extern void SLsmg_set_screen_start (int *, int *);</div><div class='add'>+extern void SLsmg_draw_hline (unsigned int);</div><div class='add'>+extern void SLsmg_draw_vline (int);</div><div class='add'>+extern void SLsmg_draw_object (int, int, unsigned char);</div><div class='add'>+extern void SLsmg_draw_box (int, int, unsigned int, unsigned int);</div><div class='add'>+extern int SLsmg_get_column(void);</div><div class='add'>+extern int SLsmg_get_row(void);</div><div class='add'>+extern void SLsmg_forward (int);</div><div class='add'>+extern void SLsmg_write_color_chars (SLsmg_Char_Type *, unsigned int);</div><div class='add'>+extern unsigned int SLsmg_read_raw (SLsmg_Char_Type *, unsigned int);</div><div class='add'>+extern unsigned int SLsmg_write_raw (SLsmg_Char_Type *, unsigned int);</div><div class='add'>+extern void SLsmg_set_color_in_region (int, int, int, unsigned int, unsigned int);</div><div class='add'>+extern int SLsmg_Display_Eight_Bit;</div><div class='add'>+extern int SLsmg_Tab_Width;</div><div class='add'>+</div><div class='add'>+#define SLSMG_NEWLINE_IGNORED	0      /* default */</div><div class='add'>+#define SLSMG_NEWLINE_MOVES	1      /* moves to next line, column 0 */</div><div class='add'>+#define SLSMG_NEWLINE_SCROLLS	2      /* moves but scrolls at bottom of screen */</div><div class='add'>+#define SLSMG_NEWLINE_PRINTABLE	3      /* prints as ^J */</div><div class='add'>+extern int SLsmg_Newline_Behavior;</div><div class='add'>+</div><div class='add'>+extern int SLsmg_Backspace_Moves;</div><div class='add'>+</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+# define SLSMG_HLINE_CHAR	0xC4</div><div class='add'>+# define SLSMG_VLINE_CHAR	0xB3</div><div class='add'>+# define SLSMG_ULCORN_CHAR	0xDA</div><div class='add'>+# define SLSMG_URCORN_CHAR	0xBF</div><div class='add'>+# define SLSMG_LLCORN_CHAR	0xC0</div><div class='add'>+# define SLSMG_LRCORN_CHAR	0xD9</div><div class='add'>+# define SLSMG_RTEE_CHAR	0xB4</div><div class='add'>+# define SLSMG_LTEE_CHAR	0xC3</div><div class='add'>+# define SLSMG_UTEE_CHAR	0xC2</div><div class='add'>+# define SLSMG_DTEE_CHAR	0xC1</div><div class='add'>+# define SLSMG_PLUS_CHAR	0xC5</div><div class='add'>+/* There are several to choose from: 0xB0, 0xB1, and 0xB2 */</div><div class='add'>+# define SLSMG_CKBRD_CHAR	0xB0</div><div class='add'>+# define SLSMG_DIAMOND_CHAR	0x04</div><div class='add'>+# define SLSMG_DEGREE_CHAR	0xF8</div><div class='add'>+# define SLSMG_PLMINUS_CHAR	0xF1</div><div class='add'>+# define SLSMG_BULLET_CHAR	0xF9</div><div class='add'>+# define SLSMG_LARROW_CHAR	0x1B</div><div class='add'>+# define SLSMG_RARROW_CHAR	0x1A</div><div class='add'>+# define SLSMG_DARROW_CHAR	0x19</div><div class='add'>+# define SLSMG_UARROW_CHAR	0x18</div><div class='add'>+# define SLSMG_BOARD_CHAR	0xB2</div><div class='add'>+# define SLSMG_BLOCK_CHAR	0xDB</div><div class='add'>+#else</div><div class='add'>+# if defined(AMIGA)</div><div class='add'>+#  define SLSMG_HLINE_CHAR	'-'</div><div class='add'>+#  define SLSMG_VLINE_CHAR	'|'</div><div class='add'>+#  define SLSMG_ULCORN_CHAR	'+'</div><div class='add'>+#  define SLSMG_URCORN_CHAR	'+'</div><div class='add'>+#  define SLSMG_LLCORN_CHAR	'+'</div><div class='add'>+#  define SLSMG_LRCORN_CHAR	'+'</div><div class='add'>+#  define SLSMG_CKBRD_CHAR	'#'</div><div class='add'>+#  define SLSMG_RTEE_CHAR	'+'</div><div class='add'>+#  define SLSMG_LTEE_CHAR	'+'</div><div class='add'>+#  define SLSMG_UTEE_CHAR	'+'</div><div class='add'>+#  define SLSMG_DTEE_CHAR	'+'</div><div class='add'>+#  define SLSMG_PLUS_CHAR	'+'</div><div class='add'>+#  define SLSMG_DIAMOND_CHAR	'+'</div><div class='add'>+#  define SLSMG_DEGREE_CHAR	'\\'</div><div class='add'>+#  define SLSMG_PLMINUS_CHAR	'#'</div><div class='add'>+#  define SLSMG_BULLET_CHAR	'o'</div><div class='add'>+#  define SLSMG_LARROW_CHAR	'&lt;'</div><div class='add'>+#  define SLSMG_RARROW_CHAR	'&gt;'</div><div class='add'>+#  define SLSMG_DARROW_CHAR	'v'</div><div class='add'>+#  define SLSMG_UARROW_CHAR	'^'</div><div class='add'>+#  define SLSMG_BOARD_CHAR	'#'</div><div class='add'>+#  define SLSMG_BLOCK_CHAR	'#'</div><div class='add'>+# else</div><div class='add'>+#  define SLSMG_HLINE_CHAR	'q'</div><div class='add'>+#  define SLSMG_VLINE_CHAR	'x'</div><div class='add'>+#  define SLSMG_ULCORN_CHAR	'l'</div><div class='add'>+#  define SLSMG_URCORN_CHAR	'k'</div><div class='add'>+#  define SLSMG_LLCORN_CHAR	'm'</div><div class='add'>+#  define SLSMG_LRCORN_CHAR	'j'</div><div class='add'>+#  define SLSMG_CKBRD_CHAR	'a'</div><div class='add'>+#  define SLSMG_RTEE_CHAR	'u'</div><div class='add'>+#  define SLSMG_LTEE_CHAR	't'</div><div class='add'>+#  define SLSMG_UTEE_CHAR	'w'</div><div class='add'>+#  define SLSMG_DTEE_CHAR	'v'</div><div class='add'>+#  define SLSMG_PLUS_CHAR	'n'</div><div class='add'>+#  define SLSMG_DIAMOND_CHAR	'`'</div><div class='add'>+#  define SLSMG_DEGREE_CHAR	'f'</div><div class='add'>+#  define SLSMG_PLMINUS_CHAR	'g'</div><div class='add'>+#  define SLSMG_BULLET_CHAR	'~'</div><div class='add'>+#  define SLSMG_LARROW_CHAR	','</div><div class='add'>+#  define SLSMG_RARROW_CHAR	'+'</div><div class='add'>+#  define SLSMG_DARROW_CHAR	'.'</div><div class='add'>+#  define SLSMG_UARROW_CHAR	'-'</div><div class='add'>+#  define SLSMG_BOARD_CHAR	'h'</div><div class='add'>+#  define SLSMG_BLOCK_CHAR	'0'</div><div class='add'>+# endif				       /* AMIGA */</div><div class='add'>+#endif				       /* IBMPC_SYSTEM */</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+# define SLSMG_COLOR_BLACK		0x000000</div><div class='add'>+# define SLSMG_COLOR_RED		0x000001</div><div class='add'>+# define SLSMG_COLOR_GREEN		0x000002</div><div class='add'>+# define SLSMG_COLOR_BROWN		0x000003</div><div class='add'>+# define SLSMG_COLOR_BLUE		0x000004</div><div class='add'>+# define SLSMG_COLOR_MAGENTA		0x000005</div><div class='add'>+# define SLSMG_COLOR_CYAN		0x000006</div><div class='add'>+# define SLSMG_COLOR_LGRAY		0x000007</div><div class='add'>+# define SLSMG_COLOR_GRAY		0x000008</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_RED		0x000009</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_GREEN	0x00000A</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_BROWN	0x00000B</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_BLUE	0x00000C</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_CYAN	0x00000D</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_MAGENTA	0x00000E</div><div class='add'>+# define SLSMG_COLOR_BRIGHT_WHITE	0x00000F</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   void (*tt_normal_video)(void);</div><div class='add'>+   void (*tt_set_scroll_region)(int, int);</div><div class='add'>+   void (*tt_goto_rc)(int, int);</div><div class='add'>+   void (*tt_reverse_index)(int);</div><div class='add'>+   void (*tt_reset_scroll_region)(void);</div><div class='add'>+   void (*tt_delete_nlines)(int);</div><div class='add'>+   void (*tt_cls) (void);</div><div class='add'>+   void (*tt_del_eol) (void);</div><div class='add'>+   void (*tt_smart_puts) (SLsmg_Char_Type *, SLsmg_Char_Type *, int, int);</div><div class='add'>+   int (*tt_flush_output) (void);</div><div class='add'>+   int (*tt_reset_video) (void);</div><div class='add'>+   int (*tt_init_video) (void);</div><div class='add'>+</div><div class='add'>+   int *tt_screen_rows;</div><div class='add'>+   int *tt_screen_cols;</div><div class='add'>+</div><div class='add'>+   int *tt_term_cannot_scroll;</div><div class='add'>+   int *tt_has_alt_charset;</div><div class='add'>+   int *tt_use_blink_for_acs;</div><div class='add'>+   char **tt_graphic_char_pairs;</div><div class='add'>+</div><div class='add'>+   long reserved[4];</div><div class='add'>+}</div><div class='add'>+SLsmg_Term_Type;</div><div class='add'>+extern void SLsmg_set_terminal_info (SLsmg_Term_Type *);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Keypad Interface */</div><div class='add'>+</div><div class='add'>+#define SL_KEY_ERR		0xFFFF</div><div class='add'>+</div><div class='add'>+#define SL_KEY_UP		0x101</div><div class='add'>+#define SL_KEY_DOWN		0x102</div><div class='add'>+#define SL_KEY_LEFT		0x103</div><div class='add'>+#define SL_KEY_RIGHT		0x104</div><div class='add'>+#define SL_KEY_PPAGE		0x105</div><div class='add'>+#define SL_KEY_NPAGE		0x106</div><div class='add'>+#define SL_KEY_HOME		0x107</div><div class='add'>+#define SL_KEY_END		0x108</div><div class='add'>+#define SL_KEY_A1		0x109</div><div class='add'>+#define SL_KEY_A3		0x10A</div><div class='add'>+#define SL_KEY_B2		0x10B</div><div class='add'>+#define SL_KEY_C1		0x10C</div><div class='add'>+#define SL_KEY_C3		0x10D</div><div class='add'>+#define SL_KEY_REDO		0x10E</div><div class='add'>+#define SL_KEY_UNDO		0x10F</div><div class='add'>+#define SL_KEY_BACKSPACE	0x110</div><div class='add'>+#define SL_KEY_ENTER		0x111</div><div class='add'>+#define SL_KEY_IC		0x112</div><div class='add'>+#define SL_KEY_DELETE		0x113</div><div class='add'>+</div><div class='add'>+#define SL_KEY_F0		0x200</div><div class='add'>+#define SL_KEY_F(X)		(SL_KEY_F0 + X)</div><div class='add'>+</div><div class='add'>+/* I do not intend to use keysymps &gt; 0x1000.  Applications can use those. */</div><div class='add'>+/* Returns 0 upon success or -1 upon error. */</div><div class='add'>+extern int SLkp_define_keysym (char *, unsigned int);</div><div class='add'>+</div><div class='add'>+/* This function must be called AFTER SLtt_get_terminfo and not before. */</div><div class='add'>+extern int SLkp_init (void);</div><div class='add'>+</div><div class='add'>+/* This function uses SLang_getkey and assumes that what ever initialization</div><div class='add'>+ * is required for SLang_getkey has been performed.</div><div class='add'>+ */</div><div class='add'>+extern int SLkp_getkey (void);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Scroll Interface */</div><div class='add'>+</div><div class='add'>+typedef struct _SLscroll_Type</div><div class='add'>+{</div><div class='add'>+   struct _SLscroll_Type *next;</div><div class='add'>+   struct _SLscroll_Type *prev;</div><div class='add'>+   unsigned int flags;</div><div class='add'>+}</div><div class='add'>+SLscroll_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   unsigned int flags;</div><div class='add'>+   SLscroll_Type *top_window_line;   /* list element at top of window */</div><div class='add'>+   SLscroll_Type *bot_window_line;   /* list element at bottom of window */</div><div class='add'>+   SLscroll_Type *current_line;    /* current list element */</div><div class='add'>+   SLscroll_Type *lines;	       /* first list element */</div><div class='add'>+   unsigned int nrows;		       /* number of rows in window */</div><div class='add'>+   unsigned int hidden_mask;	       /* applied to flags in SLscroll_Type */</div><div class='add'>+   unsigned int line_num;	       /* current line number (visible) */</div><div class='add'>+   unsigned int num_lines;	       /* total number of lines (visible) */</div><div class='add'>+   unsigned int window_row;	       /* row of current_line in window */</div><div class='add'>+   unsigned int border;		       /* number of rows that form scroll border */</div><div class='add'>+   int cannot_scroll;		       /* should window scroll or recenter */</div><div class='add'>+}</div><div class='add'>+SLscroll_Window_Type;</div><div class='add'>+</div><div class='add'>+extern int SLscroll_find_top (SLscroll_Window_Type *);</div><div class='add'>+extern int SLscroll_find_line_num (SLscroll_Window_Type *);</div><div class='add'>+extern unsigned int SLscroll_next_n (SLscroll_Window_Type *, unsigned int);</div><div class='add'>+extern unsigned int SLscroll_prev_n (SLscroll_Window_Type *, unsigned int);</div><div class='add'>+extern int SLscroll_pageup (SLscroll_Window_Type *);</div><div class='add'>+extern int SLscroll_pagedown (SLscroll_Window_Type *);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Signal Routines */</div><div class='add'>+</div><div class='add'>+typedef void SLSig_Fun_Type (int);</div><div class='add'>+extern SLSig_Fun_Type *SLsignal (int, SLSig_Fun_Type *);</div><div class='add'>+extern SLSig_Fun_Type *SLsignal_intr (int, SLSig_Fun_Type *);</div><div class='add'>+extern int SLsig_block_signals (void);</div><div class='add'>+extern int SLsig_unblock_signals (void);</div><div class='add'>+extern int SLsystem (char *);</div><div class='add'>+</div><div class='add'>+extern char *SLerrno_strerror (int);</div><div class='add'>+extern int SLerrno_set_errno (int);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Interpreter Macro Definitions */</div><div class='add'>+</div><div class='add'>+/* The definitions here are for objects that may be on the run-time stack.</div><div class='add'>+ * They are actually sub_types of literal and data main_types.  The actual</div><div class='add'>+ * numbers are historical.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_UNDEFINED_TYPE	0x00   /* MUST be 0 */</div><div class='add'>+#define SLANG_VOID_TYPE		0x01   /* also matches ANY type */</div><div class='add'>+#define SLANG_INT_TYPE 		0x02</div><div class='add'>+#define SLANG_DOUBLE_TYPE	0x03</div><div class='add'>+#define SLANG_CHAR_TYPE		0x04</div><div class='add'>+#define SLANG_INTP_TYPE		0x05</div><div class='add'>+/* An object of SLANG_INTP_TYPE should never really occur on the stack.  Rather,</div><div class='add'>+ * the integer to which it refers will be there instead.  It is defined here</div><div class='add'>+ * because it is a valid type for MAKE_VARIABLE.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_REF_TYPE		0x06</div><div class='add'>+/* SLANG_REF_TYPE refers to an object on the stack that is a pointer (reference)</div><div class='add'>+ * to some other object.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_COMPLEX_TYPE	0x07</div><div class='add'>+#define SLANG_NULL_TYPE		0x08</div><div class='add'>+#define SLANG_UCHAR_TYPE	0x09</div><div class='add'>+#define SLANG_SHORT_TYPE	0x0A</div><div class='add'>+#define SLANG_USHORT_TYPE	0x0B</div><div class='add'>+#define SLANG_UINT_TYPE		0x0C</div><div class='add'>+#define SLANG_LONG_TYPE		0x0D</div><div class='add'>+#define SLANG_ULONG_TYPE	0x0E</div><div class='add'>+#define SLANG_STRING_TYPE	0x0F</div><div class='add'>+#define SLANG_FLOAT_TYPE	0x10</div><div class='add'>+#define SLANG_STRUCT_TYPE	0x11</div><div class='add'>+#define SLANG_ISTRUCT_TYPE 	0x12</div><div class='add'>+#define SLANG_ARRAY_TYPE	0x20</div><div class='add'>+#define SLANG_DATATYPE_TYPE	0x21</div><div class='add'>+#define SLANG_FILE_PTR_TYPE	0x22</div><div class='add'>+#define SLANG_ASSOC_TYPE	0x23</div><div class='add'>+#define SLANG_ANY_TYPE		0x24</div><div class='add'>+#define SLANG_BSTRING_TYPE	0x25</div><div class='add'>+#define SLANG_FILE_FD_TYPE	0x26</div><div class='add'>+</div><div class='add'>+/* Compatibility */</div><div class='add'>+#ifdef FLOAT_TYPE</div><div class='add'>+# undef FLOAT_TYPE</div><div class='add'>+#endif</div><div class='add'>+#define VOID_TYPE SLANG_VOID_TYPE</div><div class='add'>+#define INT_TYPE SLANG_INT_TYPE</div><div class='add'>+#define INTP_TYPE SLANG_INTP_TYPE</div><div class='add'>+#define FLOAT_TYPE SLANG_DOUBLE_TYPE</div><div class='add'>+#define ARRAY_TYPE SLANG_ARRAY_TYPE</div><div class='add'>+#define CHAR_TYPE SLANG_CHAR_TYPE</div><div class='add'>+#define STRING_TYPE SLANG_STRING_TYPE</div><div class='add'>+</div><div class='add'>+/* I am reserving values greater than or equal to 128 for user applications.</div><div class='add'>+ * The first 127 are reserved for S-Lang.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Binary and Unary Subtypes */</div><div class='add'>+/* Since the application can define new types and can overload the binary</div><div class='add'>+ * and unary operators, these definitions must be present in this file.</div><div class='add'>+ * The current implementation assumes both unary and binary are distinct.</div><div class='add'>+ */</div><div class='add'>+#define SLANG_PLUS		0x01</div><div class='add'>+#define SLANG_MINUS		0x02</div><div class='add'>+#define SLANG_TIMES		0x03</div><div class='add'>+#define SLANG_DIVIDE		0x04</div><div class='add'>+#define SLANG_EQ		0x05</div><div class='add'>+#define SLANG_NE		0x06</div><div class='add'>+#define SLANG_GT		0x07</div><div class='add'>+#define SLANG_GE		0x08</div><div class='add'>+#define SLANG_LT		0x09</div><div class='add'>+#define SLANG_LE		0x0A</div><div class='add'>+#define SLANG_POW		0x0B</div><div class='add'>+#define SLANG_OR		0x0C</div><div class='add'>+#define SLANG_AND		0x0D</div><div class='add'>+#define SLANG_BAND		0x0E</div><div class='add'>+#define SLANG_BOR		0x0F</div><div class='add'>+#define SLANG_BXOR		0x10</div><div class='add'>+#define SLANG_SHL		0x11</div><div class='add'>+#define SLANG_SHR		0x12</div><div class='add'>+#define SLANG_MOD		0x13</div><div class='add'>+</div><div class='add'>+/* UNARY subtypes  (may be overloaded) */</div><div class='add'>+#define SLANG_PLUSPLUS		0x20</div><div class='add'>+#define SLANG_MINUSMINUS	0x21</div><div class='add'>+#define SLANG_ABS		0x22</div><div class='add'>+#define SLANG_SIGN		0x23</div><div class='add'>+#define SLANG_SQR		0x24</div><div class='add'>+#define SLANG_MUL2		0x25</div><div class='add'>+#define SLANG_CHS		0x26</div><div class='add'>+#define SLANG_NOT		0x27</div><div class='add'>+#define SLANG_BNOT		0x28</div><div class='add'>+</div><div class='add'>+extern char *SLang_Error_Message;</div><div class='add'>+</div><div class='add'>+int SLadd_intrinsic_variable (char *, VOID_STAR, unsigned char, int);</div><div class='add'>+int SLadd_intrinsic_function (char *, FVOID_STAR, unsigned char, unsigned int,...);</div><div class='add'>+</div><div class='add'>+int SLns_add_intrinsic_variable (SLang_NameSpace_Type *, char *, VOID_STAR, unsigned char, int);</div><div class='add'>+int SLns_add_intrinsic_function (SLang_NameSpace_Type *, char *, FVOID_STAR, unsigned char, unsigned int,...);</div><div class='add'>+</div><div class='add'>+extern void SLadd_at_handler (long *, char *);</div><div class='add'>+</div><div class='add'>+#define MAKE_INTRINSIC_N(n,f,out,in,a1,a2,a3,a4,a5,a6,a7) \</div><div class='add'>+    {(n), NULL, SLANG_INTRINSIC, (FVOID_STAR) (f), \</div><div class='add'>+      {a1,a2,a3,a4,a5,a6,a7}, (in), (out)}</div><div class='add'>+</div><div class='add'>+#define MAKE_INTRINSIC_7(n,f,out,a1,a2,a3,a4,a5,a6,a7) \</div><div class='add'>+    MAKE_INTRINSIC_N(n,f,out,7,a1,a2,a3,a4,a5,a6,a7)</div><div class='add'>+#define MAKE_INTRINSIC_6(n,f,out,a1,a2,a3,a4,a5,a6) \</div><div class='add'>+    MAKE_INTRINSIC_N(n,f,out,6,a1,a2,a3,a4,a5,a6,0)</div><div class='add'>+#define MAKE_INTRINSIC_5(n,f,out,a1,a2,a3,a4,a5) \</div><div class='add'>+    MAKE_INTRINSIC_N(n,f,out,5,a1,a2,a3,a4,a5,0,0)</div><div class='add'>+#define MAKE_INTRINSIC_4(n,f,out,a1,a2,a3,a4) \</div><div class='add'>+    MAKE_INTRINSIC_N(n,f,out,4,a1,a2,a3,a4,0,0,0)</div><div class='add'>+#define MAKE_INTRINSIC_3(n,f,out,a1,a2,a3) \</div><div class='add'>+    MAKE_INTRINSIC_N(n,f,out,3,a1,a2,a3,0,0,0,0)</div><div class='add'>+#define MAKE_INTRINSIC_2(n,f,out,a1,a2) \</div><div class='add'>+    MAKE_INTRINSIC_N(n,f,out,2,a1,a2,0,0,0,0,0)</div><div class='add'>+#define MAKE_INTRINSIC_1(n,f,out,a1) \</div><div class='add'>+    MAKE_INTRINSIC_N(n,f,out,1,a1,0,0,0,0,0,0)</div><div class='add'>+#define MAKE_INTRINSIC_0(n,f,out) \</div><div class='add'>+    MAKE_INTRINSIC_N(n,f,out,0,0,0,0,0,0,0,0)</div><div class='add'>+</div><div class='add'>+#define MAKE_INTRINSIC_S(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_1(n,f,r,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_I(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_1(n,f,r,SLANG_INT_TYPE)</div><div class='add'>+</div><div class='add'>+#define MAKE_INTRINSIC_SS(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_2(n,f,r,SLANG_STRING_TYPE,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_SI(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_2(n,f,r,SLANG_STRING_TYPE,SLANG_INT_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_IS(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_2(n,f,r,SLANG_INT_TYPE,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_II(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_2(n,f,r,SLANG_INT_TYPE,SLANG_INT_TYPE)</div><div class='add'>+</div><div class='add'>+#define MAKE_INTRINSIC_SSS(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_STRING_TYPE,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_SSI(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_STRING_TYPE,SLANG_INT_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_SIS(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_INT_TYPE,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_SII(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_INT_TYPE,SLANG_INT_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_ISS(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_STRING_TYPE,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_ISI(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_STRING_TYPE,SLANG_INT_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_IIS(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_INT_TYPE,SLANG_STRING_TYPE)</div><div class='add'>+#define MAKE_INTRINSIC_III(n,f,r) \</div><div class='add'>+   MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_INT_TYPE,SLANG_INT_TYPE)</div><div class='add'>+</div><div class='add'>+#define MAKE_INTRINSIC(n, f, out, in) \</div><div class='add'>+    MAKE_INTRINSIC_N(n,f,out,in,0,0,0,0,0,0,0)</div><div class='add'>+</div><div class='add'>+#define MAKE_VARIABLE(n, v, t, r)     \</div><div class='add'>+    {n, NULL, SLANG_IVARIABLE + (r), (VOID_STAR)(v), (t)}</div><div class='add'>+</div><div class='add'>+#define MAKE_APP_UNARY(n,op) \</div><div class='add'>+    {(n), NULL, SLANG_APP_UNARY, (op)}</div><div class='add'>+</div><div class='add'>+#define MAKE_MATH_UNARY(n,op) \</div><div class='add'>+    {(n), NULL, SLANG_MATH_UNARY, (op)}</div><div class='add'>+</div><div class='add'>+#define MAKE_ICONSTANT(n,val) \</div><div class='add'>+    {(n),NULL, SLANG_ICONSTANT, (val)}</div><div class='add'>+</div><div class='add'>+#define MAKE_DCONSTANT(n,val) \</div><div class='add'>+    {(n),NULL, SLANG_DCONSTANT, (val)}</div><div class='add'>+</div><div class='add'>+#ifndef offsetof</div><div class='add'>+# define offsetof(T,F) ((unsigned int)((char *)&amp;((T *)0L)-&gt;F - (char *)0L))</div><div class='add'>+#endif</div><div class='add'>+#define MAKE_ISTRUCT_FIELD(s,f,n,t,r) {(n), offsetof(s,f), (t), (r)}</div><div class='add'>+</div><div class='add'>+#define SLANG_END_TABLE {NULL}</div><div class='add'>+#define SLANG_END_INTRIN_FUN_TABLE MAKE_INTRINSIC_0(NULL,NULL,0)</div><div class='add'>+#define SLANG_END_DCONST_TABLE MAKE_DCONSTANT(NULL,0)</div><div class='add'>+#define SLANG_END_MATH_UNARY_TABLE MAKE_MATH_UNARY(NULL,0)</div><div class='add'>+#define SLANG_END_INTRIN_VAR_TABLE MAKE_VARIABLE(NULL,NULL,0,0)</div><div class='add'>+#define SLANG_END_ICONST_TABLE MAKE_ICONSTANT(NULL,0)</div><div class='add'>+#define SLANG_END_ISTRUCT_TABLE {NULL, 0, 0, 0}</div><div class='add'>+</div><div class='add'>+   </div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Upper/Lowercase Functions */</div><div class='add'>+</div><div class='add'>+extern void SLang_define_case(int *, int *);</div><div class='add'>+extern void SLang_init_case_tables (void);</div><div class='add'>+</div><div class='add'>+extern unsigned char _SLChg_UCase_Lut[256];</div><div class='add'>+extern unsigned char _SLChg_LCase_Lut[256];</div><div class='add'>+#define UPPER_CASE(x) (_SLChg_UCase_Lut[(unsigned char) (x)])</div><div class='add'>+#define LOWER_CASE(x) (_SLChg_LCase_Lut[(unsigned char) (x)])</div><div class='add'>+#define CHANGE_CASE(x) (((x) == _SLChg_LCase_Lut[(unsigned char) (x)]) ?\</div><div class='add'>+			_SLChg_UCase_Lut[(unsigned char) (x)] : _SLChg_LCase_Lut[(unsigned char) (x)])</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ Regular Expression Interface */</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   /* These must be set by calling routine. */</div><div class='add'>+   unsigned char *pat;		       /* regular expression pattern */</div><div class='add'>+   unsigned char *buf;		       /* buffer for compiled regexp */</div><div class='add'>+   unsigned int buf_len;	       /* length of buffer */</div><div class='add'>+   int case_sensitive;		       /* 1 if match is case sensitive  */</div><div class='add'>+</div><div class='add'>+   /* The rest are set by SLang_regexp_compile */</div><div class='add'>+</div><div class='add'>+   int must_match;		       /* 1 if line must contain substring */</div><div class='add'>+   int must_match_bol;		       /* true if it must match beginning of line */</div><div class='add'>+   unsigned char must_match_str[16];   /* 15 char null term substring */</div><div class='add'>+   int osearch;			       /* 1 if ordinary search suffices */</div><div class='add'>+   unsigned int min_length;	       /* minimum length the match must be */</div><div class='add'>+   int beg_matches[10];		       /* offset of start of \( */</div><div class='add'>+   unsigned int end_matches[10];       /* length of nth submatch</div><div class='add'>+					* Note that the entire match corresponds</div><div class='add'>+					* to \0</div><div class='add'>+					*/</div><div class='add'>+   int offset;			       /* offset to be added to beg_matches */</div><div class='add'>+   int reserved[10];</div><div class='add'>+} SLRegexp_Type;</div><div class='add'>+</div><div class='add'>+extern unsigned char *SLang_regexp_match(unsigned char *,</div><div class='add'>+					 unsigned int,</div><div class='add'>+					 SLRegexp_Type *);</div><div class='add'>+</div><div class='add'>+/* Returns 0 upon success.  If failure, the offset into the</div><div class='add'>+ * pattern is returned (start = 1).</div><div class='add'>+ */</div><div class='add'>+extern int SLang_regexp_compile (SLRegexp_Type *);</div><div class='add'>+extern char *SLregexp_quote_string (char *, char *, unsigned int);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Command Interface */</div><div class='add'>+</div><div class='add'>+struct _SLcmd_Cmd_Type; /* Pre-declaration is needed below */</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   struct _SLcmd_Cmd_Type *table;</div><div class='add'>+   int argc;</div><div class='add'>+   /* Version 2.0 needs to use a union!! */</div><div class='add'>+   char **string_args;</div><div class='add'>+   int *int_args;</div><div class='add'>+   double *double_args;</div><div class='add'>+   unsigned char *arg_type;</div><div class='add'>+   unsigned long reserved[4];</div><div class='add'>+} SLcmd_Cmd_Table_Type;</div><div class='add'>+</div><div class='add'>+typedef struct _SLcmd_Cmd_Type</div><div class='add'>+{</div><div class='add'>+   int (*cmdfun)(int, SLcmd_Cmd_Table_Type *);</div><div class='add'>+   char *cmd;</div><div class='add'>+   char *arg_type;</div><div class='add'>+} SLcmd_Cmd_Type;</div><div class='add'>+</div><div class='add'>+extern int SLcmd_execute_string (char *, SLcmd_Cmd_Table_Type *);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Search Interface */</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   int cs;			       /* case sensitive */</div><div class='add'>+   unsigned char key[256];</div><div class='add'>+   int ind[256];</div><div class='add'>+   int key_len;</div><div class='add'>+   int dir;</div><div class='add'>+} SLsearch_Type;</div><div class='add'>+</div><div class='add'>+extern int SLsearch_init (char *, int, int, SLsearch_Type *);</div><div class='add'>+/* This routine must first be called before any search can take place.</div><div class='add'>+ * The second parameter specifies the direction of the search: greater than</div><div class='add'>+ * zero for a forwrd search and less than zero for a backward search.  The</div><div class='add'>+ * third parameter specifies whether the search is case sensitive or not.</div><div class='add'>+ * The last parameter is a pointer to a structure that is filled by this</div><div class='add'>+ * function and it is this structure that must be passed to SLsearch.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+extern unsigned char *SLsearch (unsigned char *, unsigned char *, SLsearch_Type *);</div><div class='add'>+/* To use this routine, you must first call 'SLsearch_init'.  Then the first</div><div class='add'>+ * two parameters p1 and p2 serve to define the region over which the search</div><div class='add'>+ * is to take place.  The third parameter is the structure that was previously</div><div class='add'>+ * initialized by SLsearch_init.</div><div class='add'>+ *</div><div class='add'>+ * The routine returns a pointer to the match if found otherwise it returns</div><div class='add'>+ * NULL.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLang Pathname Interface */</div><div class='add'>+</div><div class='add'>+/* These function return pointers to the original space */</div><div class='add'>+extern char *SLpath_basename (char *);</div><div class='add'>+extern char *SLpath_extname (char *);</div><div class='add'>+extern int SLpath_is_absolute_path (char *);</div><div class='add'>+</div><div class='add'>+/* These return malloced strings--- NOT slstrings */</div><div class='add'>+extern char *SLpath_dircat (char *, char *);</div><div class='add'>+extern char *SLpath_find_file_in_path (char *, char *);</div><div class='add'>+extern char *SLpath_dirname (char *);</div><div class='add'>+extern int SLpath_file_exists (char *);</div><div class='add'>+extern char *SLpath_pathname_sans_extname (char *);</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+extern int SLang_set_module_load_path (char *);</div><div class='add'>+</div><div class='add'>+#define SLANG_MODULE(name) \</div><div class='add'>+   extern int init_##name##_module_ns (char *); \</div><div class='add'>+   extern void deinit_##name##_module (void)</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+{</div><div class='add'>+#endif</div><div class='add'>+#ifdef __cplusplus</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif  /* _DAVIS_SLANG_H_ */</div><div class='head'>diff --git a/mdk-stage1/slang/slarith.c b/mdk-stage1/slang/slarith.c<br/>new file mode 100644<br/>index 000000000..07ad68687<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slarith.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarith.c</a></div><div class='hunk'>@@ -0,0 +1,1656 @@</div><div class='add'>+</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include &lt;math.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_LOCALE_H</div><div class='add'>+# include &lt;locale.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * This file defines binary and unary operations on all integer types.</div><div class='add'>+ * Supported types include:</div><div class='add'>+ *</div><div class='add'>+ *    SLANG_CHAR_TYPE     (char)</div><div class='add'>+ *    SLANG_SHORT_TYPE    (short)</div><div class='add'>+ *    SLANG_INT_TYPE      (int)</div><div class='add'>+ *    SLANG_LONG_TYPE     (long)</div><div class='add'>+ *    SLANG_FLOAT_TYPE    (float)</div><div class='add'>+ *    SLANG_DOUBLE_TYPE   (double)</div><div class='add'>+ *</div><div class='add'>+ * as well as unsigned types.  The result-type of an arithmentic operation</div><div class='add'>+ * will depend upon the data types involved.  I am going to distinguish</div><div class='add'>+ * between the boolean operations such as `and' and `or' from the arithmetic</div><div class='add'>+ * operations such as `plus'.  Since the result of a boolean operation is</div><div class='add'>+ * either 1 or 0, a boolean result will be represented by SLANG_CHAR_TYPE.</div><div class='add'>+ * Ordinarily I would use an integer but for arrays it makes more sense to</div><div class='add'>+ * use a character data type.</div><div class='add'>+ *</div><div class='add'>+ * So, the following will be assumed (`+' is any arithmetic operator)</div><div class='add'>+ *</div><div class='add'>+ *    char + char = int</div><div class='add'>+ *    char|short + short = int</div><div class='add'>+ *    char|short|int + int = int</div><div class='add'>+ *    char|short|int|long + long = long</div><div class='add'>+ *    char|short|int|long|float + float = float</div><div class='add'>+ *    char|short|int|long|float|double + double = double</div><div class='add'>+ *</div><div class='add'>+ * In the actual implementation, a brute force approach is avoided.  Such</div><div class='add'>+ * an approach would mean defining different functions for all possible</div><div class='add'>+ * combinations of types.  Including the unsigned types, and not including</div><div class='add'>+ * the complex number type, there are 10 arithmetic types and 10*10=100</div><div class='add'>+ * different combinations of types.  Clearly this would be too much.</div><div class='add'>+ *</div><div class='add'>+ * One approach would be to define binary functions only between operands of</div><div class='add'>+ * the same type and then convert types as appropriate.  This would require</div><div class='add'>+ * just 6 such functions (int, uint, long, ulong, float, double).</div><div class='add'>+ * However, many conversion functions are going to be required, particularly</div><div class='add'>+ * since we are going to allow typecasting from one arithmetic to another.</div><div class='add'>+ * Since the bit pattern of signed and unsigned types are the same, and only</div><div class='add'>+ * the interpretation differs, there will be no functions to convert between</div><div class='add'>+ * signed and unsigned forms of a given type.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define MAX_ARITHMETIC_TYPES	10</div><div class='add'>+</div><div class='add'>+unsigned char _SLarith_Is_Arith_Type [256];</div><div class='add'>+</div><div class='add'>+unsigned char _SLarith_Arith_Types[] =</div><div class='add'>+{</div><div class='add'>+   SLANG_CHAR_TYPE,</div><div class='add'>+   SLANG_UCHAR_TYPE,</div><div class='add'>+   SLANG_SHORT_TYPE,</div><div class='add'>+   SLANG_USHORT_TYPE,</div><div class='add'>+   SLANG_INT_TYPE,</div><div class='add'>+   SLANG_UINT_TYPE,</div><div class='add'>+   SLANG_LONG_TYPE,</div><div class='add'>+   SLANG_ULONG_TYPE,</div><div class='add'>+   SLANG_FLOAT_TYPE,</div><div class='add'>+   SLANG_DOUBLE_TYPE,</div><div class='add'>+   0</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* Here are a bunch of functions to convert from one type to another.  To</div><div class='add'>+ * facilitate the process, a macros will be used.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define DEFUN_1(f,from_type,to_type) \</div><div class='add'>+static void f (to_type *y, from_type *x, unsigned int n) \</div><div class='add'>+{ \</div><div class='add'>+   unsigned int i; \</div><div class='add'>+   for (i = 0; i &lt; n; i++) y[i] = (to_type) x[i]; \</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define DEFUN_2(f,from_type,to_type,copy_fun) \</div><div class='add'>+static VOID_STAR f (VOID_STAR xp, unsigned int n) \</div><div class='add'>+{ \</div><div class='add'>+   from_type *x; \</div><div class='add'>+   to_type *y; \</div><div class='add'>+   x = (from_type *) xp; \</div><div class='add'>+   if (NULL == (y = (to_type *) SLmalloc (sizeof (to_type) * n))) return NULL; \</div><div class='add'>+   copy_fun (y, x, n); \</div><div class='add'>+   return (VOID_STAR) y; \</div><div class='add'>+}</div><div class='add'>+typedef VOID_STAR (*Convert_Fun_Type)(VOID_STAR, unsigned int);</div><div class='add'>+</div><div class='add'>+DEFUN_1(copy_char_to_char,char,char)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_1(copy_char_to_short,char,short)</div><div class='add'>+DEFUN_1(copy_char_to_ushort,char,unsigned short)</div><div class='add'>+#else</div><div class='add'>+# define copy_char_to_short	copy_char_to_int</div><div class='add'>+# define copy_char_to_ushort	copy_char_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_char_to_int,char,int)</div><div class='add'>+DEFUN_1(copy_char_to_uint,char,unsigned int)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_1(copy_char_to_long,char,long)</div><div class='add'>+DEFUN_1(copy_char_to_ulong,char,unsigned long)</div><div class='add'>+#else</div><div class='add'>+# define copy_char_to_long	copy_char_to_int</div><div class='add'>+# define copy_char_to_ulong	copy_char_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_char_to_float,char,float)</div><div class='add'>+DEFUN_1(copy_char_to_double,char,double)</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_1(copy_uchar_to_short,unsigned char,short)</div><div class='add'>+DEFUN_1(copy_uchar_to_ushort,unsigned char,unsigned short)</div><div class='add'>+#else</div><div class='add'>+# define copy_uchar_to_short	copy_uchar_to_int</div><div class='add'>+# define copy_uchar_to_ushort	copy_uchar_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_uchar_to_int,unsigned char,int)</div><div class='add'>+DEFUN_1(copy_uchar_to_uint,unsigned char,unsigned int)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_1(copy_uchar_to_long,unsigned char,long)</div><div class='add'>+DEFUN_1(copy_uchar_to_ulong,unsigned char,unsigned long)</div><div class='add'>+#else</div><div class='add'>+# define copy_uchar_to_long	copy_uchar_to_int</div><div class='add'>+# define copy_uchar_to_ulong	copy_uchar_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_uchar_to_float,unsigned char,float)</div><div class='add'>+DEFUN_1(copy_uchar_to_double,unsigned char,double)</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_1(copy_short_to_char,short,char)</div><div class='add'>+DEFUN_1(copy_short_to_uchar,short,unsigned char)</div><div class='add'>+DEFUN_1(copy_short_to_short,short,short)</div><div class='add'>+DEFUN_1(copy_short_to_int,short,int)</div><div class='add'>+DEFUN_1(copy_short_to_uint,short,unsigned int)</div><div class='add'>+DEFUN_1(copy_short_to_long,short,long)</div><div class='add'>+DEFUN_1(copy_short_to_ulong,short,unsigned long)</div><div class='add'>+DEFUN_1(copy_short_to_float,short,float)</div><div class='add'>+DEFUN_1(copy_short_to_double,short,double)</div><div class='add'>+DEFUN_1(copy_ushort_to_char,unsigned short,char)</div><div class='add'>+DEFUN_1(copy_ushort_to_uchar,unsigned short,unsigned char)</div><div class='add'>+DEFUN_1(copy_ushort_to_int,unsigned short,int)</div><div class='add'>+DEFUN_1(copy_ushort_to_uint,unsigned short,unsigned int)</div><div class='add'>+DEFUN_1(copy_ushort_to_long,unsigned short,long)</div><div class='add'>+DEFUN_1(copy_ushort_to_ulong,unsigned short,unsigned long)</div><div class='add'>+DEFUN_1(copy_ushort_to_float,unsigned short,float)</div><div class='add'>+DEFUN_1(copy_ushort_to_double,unsigned short,double)</div><div class='add'>+#else</div><div class='add'>+# define copy_short_to_char	copy_int_to_char</div><div class='add'>+# define copy_short_to_uchar	copy_int_to_uchar</div><div class='add'>+# define copy_short_to_short	copy_int_to_int</div><div class='add'>+# define copy_short_to_int	copy_int_to_int</div><div class='add'>+# define copy_short_to_uint	copy_int_to_int</div><div class='add'>+# define copy_short_to_long	copy_int_to_long</div><div class='add'>+# define copy_short_to_ulong	copy_int_to_ulong</div><div class='add'>+# define copy_short_to_float	copy_int_to_float</div><div class='add'>+# define copy_short_to_double	copy_int_to_double</div><div class='add'>+# define copy_ushort_to_char	copy_uint_to_char</div><div class='add'>+# define copy_ushort_to_uchar	copy_uint_to_uchar</div><div class='add'>+# define copy_ushort_to_int	copy_int_to_int</div><div class='add'>+# define copy_ushort_to_uint	copy_int_to_int</div><div class='add'>+# define copy_ushort_to_long	copy_uint_to_long</div><div class='add'>+# define copy_ushort_to_ulong	copy_uint_to_ulong</div><div class='add'>+# define copy_ushort_to_float	copy_uint_to_float</div><div class='add'>+# define copy_ushort_to_double	copy_uint_to_double</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+DEFUN_1(copy_int_to_char,int,char)</div><div class='add'>+DEFUN_1(copy_int_to_uchar,int,unsigned char)</div><div class='add'>+DEFUN_1(copy_uint_to_char,unsigned int,char)</div><div class='add'>+DEFUN_1(copy_uint_to_uchar,unsigned int,unsigned char)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_1(copy_int_to_short,int,short)</div><div class='add'>+DEFUN_1(copy_int_to_ushort,int,unsigned short)</div><div class='add'>+DEFUN_1(copy_uint_to_short,unsigned int,short)</div><div class='add'>+DEFUN_1(copy_uint_to_ushort,unsigned int,unsigned short)</div><div class='add'>+#else</div><div class='add'>+# define copy_int_to_short	copy_int_to_int</div><div class='add'>+# define copy_int_to_ushort	copy_int_to_int</div><div class='add'>+# define copy_uint_to_short	copy_int_to_int</div><div class='add'>+# define copy_uint_to_ushort	copy_int_to_int</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_int_to_int,int,int)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_1(copy_int_to_long,int,long)</div><div class='add'>+DEFUN_1(copy_int_to_ulong,int,unsigned long)</div><div class='add'>+DEFUN_1(copy_uint_to_long,unsigned int,long)</div><div class='add'>+DEFUN_1(copy_uint_to_ulong,unsigned int,unsigned long)</div><div class='add'>+#else</div><div class='add'>+# define copy_int_to_long	copy_int_to_int</div><div class='add'>+# define copy_int_to_ulong	copy_int_to_int</div><div class='add'>+# define copy_uint_to_long	copy_int_to_int</div><div class='add'>+# define copy_uint_to_ulong	copy_int_to_int</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_int_to_float,int,float)</div><div class='add'>+DEFUN_1(copy_int_to_double,int,double)</div><div class='add'>+DEFUN_1(copy_uint_to_float,unsigned int,float)</div><div class='add'>+DEFUN_1(copy_uint_to_double,unsigned int,double)</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_1(copy_long_to_char,long,char)</div><div class='add'>+DEFUN_1(copy_long_to_uchar,long,unsigned char)</div><div class='add'>+DEFUN_1(copy_long_to_short,long,short)</div><div class='add'>+DEFUN_1(copy_long_to_ushort,long,unsigned short)</div><div class='add'>+DEFUN_1(copy_long_to_int,long,int)</div><div class='add'>+DEFUN_1(copy_long_to_uint,long,unsigned int)</div><div class='add'>+DEFUN_1(copy_long_to_long,long,long)</div><div class='add'>+DEFUN_1(copy_long_to_float,long,float)</div><div class='add'>+DEFUN_1(copy_long_to_double,long,double)</div><div class='add'>+DEFUN_1(copy_ulong_to_char,unsigned long,char)</div><div class='add'>+DEFUN_1(copy_ulong_to_uchar,unsigned long,unsigned char)</div><div class='add'>+DEFUN_1(copy_ulong_to_short,unsigned long,short)</div><div class='add'>+DEFUN_1(copy_ulong_to_ushort,unsigned long,unsigned short)</div><div class='add'>+DEFUN_1(copy_ulong_to_int,unsigned long,int)</div><div class='add'>+DEFUN_1(copy_ulong_to_uint,unsigned long,unsigned int)</div><div class='add'>+DEFUN_1(copy_ulong_to_float,unsigned long,float)</div><div class='add'>+DEFUN_1(copy_ulong_to_double,unsigned long,double)</div><div class='add'>+#else</div><div class='add'>+#define copy_long_to_char	copy_int_to_char</div><div class='add'>+#define copy_long_to_uchar	copy_int_to_uchar</div><div class='add'>+#define copy_long_to_short	copy_int_to_short</div><div class='add'>+#define copy_long_to_ushort	copy_int_to_ushort</div><div class='add'>+#define copy_long_to_int	copy_int_to_int</div><div class='add'>+#define copy_long_to_uint	copy_int_to_int</div><div class='add'>+#define copy_long_to_long	copy_int_to_int</div><div class='add'>+#define copy_long_to_float	copy_int_to_float</div><div class='add'>+#define copy_long_to_double	copy_int_to_double</div><div class='add'>+#define copy_ulong_to_char	copy_uint_to_char</div><div class='add'>+#define copy_ulong_to_uchar	copy_uint_to_uchar</div><div class='add'>+#define copy_ulong_to_short	copy_uint_to_short</div><div class='add'>+#define copy_ulong_to_ushort	copy_uint_to_ushort</div><div class='add'>+#define copy_ulong_to_int	copy_int_to_int</div><div class='add'>+#define copy_ulong_to_uint	copy_int_to_int</div><div class='add'>+#define copy_ulong_to_float	copy_uint_to_float</div><div class='add'>+#define copy_ulong_to_double	copy_uint_to_double</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+DEFUN_1(copy_float_to_char,float,char)</div><div class='add'>+DEFUN_1(copy_float_to_uchar,float,unsigned char)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_1(copy_float_to_short,float,short)</div><div class='add'>+DEFUN_1(copy_float_to_ushort,float,unsigned short)</div><div class='add'>+#else</div><div class='add'>+# define copy_float_to_short	copy_float_to_int</div><div class='add'>+# define copy_float_to_ushort	copy_float_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_float_to_int,float,int)</div><div class='add'>+DEFUN_1(copy_float_to_uint,float,unsigned int)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_1(copy_float_to_long,float,long)</div><div class='add'>+DEFUN_1(copy_float_to_ulong,float,unsigned long)</div><div class='add'>+#else</div><div class='add'>+# define copy_float_to_long	copy_float_to_int</div><div class='add'>+# define copy_float_to_ulong	copy_float_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_float_to_float,float,float)</div><div class='add'>+DEFUN_1(copy_float_to_double,float,double)</div><div class='add'>+</div><div class='add'>+DEFUN_1(copy_double_to_char,double,char)</div><div class='add'>+DEFUN_1(copy_double_to_uchar,double,unsigned char)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_1(copy_double_to_short,double,short)</div><div class='add'>+DEFUN_1(copy_double_to_ushort,double,unsigned short)</div><div class='add'>+#else</div><div class='add'>+# define copy_double_to_short	copy_double_to_int</div><div class='add'>+# define copy_double_to_ushort	copy_double_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_double_to_int,double,int)</div><div class='add'>+DEFUN_1(copy_double_to_uint,double,unsigned int)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_1(copy_double_to_long,double,long)</div><div class='add'>+DEFUN_1(copy_double_to_ulong,double,unsigned long)</div><div class='add'>+#else</div><div class='add'>+# define copy_double_to_long	copy_double_to_int</div><div class='add'>+# define copy_double_to_ulong	copy_double_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_1(copy_double_to_float,double,float)</div><div class='add'>+DEFUN_1(copy_double_to_double,double,double)</div><div class='add'>+</div><div class='add'>+DEFUN_2(char_to_int,char,int,copy_char_to_int)</div><div class='add'>+DEFUN_2(char_to_uint,char,unsigned int,copy_char_to_uint)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_2(char_to_long,char,long,copy_char_to_long)</div><div class='add'>+DEFUN_2(char_to_ulong,char,unsigned long,copy_char_to_ulong)</div><div class='add'>+#else</div><div class='add'>+# define char_to_long	char_to_int</div><div class='add'>+# define char_to_ulong	char_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_2(char_to_float,char,float,copy_char_to_float)</div><div class='add'>+DEFUN_2(char_to_double,char,double,copy_char_to_double)</div><div class='add'>+</div><div class='add'>+DEFUN_2(uchar_to_int,unsigned char,int,copy_uchar_to_int)</div><div class='add'>+DEFUN_2(uchar_to_uint,unsigned char,unsigned int,copy_uchar_to_uint)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_2(uchar_to_long,unsigned char,long,copy_uchar_to_long)</div><div class='add'>+DEFUN_2(uchar_to_ulong,unsigned char,unsigned long,copy_uchar_to_ulong)</div><div class='add'>+#else</div><div class='add'>+# define uchar_to_long		uchar_to_int</div><div class='add'>+# define uchar_to_ulong		uchar_to_uint</div><div class='add'>+#endif</div><div class='add'>+DEFUN_2(uchar_to_float,unsigned char,float,copy_uchar_to_float)</div><div class='add'>+DEFUN_2(uchar_to_double,unsigned char,double,copy_uchar_to_double)</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+DEFUN_2(short_to_int,short,int,copy_short_to_int)</div><div class='add'>+DEFUN_2(short_to_uint,short,unsigned int,copy_short_to_uint)</div><div class='add'>+DEFUN_2(short_to_long,short,long,copy_short_to_long)</div><div class='add'>+DEFUN_2(short_to_ulong,short,unsigned long,copy_short_to_ulong)</div><div class='add'>+DEFUN_2(short_to_float,short,float,copy_short_to_float)</div><div class='add'>+DEFUN_2(short_to_double,short,double,copy_short_to_double)</div><div class='add'>+DEFUN_2(ushort_to_int,unsigned short,int,copy_ushort_to_int)</div><div class='add'>+DEFUN_2(ushort_to_uint,unsigned short,unsigned int,copy_ushort_to_uint)</div><div class='add'>+DEFUN_2(ushort_to_long,unsigned short,long,copy_ushort_to_long)</div><div class='add'>+DEFUN_2(ushort_to_ulong,unsigned short,unsigned long,copy_ushort_to_ulong)</div><div class='add'>+DEFUN_2(ushort_to_float,unsigned short,float,copy_ushort_to_float)</div><div class='add'>+DEFUN_2(ushort_to_double,unsigned short,double,copy_ushort_to_double)</div><div class='add'>+#else</div><div class='add'>+# define short_to_int		NULL</div><div class='add'>+# define short_to_uint		NULL</div><div class='add'>+# define short_to_long		int_to_long</div><div class='add'>+# define short_to_ulong		int_to_ulong</div><div class='add'>+# define short_to_float		int_to_float</div><div class='add'>+# define short_to_double	int_to_double</div><div class='add'>+# define ushort_to_int		NULL</div><div class='add'>+# define ushort_to_uint		NULL</div><div class='add'>+# define ushort_to_long		uint_to_long</div><div class='add'>+# define ushort_to_ulong	uint_to_ulong</div><div class='add'>+# define ushort_to_float	uint_to_float</div><div class='add'>+# define ushort_to_double	uint_to_double</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_2(int_to_long,int,long,copy_int_to_long)</div><div class='add'>+DEFUN_2(int_to_ulong,int,unsigned long,copy_int_to_ulong)</div><div class='add'>+#else</div><div class='add'>+# define int_to_long		NULL</div><div class='add'>+# define int_to_ulong		NULL</div><div class='add'>+#endif</div><div class='add'>+DEFUN_2(int_to_float,int,float,copy_int_to_float)</div><div class='add'>+DEFUN_2(int_to_double,int,double,copy_int_to_double)</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_2(uint_to_long,unsigned int,long,copy_uint_to_long)</div><div class='add'>+DEFUN_2(uint_to_ulong,unsigned int,unsigned long,copy_uint_to_ulong)</div><div class='add'>+#else</div><div class='add'>+# define uint_to_long		NULL</div><div class='add'>+# define uint_to_ulong		NULL</div><div class='add'>+#endif</div><div class='add'>+DEFUN_2(uint_to_float,unsigned int,float,copy_uint_to_float)</div><div class='add'>+DEFUN_2(uint_to_double,unsigned int,double,copy_uint_to_double)</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+DEFUN_2(long_to_float,long,float,copy_long_to_float)</div><div class='add'>+DEFUN_2(long_to_double,long,double,copy_long_to_double)</div><div class='add'>+DEFUN_2(ulong_to_float,unsigned long,float,copy_ulong_to_float)</div><div class='add'>+DEFUN_2(ulong_to_double,unsigned long,double,copy_ulong_to_double)</div><div class='add'>+#else</div><div class='add'>+# define long_to_float		int_to_float</div><div class='add'>+# define long_to_double		int_to_double</div><div class='add'>+# define ulong_to_float		uint_to_float</div><div class='add'>+# define ulong_to_double	uint_to_double</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+DEFUN_2(float_to_double,float,double,copy_float_to_double)</div><div class='add'>+</div><div class='add'>+#define TO_DOUBLE_FUN(name,type) \</div><div class='add'>+static double name (VOID_STAR x) { return (double) *(type *) x; }</div><div class='add'>+TO_DOUBLE_FUN(char_to_one_double,char)</div><div class='add'>+TO_DOUBLE_FUN(uchar_to_one_double,unsigned char)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+TO_DOUBLE_FUN(short_to_one_double,short)</div><div class='add'>+TO_DOUBLE_FUN(ushort_to_one_double,unsigned short)</div><div class='add'>+#else</div><div class='add'>+# define short_to_one_double	int_to_one_double</div><div class='add'>+# define ushort_to_one_double	uint_to_one_double</div><div class='add'>+#endif</div><div class='add'>+TO_DOUBLE_FUN(int_to_one_double,int)</div><div class='add'>+TO_DOUBLE_FUN(uint_to_one_double,unsigned int)</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+TO_DOUBLE_FUN(long_to_one_double,long)</div><div class='add'>+TO_DOUBLE_FUN(ulong_to_one_double,unsigned long)</div><div class='add'>+#else</div><div class='add'>+# define long_to_one_double	int_to_one_double</div><div class='add'>+# define ulong_to_one_double	uint_to_one_double</div><div class='add'>+#endif</div><div class='add'>+TO_DOUBLE_FUN(float_to_one_double,float)</div><div class='add'>+TO_DOUBLE_FUN(double_to_one_double,double)</div><div class='add'>+</div><div class='add'>+SLang_To_Double_Fun_Type</div><div class='add'>+SLarith_get_to_double_fun (unsigned char type, unsigned int *sizeof_type)</div><div class='add'>+{</div><div class='add'>+   unsigned int da;</div><div class='add'>+   SLang_To_Double_Fun_Type to_double;</div><div class='add'>+</div><div class='add'>+   switch (type)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return NULL;</div><div class='add'>+</div><div class='add'>+      case SLANG_CHAR_TYPE:</div><div class='add'>+	da = sizeof (char); to_double = char_to_one_double;</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_UCHAR_TYPE:</div><div class='add'>+	da = sizeof (unsigned char); to_double = uchar_to_one_double;</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_SHORT_TYPE:</div><div class='add'>+	da = sizeof (short); to_double = short_to_one_double;</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_USHORT_TYPE:</div><div class='add'>+	da = sizeof (unsigned short); to_double = ushort_to_one_double;</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_INT_TYPE:</div><div class='add'>+	da = sizeof (int); to_double = int_to_one_double;</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_UINT_TYPE:</div><div class='add'>+	da = sizeof (unsigned int); to_double = uint_to_one_double;</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_LONG_TYPE:</div><div class='add'>+	da = sizeof (long); to_double = long_to_one_double;</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_ULONG_TYPE:</div><div class='add'>+	da = sizeof (unsigned long); to_double = ulong_to_one_double;</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_FLOAT_TYPE:</div><div class='add'>+	da = sizeof (float); to_double = float_to_one_double;</div><div class='add'>+	break;</div><div class='add'>+     case SLANG_DOUBLE_TYPE:</div><div class='add'>+	da = sizeof (double); to_double = double_to_one_double;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (sizeof_type != NULL) *sizeof_type = da;</div><div class='add'>+   return to_double;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Each element of the matrix determines how the row maps onto the column.</div><div class='add'>+ * That is, let the matrix be B_ij.  Where the i,j indices refer to</div><div class='add'>+ * precedence of the type.  Then,</div><div class='add'>+ * B_ij-&gt;copy_function copies type i to type j.  Similarly,</div><div class='add'>+ * B_ij-&gt;convert_function mallocs a new array of type j and copies i to it.</div><div class='add'>+ *</div><div class='add'>+ * Since types are always converted to higher levels of precedence for binary</div><div class='add'>+ * operations, many of the elements are NULL.</div><div class='add'>+ *</div><div class='add'>+ * Is the idea clear?</div><div class='add'>+ */</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   FVOID_STAR copy_function;</div><div class='add'>+   Convert_Fun_Type convert_function;</div><div class='add'>+}</div><div class='add'>+Binary_Matrix_Type;</div><div class='add'>+</div><div class='add'>+static Binary_Matrix_Type Binary_Matrix [MAX_ARITHMETIC_TYPES][MAX_ARITHMETIC_TYPES] =</div><div class='add'>+{</div><div class='add'>+     {</div><div class='add'>+	  {(FVOID_STAR)copy_char_to_char, NULL},</div><div class='add'>+	  {(FVOID_STAR)copy_char_to_char, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_char_to_short, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_char_to_ushort, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_char_to_int, char_to_int},</div><div class='add'>+	{(FVOID_STAR) copy_char_to_uint, char_to_uint},</div><div class='add'>+	{(FVOID_STAR) copy_char_to_long, char_to_long},</div><div class='add'>+	{(FVOID_STAR) copy_char_to_ulong, char_to_ulong},</div><div class='add'>+	{(FVOID_STAR) copy_char_to_float, char_to_float},</div><div class='add'>+	{(FVOID_STAR) copy_char_to_double, char_to_double},</div><div class='add'>+     },</div><div class='add'>+</div><div class='add'>+     {</div><div class='add'>+	  {(FVOID_STAR)copy_char_to_char, NULL},</div><div class='add'>+	  {(FVOID_STAR)copy_char_to_char, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_uchar_to_short, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_uchar_to_ushort, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_uchar_to_int, uchar_to_int},</div><div class='add'>+	{(FVOID_STAR) copy_uchar_to_uint, uchar_to_uint},</div><div class='add'>+	{(FVOID_STAR) copy_uchar_to_long, uchar_to_long},</div><div class='add'>+	{(FVOID_STAR) copy_uchar_to_ulong, uchar_to_ulong},</div><div class='add'>+	{(FVOID_STAR) copy_uchar_to_float, uchar_to_float},</div><div class='add'>+	{(FVOID_STAR) copy_uchar_to_double, uchar_to_double},</div><div class='add'>+     },</div><div class='add'>+</div><div class='add'>+     {</div><div class='add'>+	{(FVOID_STAR) copy_short_to_char, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_short_to_uchar, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_short_to_short, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_short_to_short, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_short_to_int, short_to_int},</div><div class='add'>+	{(FVOID_STAR) copy_short_to_uint, short_to_uint},</div><div class='add'>+	{(FVOID_STAR) copy_short_to_long, short_to_long},</div><div class='add'>+	{(FVOID_STAR) copy_short_to_ulong, short_to_ulong},</div><div class='add'>+	{(FVOID_STAR) copy_short_to_float, short_to_float},</div><div class='add'>+	{(FVOID_STAR) copy_short_to_double, short_to_double},</div><div class='add'>+     },</div><div class='add'>+</div><div class='add'>+     {</div><div class='add'>+	{(FVOID_STAR) copy_ushort_to_char, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_ushort_to_uchar, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_short_to_short, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_short_to_short, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_ushort_to_int, ushort_to_int},</div><div class='add'>+	{(FVOID_STAR) copy_ushort_to_uint, ushort_to_uint},</div><div class='add'>+	{(FVOID_STAR) copy_ushort_to_long, ushort_to_long},</div><div class='add'>+	{(FVOID_STAR) copy_ushort_to_ulong, ushort_to_ulong},</div><div class='add'>+	{(FVOID_STAR) copy_ushort_to_float, ushort_to_float},</div><div class='add'>+	{(FVOID_STAR) copy_ushort_to_double, ushort_to_double},</div><div class='add'>+     },</div><div class='add'>+</div><div class='add'>+     {</div><div class='add'>+	{(FVOID_STAR) copy_int_to_char, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_int_to_uchar, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_int_to_short, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_int_to_ushort, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_int_to_int, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_int_to_int, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_int_to_long, int_to_long},</div><div class='add'>+	{(FVOID_STAR) copy_int_to_ulong, int_to_ulong},</div><div class='add'>+	{(FVOID_STAR) copy_int_to_float, int_to_float},</div><div class='add'>+	{(FVOID_STAR) copy_int_to_double, int_to_double},</div><div class='add'>+     },</div><div class='add'>+</div><div class='add'>+     {</div><div class='add'>+	{(FVOID_STAR) copy_uint_to_char, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_uint_to_uchar, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_uint_to_short, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_uint_to_ushort, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_int_to_int, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_int_to_int, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_uint_to_long, uint_to_long},</div><div class='add'>+	{(FVOID_STAR) copy_uint_to_ulong, uint_to_ulong},</div><div class='add'>+	{(FVOID_STAR) copy_uint_to_float, uint_to_float},</div><div class='add'>+	{(FVOID_STAR) copy_uint_to_double, uint_to_double},</div><div class='add'>+     },</div><div class='add'>+</div><div class='add'>+     {</div><div class='add'>+	{(FVOID_STAR) copy_long_to_char, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_long_to_uchar, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_long_to_short, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_long_to_ushort, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_long_to_int, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_long_to_uint, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_long_to_long, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_long_to_long, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_long_to_float, long_to_float},</div><div class='add'>+	{(FVOID_STAR) copy_long_to_double, long_to_double},</div><div class='add'>+     },</div><div class='add'>+</div><div class='add'>+     {</div><div class='add'>+	{(FVOID_STAR) copy_ulong_to_char, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_ulong_to_uchar, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_ulong_to_short, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_ulong_to_ushort, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_ulong_to_int, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_ulong_to_uint, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_long_to_long, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_long_to_long, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_ulong_to_float, ulong_to_float},</div><div class='add'>+	{(FVOID_STAR) copy_ulong_to_double, ulong_to_double},</div><div class='add'>+     },</div><div class='add'>+</div><div class='add'>+     {</div><div class='add'>+	{(FVOID_STAR) copy_float_to_char, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_float_to_uchar, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_float_to_short, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_float_to_ushort, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_float_to_int, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_float_to_uint, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_float_to_long, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_float_to_ulong, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_float_to_float, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_float_to_double, float_to_double},</div><div class='add'>+     },</div><div class='add'>+</div><div class='add'>+     {</div><div class='add'>+	{(FVOID_STAR) copy_double_to_char, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_double_to_uchar, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_double_to_short, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_double_to_ushort, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_double_to_int, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_double_to_uint, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_double_to_long, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_double_to_ulong, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_double_to_float, NULL},</div><div class='add'>+	{(FVOID_STAR) copy_double_to_double, NULL},</div><div class='add'>+     }</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define GENERIC_BINARY_FUNCTION int_int_bin_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE int</div><div class='add'>+#define POW_FUNCTION(a,b) pow((double)(a),(double)(b))</div><div class='add'>+#define POW_RESULT_TYPE double</div><div class='add'>+#define ABS_FUNCTION abs</div><div class='add'>+#define MOD_FUNCTION(a,b) ((a) % (b))</div><div class='add'>+#define GENERIC_UNARY_FUNCTION int_unary_op</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) &gt; 0) ? 1 : (((x) &lt; 0) ? -1 : 0))</div><div class='add'>+#define SCALAR_BINARY_FUNCTION int_int_scalar_bin_op</div><div class='add'>+#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_int_obj(SLANG_INT_TYPE,(x))</div><div class='add'>+#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x))</div><div class='add'>+#define CMP_FUNCTION int_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_BINARY_FUNCTION uint_uint_bin_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE unsigned int</div><div class='add'>+#define POW_FUNCTION(a,b) pow((double)(a),(double)(b))</div><div class='add'>+#define POW_RESULT_TYPE double</div><div class='add'>+#define MOD_FUNCTION(a,b) ((a) % (b))</div><div class='add'>+#define GENERIC_UNARY_FUNCTION uint_unary_op</div><div class='add'>+#define ABS_FUNCTION(a) (a)</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) &gt; 0) ? 1 : 0)</div><div class='add'>+#define SCALAR_BINARY_FUNCTION uint_uint_scalar_bin_op</div><div class='add'>+#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_int_obj(SLANG_UINT_TYPE,(int)(x))</div><div class='add'>+#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x))</div><div class='add'>+#define CMP_FUNCTION uint_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#if SIZEOF_LONG != SIZEOF_INT</div><div class='add'>+#define GENERIC_BINARY_FUNCTION long_long_bin_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE long</div><div class='add'>+#define POW_FUNCTION(a,b) pow((double)(a),(double)(b))</div><div class='add'>+#define POW_RESULT_TYPE double</div><div class='add'>+#define MOD_FUNCTION(a,b) ((a) % (b))</div><div class='add'>+#define GENERIC_UNARY_FUNCTION long_unary_op</div><div class='add'>+#define ABS_FUNCTION(a) (((a) &gt;= 0) ? (a) : -(a))</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) &gt; 0) ? 1 : (((x) &lt; 0) ? -1 : 0))</div><div class='add'>+#define SCALAR_BINARY_FUNCTION long_long_scalar_bin_op</div><div class='add'>+#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_long_obj(SLANG_LONG_TYPE,(x))</div><div class='add'>+#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x))</div><div class='add'>+#define CMP_FUNCTION long_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_BINARY_FUNCTION ulong_ulong_bin_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE unsigned long</div><div class='add'>+#define POW_FUNCTION(a,b) pow((double)(a),(double)(b))</div><div class='add'>+#define POW_RESULT_TYPE double</div><div class='add'>+#define MOD_FUNCTION(a,b) ((a) % (b))</div><div class='add'>+#define GENERIC_UNARY_FUNCTION ulong_unary_op</div><div class='add'>+#define ABS_FUNCTION(a) (a)</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) &gt; 0) ? 1 : 0)</div><div class='add'>+#define SCALAR_BINARY_FUNCTION ulong_ulong_scalar_bin_op</div><div class='add'>+#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_long_obj(SLANG_ULONG_TYPE,(long)(x))</div><div class='add'>+#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x))</div><div class='add'>+#define CMP_FUNCTION ulong_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+#else</div><div class='add'>+#define long_long_bin_op	int_int_bin_op</div><div class='add'>+#define ulong_ulong_bin_op	uint_uint_bin_op</div><div class='add'>+#define long_unary_op		int_unary_op</div><div class='add'>+#define ulong_unary_op		uint_unary_op</div><div class='add'>+#define long_cmp_function	int_cmp_function</div><div class='add'>+#define ulong_cmp_function	uint_cmp_function</div><div class='add'>+#endif				       /* SIZEOF_INT != SIZEOF_LONG */</div><div class='add'>+</div><div class='add'>+#define GENERIC_BINARY_FUNCTION float_float_bin_op</div><div class='add'>+#define GENERIC_TYPE float</div><div class='add'>+#define POW_FUNCTION(a,b) (float)pow((double)(a),(double)(b))</div><div class='add'>+#define POW_RESULT_TYPE float</div><div class='add'>+#define MOD_FUNCTION(a,b) (float)fmod((a),(b))</div><div class='add'>+#define GENERIC_UNARY_FUNCTION float_unary_op</div><div class='add'>+#define ABS_FUNCTION(a) (float)fabs((double) a)</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) &gt; 0) ? 1 : (((x) &lt; 0) ? -1 : 0))</div><div class='add'>+#define SCALAR_BINARY_FUNCTION float_float_scalar_bin_op</div><div class='add'>+#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_float_obj(SLANG_FLOAT_TYPE,(x))</div><div class='add'>+#define PUSH_POW_OBJ_FUN(x) SLclass_push_float_obj(SLANG_FLOAT_TYPE, (x))</div><div class='add'>+#define CMP_FUNCTION float_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_BINARY_FUNCTION double_double_bin_op</div><div class='add'>+#define GENERIC_TYPE double</div><div class='add'>+#define POW_FUNCTION(a,b) pow((double)(a),(double)(b))</div><div class='add'>+#define POW_RESULT_TYPE double</div><div class='add'>+#define MOD_FUNCTION(a,b) (float)fmod((a),(b))</div><div class='add'>+#define GENERIC_UNARY_FUNCTION double_unary_op</div><div class='add'>+#define ABS_FUNCTION(a) fabs(a)</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) &gt; 0) ? 1 : (((x) &lt; 0) ? -1 : 0))</div><div class='add'>+#define SCALAR_BINARY_FUNCTION double_double_scalar_bin_op</div><div class='add'>+#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE,(x))</div><div class='add'>+#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x))</div><div class='add'>+#define CMP_FUNCTION double_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_UNARY_FUNCTION char_unary_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE signed char</div><div class='add'>+#define ABS_FUNCTION abs</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) &gt; 0) ? 1 : (((x) &lt; 0) ? -1 : 0))</div><div class='add'>+#define CMP_FUNCTION char_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_UNARY_FUNCTION uchar_unary_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE unsigned char</div><div class='add'>+#define ABS_FUNCTION(x) (x)</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) &gt; 0) ? 1 : 0)</div><div class='add'>+#define CMP_FUNCTION uchar_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#if SIZEOF_SHORT != SIZEOF_INT</div><div class='add'>+#define GENERIC_UNARY_FUNCTION short_unary_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE short</div><div class='add'>+#define ABS_FUNCTION abs</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) &gt; 0) ? 1 : (((x) &lt; 0) ? -1 : 0))</div><div class='add'>+#define CMP_FUNCTION short_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_UNARY_FUNCTION ushort_unary_op</div><div class='add'>+#define GENERIC_BIT_OPERATIONS</div><div class='add'>+#define GENERIC_TYPE unsigned short</div><div class='add'>+#define ABS_FUNCTION(x) (x)</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) &gt; 0) ? 1 : 0)</div><div class='add'>+#define CMP_FUNCTION ushort_cmp_function</div><div class='add'>+#include "slarith.inc"</div><div class='add'>+#endif				       /* SIZEOF_INT != SIZEOF_SHORT */</div><div class='add'>+</div><div class='add'>+/* Unfortunately, the numbers that were assigned to the data-types were</div><div class='add'>+ * not well thought out.  So, I need to use the following table.</div><div class='add'>+ */</div><div class='add'>+#define MAXIMUM_ARITH_TYPE_VALUE	SLANG_FLOAT_TYPE</div><div class='add'>+#define IS_INTEGER_TYPE(x) \</div><div class='add'>+  (((x) &lt;= MAXIMUM_ARITH_TYPE_VALUE) \</div><div class='add'>+      &amp;&amp; (Type_Precedence_Table[x] &lt; 8) &amp;&amp; (Type_Precedence_Table[x] != -1))</div><div class='add'>+#define IS_ARITHMETIC_TYPE(x) \</div><div class='add'>+  (((x) &lt;= MAXIMUM_ARITH_TYPE_VALUE) &amp;&amp; (Type_Precedence_Table[x] != -1))</div><div class='add'>+</div><div class='add'>+#define LONG_PRECEDENCE_VALUE	6</div><div class='add'>+#define FLOAT_PRECEDENCE_VALUE	8</div><div class='add'>+</div><div class='add'>+static signed char Type_Precedence_Table [MAXIMUM_ARITH_TYPE_VALUE + 1] =</div><div class='add'>+{</div><div class='add'>+   -1,				       /* SLANG_UNDEFINED_TYPE */</div><div class='add'>+   -1,				       /* SLANG_VOID_TYPE */</div><div class='add'>+   4,				       /* SLANG_INT_TYPE */</div><div class='add'>+   9,				       /* SLANG_DOUBLE_TYPE */</div><div class='add'>+   0,				       /* SLANG_CHAR_TYPE */</div><div class='add'>+   -1,				       /* SLANG_INTP_TYPE */</div><div class='add'>+   -1,				       /* SLANG_REF_TYPE */</div><div class='add'>+   -1,				       /* SLANG_COMPLEX_TYPE */</div><div class='add'>+   -1,				       /* SLANG_NULL_TYPE */</div><div class='add'>+   1,				       /* SLANG_UCHAR_TYPE */</div><div class='add'>+   2,				       /* SLANG_SHORT_TYPE */</div><div class='add'>+   3,				       /* SLANG_USHORT_TYPE */</div><div class='add'>+   5,				       /* SLANG_UINT_TYPE */</div><div class='add'>+   6,				       /* SLANG_LONG_TYPE */</div><div class='add'>+   7,				       /* SLANG_ULONG_TYPE */</div><div class='add'>+   -1,				       /* SLANG_STRING_TYPE */</div><div class='add'>+   8				       /* SLANG_FLOAT_TYPE */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLarith_get_precedence (unsigned char type)</div><div class='add'>+{</div><div class='add'>+   if (type &gt; MAXIMUM_ARITH_TYPE_VALUE)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return Type_Precedence_Table[type];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned char _SLarith_promote_type (unsigned char t)</div><div class='add'>+{</div><div class='add'>+   switch (t)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_FLOAT_TYPE:</div><div class='add'>+      case SLANG_DOUBLE_TYPE:</div><div class='add'>+      case SLANG_LONG_TYPE:</div><div class='add'>+      case SLANG_ULONG_TYPE:</div><div class='add'>+      case SLANG_INT_TYPE:</div><div class='add'>+      case SLANG_UINT_TYPE:</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_USHORT_TYPE:</div><div class='add'>+#if SIZEOF_INT == SIZEOF_SHORT</div><div class='add'>+	t = SLANG_UINT_TYPE;</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+	/* drop */</div><div class='add'>+      case SLANG_CHAR_TYPE:</div><div class='add'>+      case SLANG_UCHAR_TYPE:</div><div class='add'>+      case SLANG_SHORT_TYPE:</div><div class='add'>+      default:</div><div class='add'>+	t = SLANG_INT_TYPE;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return t;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char promote_to_common_type (unsigned char a, unsigned char b)</div><div class='add'>+{</div><div class='add'>+   a = _SLarith_promote_type (a);</div><div class='add'>+   b = _SLarith_promote_type (b);</div><div class='add'>+</div><div class='add'>+   return (Type_Precedence_Table[a] &gt; Type_Precedence_Table[b]) ? a : b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int arith_bin_op_result (int op, unsigned char a_type, unsigned char b_type,</div><div class='add'>+				unsigned char *c_type)</div><div class='add'>+{</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_EQ:</div><div class='add'>+      case SLANG_NE:</div><div class='add'>+      case SLANG_GT:</div><div class='add'>+      case SLANG_GE:</div><div class='add'>+      case SLANG_LT:</div><div class='add'>+      case SLANG_LE:</div><div class='add'>+      case SLANG_OR:</div><div class='add'>+      case SLANG_AND:</div><div class='add'>+	*c_type = SLANG_CHAR_TYPE;</div><div class='add'>+	return 1;</div><div class='add'>+</div><div class='add'>+      case SLANG_POW:</div><div class='add'>+	if (SLANG_FLOAT_TYPE == promote_to_common_type (a_type, b_type))</div><div class='add'>+	  *c_type = SLANG_FLOAT_TYPE;</div><div class='add'>+	else</div><div class='add'>+	  *c_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+	return 1;</div><div class='add'>+</div><div class='add'>+      case SLANG_BAND:</div><div class='add'>+      case SLANG_BXOR:</div><div class='add'>+      case SLANG_BOR:</div><div class='add'>+      case SLANG_SHL:</div><div class='add'>+      case SLANG_SHR:</div><div class='add'>+	/* The bit-level operations are defined just for integer types */</div><div class='add'>+	if ((0 == IS_INTEGER_TYPE (a_type))</div><div class='add'>+	    || (0 == IS_INTEGER_TYPE(b_type)))</div><div class='add'>+	  return 0;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *c_type = promote_to_common_type (a_type, b_type);</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef int (*Bin_Fun_Type) (int,</div><div class='add'>+			     unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+			     unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+			     VOID_STAR);</div><div class='add'>+</div><div class='add'>+/* This array of functions must be indexed by precedence after arithmetic</div><div class='add'>+ * promotions.</div><div class='add'>+ */</div><div class='add'>+static Bin_Fun_Type Bin_Fun_Map [MAX_ARITHMETIC_TYPES] =</div><div class='add'>+{</div><div class='add'>+   NULL,</div><div class='add'>+   NULL,</div><div class='add'>+   NULL,</div><div class='add'>+   NULL,</div><div class='add'>+   int_int_bin_op,</div><div class='add'>+   uint_uint_bin_op,</div><div class='add'>+   long_long_bin_op,</div><div class='add'>+   ulong_ulong_bin_op,</div><div class='add'>+   float_float_bin_op,</div><div class='add'>+   double_double_bin_op</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int arith_bin_op (int op,</div><div class='add'>+			 unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+			 unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+			 VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   Convert_Fun_Type af, bf;</div><div class='add'>+   Bin_Fun_Type binfun;</div><div class='add'>+   int a_indx, b_indx, c_indx;</div><div class='add'>+   unsigned char c_type;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   c_type = promote_to_common_type (a_type, b_type);</div><div class='add'>+</div><div class='add'>+   a_indx = Type_Precedence_Table [a_type];</div><div class='add'>+   b_indx = Type_Precedence_Table [b_type];</div><div class='add'>+   c_indx = Type_Precedence_Table [c_type];</div><div class='add'>+</div><div class='add'>+   af = Binary_Matrix[a_indx][c_indx].convert_function;</div><div class='add'>+   bf = Binary_Matrix[b_indx][c_indx].convert_function;</div><div class='add'>+   binfun = Bin_Fun_Map[c_indx];</div><div class='add'>+</div><div class='add'>+   if ((af != NULL)</div><div class='add'>+       &amp;&amp; (NULL == (ap = (VOID_STAR) (*af) (ap, na))))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((bf != NULL)</div><div class='add'>+       &amp;&amp; (NULL == (bp = (VOID_STAR) (*bf) (bp, nb))))</div><div class='add'>+     {</div><div class='add'>+	if (af != NULL) SLfree ((char *) ap);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   ret = (*binfun) (op, a_type, ap, na, b_type, bp, nb, cp);</div><div class='add'>+   if (af != NULL) SLfree ((char *) ap);</div><div class='add'>+   if (bf != NULL) SLfree ((char *) bp);</div><div class='add'>+</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int arith_unary_op_result (int op, unsigned char a, unsigned char *b)</div><div class='add'>+{</div><div class='add'>+   (void) a;</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLANG_SQR:</div><div class='add'>+      case SLANG_MUL2:</div><div class='add'>+      case SLANG_PLUSPLUS:</div><div class='add'>+      case SLANG_MINUSMINUS:</div><div class='add'>+      case SLANG_CHS:</div><div class='add'>+      case SLANG_ABS:</div><div class='add'>+	*b = a;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_NOT:</div><div class='add'>+      case SLANG_BNOT:</div><div class='add'>+	if (0 == IS_INTEGER_TYPE(a))</div><div class='add'>+	  return 0;</div><div class='add'>+	*b = a;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_SIGN:</div><div class='add'>+	*b = SLANG_INT_TYPE;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int integer_pop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   int i, j;</div><div class='add'>+   void (*f)(VOID_STAR, VOID_STAR, unsigned int);</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop (&amp;obj))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((obj.data_type &gt; MAXIMUM_ARITH_TYPE_VALUE)</div><div class='add'>+       || ((j = Type_Precedence_Table[obj.data_type]) == -1)</div><div class='add'>+       || (j &gt;= FLOAT_PRECEDENCE_VALUE))</div><div class='add'>+     {</div><div class='add'>+	_SLclass_type_mismatch_error (type, obj.data_type);</div><div class='add'>+       	SLang_free_object (&amp;obj);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   i = Type_Precedence_Table[type];</div><div class='add'>+   f = (void (*)(VOID_STAR, VOID_STAR, unsigned int))</div><div class='add'>+     Binary_Matrix[j][i].copy_function;</div><div class='add'>+</div><div class='add'>+   (*f) (ptr, (VOID_STAR)&amp;obj.v, 1);</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int integer_push (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   int i;</div><div class='add'>+   void (*f)(VOID_STAR, VOID_STAR, unsigned int);</div><div class='add'>+</div><div class='add'>+   i = Type_Precedence_Table[type];</div><div class='add'>+   f = (void (*)(VOID_STAR, VOID_STAR, unsigned int))</div><div class='add'>+     Binary_Matrix[i][i].copy_function;</div><div class='add'>+</div><div class='add'>+   obj.data_type = type;</div><div class='add'>+</div><div class='add'>+   (*f) ((VOID_STAR)&amp;obj.v, ptr, 1);</div><div class='add'>+</div><div class='add'>+   return SLang_push (&amp;obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_char (char *i)</div><div class='add'>+{</div><div class='add'>+   return integer_pop (SLANG_CHAR_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_uchar (unsigned char *i)</div><div class='add'>+{</div><div class='add'>+   return integer_pop (SLANG_UCHAR_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_short (short *i)</div><div class='add'>+{</div><div class='add'>+   return integer_pop (SLANG_SHORT_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_ushort (unsigned short *i)</div><div class='add'>+{</div><div class='add'>+   return integer_pop (SLANG_USHORT_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_long (long *i)</div><div class='add'>+{</div><div class='add'>+   return integer_pop (SLANG_LONG_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_ulong (unsigned long *i)</div><div class='add'>+{</div><div class='add'>+   return integer_pop (SLANG_ULONG_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_integer (int *i)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_object_of_type (SLANG_INT_TYPE, &amp;obj, 0))</div><div class='add'>+     return -1;</div><div class='add'>+   *i = obj.v.int_val;</div><div class='add'>+   return 0;</div><div class='add'>+#else</div><div class='add'>+  return integer_pop (SLANG_INT_TYPE, (VOID_STAR) i);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_uinteger (unsigned int *i)</div><div class='add'>+{</div><div class='add'>+   return integer_pop (SLANG_UINT_TYPE, (VOID_STAR) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_integer (int i)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_int_obj (SLANG_INT_TYPE, i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_uinteger (unsigned int i)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_int_obj (SLANG_UINT_TYPE, (int) i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_char (char i)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_char_obj (SLANG_CHAR_TYPE, i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_uchar (unsigned char i)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_char_obj (SLANG_UCHAR_TYPE, (char) i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_short (short i)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_short_obj (SLANG_SHORT_TYPE, i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_ushort (unsigned short i)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_short_obj (SLANG_USHORT_TYPE, (unsigned short) i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_long (long i)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_long_obj (SLANG_LONG_TYPE, i);</div><div class='add'>+}</div><div class='add'>+int SLang_push_ulong (unsigned long i)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_long_obj (SLANG_ULONG_TYPE, (long) i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+int _SLarith_typecast (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+		       unsigned char b_type, VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   int i, j;</div><div class='add'>+</div><div class='add'>+   void (*copy)(VOID_STAR, VOID_STAR, unsigned int);</div><div class='add'>+</div><div class='add'>+   i = Type_Precedence_Table[a_type];</div><div class='add'>+   j = Type_Precedence_Table[b_type];</div><div class='add'>+</div><div class='add'>+   copy = (void (*)(VOID_STAR, VOID_STAR, unsigned int))</div><div class='add'>+     Binary_Matrix[i][j].copy_function;</div><div class='add'>+</div><div class='add'>+   (*copy) (bp, ap, na);</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+</div><div class='add'>+int SLang_pop_double(double *x, int *convertp, int *ip)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   int i, convert;</div><div class='add'>+</div><div class='add'>+   if (0 != SLang_pop (&amp;obj))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   i = 0;</div><div class='add'>+   convert = 0;</div><div class='add'>+</div><div class='add'>+   switch (obj.data_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_FLOAT_TYPE:</div><div class='add'>+	*x = (double) obj.v.float_val;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_DOUBLE_TYPE:</div><div class='add'>+	*x = obj.v.double_val;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_INT_TYPE:</div><div class='add'>+	i = (int) obj.v.long_val;</div><div class='add'>+	*x = (double) i;</div><div class='add'>+	convert = 1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_CHAR_TYPE: *x = (double) obj.v.char_val; break;</div><div class='add'>+      case SLANG_UCHAR_TYPE: *x = (double) obj.v.uchar_val; break;</div><div class='add'>+      case SLANG_SHORT_TYPE: *x = (double) obj.v.short_val; break;</div><div class='add'>+      case SLANG_USHORT_TYPE: *x = (double) obj.v.ushort_val; break;</div><div class='add'>+      case SLANG_UINT_TYPE: *x = (double) obj.v.uint_val; break;</div><div class='add'>+      case SLANG_LONG_TYPE: *x = (double) obj.v.long_val; break;</div><div class='add'>+      case SLANG_ULONG_TYPE: *x = (double) obj.v.ulong_val; break;</div><div class='add'>+	</div><div class='add'>+      default:</div><div class='add'>+	_SLclass_type_mismatch_error (SLANG_DOUBLE_TYPE, obj.data_type);</div><div class='add'>+	SLang_free_object (&amp;obj);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (convertp != NULL) *convertp = convert;</div><div class='add'>+   if (ip != NULL) *ip = i;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_double (double x)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_double_obj (SLANG_DOUBLE_TYPE, x);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_float (float *x)</div><div class='add'>+{</div><div class='add'>+   double d;</div><div class='add'>+</div><div class='add'>+   /* Pop it as a double and let the double function do all the typcasting */</div><div class='add'>+   if (-1 == SLang_pop_double (&amp;d, NULL, NULL))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   *x = (float) d;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_float (float f)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_float_obj (SLANG_FLOAT_TYPE, (double) f);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Double */</div><div class='add'>+static int double_push (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+   SLang_push_double (*(double *) ptr);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int double_push_literal (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   return SLang_push_double (**(double **)ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int double_pop (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+   return SLang_pop_double ((double *) ptr, NULL, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void double_byte_code_destroy (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+   SLfree (*(char **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int float_push (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+   SLang_push_float (*(float *) ptr);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int float_pop (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+   return SLang_pop_float ((float *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif				       /* SLANG_HAS_FLOAT */</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+static char Double_Format[16] = "%g";</div><div class='add'>+</div><div class='add'>+void _SLset_double_format (char *s)</div><div class='add'>+{</div><div class='add'>+   strncpy (Double_Format, s, 15);</div><div class='add'>+   Double_Format[15] = 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static char *arith_string (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   char buf [256];</div><div class='add'>+   char *s;</div><div class='add'>+</div><div class='add'>+   s = buf;</div><div class='add'>+</div><div class='add'>+   switch (type)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	s = SLclass_get_datatype_name (type);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_CHAR_TYPE:</div><div class='add'>+	sprintf (s, "%d", *(char *) v);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_UCHAR_TYPE:</div><div class='add'>+	sprintf (s, "%u", *(unsigned char *) v);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_SHORT_TYPE:</div><div class='add'>+	sprintf (s, "%d", *(short *) v);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_USHORT_TYPE:</div><div class='add'>+	sprintf (s, "%u", *(unsigned short *) v);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_INT_TYPE:</div><div class='add'>+	sprintf (s, "%d", *(int *) v);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_UINT_TYPE:</div><div class='add'>+	sprintf (s, "%u", *(unsigned int *) v);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_LONG_TYPE:</div><div class='add'>+	sprintf (s, "%ld", *(long *) v);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_ULONG_TYPE:</div><div class='add'>+	sprintf (s, "%lu", *(unsigned long *) v);</div><div class='add'>+	break;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+      case SLANG_FLOAT_TYPE:</div><div class='add'>+	if (EOF == _SLsnprintf (buf, sizeof (buf), Double_Format, *(float *) v))</div><div class='add'>+	  sprintf (s, "%e", *(float *) v);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_DOUBLE_TYPE:</div><div class='add'>+	if (EOF == _SLsnprintf (buf, sizeof (buf), Double_Format, *(double *) v))</div><div class='add'>+	  sprintf (s, "%e", *(double *) v);</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return SLmake_string (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int integer_to_bool (unsigned char type, int *t)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   return SLang_pop_integer (t);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_int_literal (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_int_obj (type, (int) *(long *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_char_literal (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_char_obj (type, (char) *(long *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SIZEOF_SHORT != SIZEOF_INT</div><div class='add'>+static int push_short_literal (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_short_obj (type, (short) *(long *) ptr);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+static int push_long_literal (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_long_obj (type, *(long *) ptr);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   unsigned char data_type;</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   int (*unary_fun)(int, unsigned char, VOID_STAR, unsigned int, VOID_STAR);</div><div class='add'>+   int (*push_literal) (unsigned char, VOID_STAR);</div><div class='add'>+   int (*cmp_fun) (unsigned char, VOID_STAR, VOID_STAR, int *);</div><div class='add'>+}</div><div class='add'>+Integer_Info_Type;</div><div class='add'>+</div><div class='add'>+static Integer_Info_Type Integer_Types [8] =</div><div class='add'>+{</div><div class='add'>+     {"Char_Type", SLANG_CHAR_TYPE, sizeof (char), char_unary_op, push_char_literal, char_cmp_function},</div><div class='add'>+     {"UChar_Type", SLANG_UCHAR_TYPE, sizeof (unsigned char), uchar_unary_op, push_char_literal, uchar_cmp_function},</div><div class='add'>+#if SIZEOF_INT != SIZEOF_SHORT</div><div class='add'>+     {"Short_Type", SLANG_SHORT_TYPE, sizeof (short), short_unary_op, push_short_literal, short_cmp_function},</div><div class='add'>+     {"UShort_Type", SLANG_USHORT_TYPE, sizeof (unsigned short), ushort_unary_op, push_short_literal, ushort_cmp_function},</div><div class='add'>+#else</div><div class='add'>+     {NULL, SLANG_SHORT_TYPE},</div><div class='add'>+     {NULL, SLANG_USHORT_TYPE},</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+     {"Integer_Type", SLANG_INT_TYPE, sizeof (int), int_unary_op, push_int_literal, int_cmp_function},</div><div class='add'>+     {"UInteger_Type", SLANG_UINT_TYPE, sizeof (unsigned int), uint_unary_op, push_int_literal, uint_cmp_function},</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT != SIZEOF_LONG</div><div class='add'>+     {"Long_Type", SLANG_LONG_TYPE, sizeof (long), long_unary_op, push_long_literal, long_cmp_function},</div><div class='add'>+     {"ULong_Type", SLANG_ULONG_TYPE, sizeof (unsigned long), ulong_unary_op, push_long_literal, ulong_cmp_function}</div><div class='add'>+#else</div><div class='add'>+     {NULL, SLANG_LONG_TYPE, 0, NULL, NULL, NULL},</div><div class='add'>+     {NULL, SLANG_ULONG_TYPE, 0, NULL, NULL, NULL}</div><div class='add'>+#endif</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int create_synonyms (void)</div><div class='add'>+{</div><div class='add'>+   static char *names[8] =</div><div class='add'>+     {</div><div class='add'>+	"Int16_Type", "UInt16_Type", "Int32_Type", "UInt32_Type",</div><div class='add'>+	"Int64_Type", "UInt64_Type",</div><div class='add'>+	"Float32_Type", "Float64_Type"</div><div class='add'>+     };</div><div class='add'>+   int types[8];</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   memset ((char *) types, 0, sizeof (types));</div><div class='add'>+</div><div class='add'>+   /* The assumption is that sizeof(unsigned X) == sizeof (X) */</div><div class='add'>+#if SIZEOF_INT == 2</div><div class='add'>+   types[0] = SLANG_INT_TYPE;</div><div class='add'>+   types[1] = SLANG_UINT_TYPE;</div><div class='add'>+#else</div><div class='add'>+# if SIZEOF_SHORT == 2</div><div class='add'>+   types[0] = SLANG_SHORT_TYPE;</div><div class='add'>+   types[1] = SLANG_USHORT_TYPE;</div><div class='add'>+# else</div><div class='add'>+#  if SIZEOF_LONG == 2</div><div class='add'>+   types[0] = SLANG_LONG_TYPE;</div><div class='add'>+   types[1] = SLANG_ULONG_TYPE;</div><div class='add'>+#  endif</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT == 4</div><div class='add'>+   types[2] = SLANG_INT_TYPE;</div><div class='add'>+   types[3] = SLANG_UINT_TYPE;</div><div class='add'>+#else</div><div class='add'>+# if SIZEOF_SHORT == 4</div><div class='add'>+   types[2] = SLANG_SHORT_TYPE;</div><div class='add'>+   types[3] = SLANG_USHORT_TYPE;</div><div class='add'>+# else</div><div class='add'>+#  if SIZEOF_LONG == 4</div><div class='add'>+   types[2] = SLANG_LONG_TYPE;</div><div class='add'>+   types[3] = SLANG_ULONG_TYPE;</div><div class='add'>+#  endif</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT == 8</div><div class='add'>+   types[4] = SLANG_INT_TYPE;</div><div class='add'>+   types[5] = SLANG_UINT_TYPE;</div><div class='add'>+#else</div><div class='add'>+# if SIZEOF_SHORT == 8</div><div class='add'>+   types[4] = SLANG_SHORT_TYPE;</div><div class='add'>+   types[5] = SLANG_USHORT_TYPE;</div><div class='add'>+# else</div><div class='add'>+#  if SIZEOF_LONG == 8</div><div class='add'>+   types[4] = SLANG_LONG_TYPE;</div><div class='add'>+   types[5] = SLANG_ULONG_TYPE;</div><div class='add'>+#  endif</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+</div><div class='add'>+#if SIZEOF_FLOAT == 4</div><div class='add'>+   types[6] = SLANG_FLOAT_TYPE;</div><div class='add'>+#else</div><div class='add'>+# if SIZEOF_DOUBLE == 4</div><div class='add'>+   types[6] = SLANG_DOUBLE_TYPE;</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+#if SIZEOF_FLOAT == 8</div><div class='add'>+   types[7] = SLANG_FLOAT_TYPE;</div><div class='add'>+#else</div><div class='add'>+# if SIZEOF_DOUBLE == 8</div><div class='add'>+   types[7] = SLANG_DOUBLE_TYPE;</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLclass_create_synonym ("Int_Type", SLANG_INT_TYPE))</div><div class='add'>+       || (-1 == SLclass_create_synonym ("UInt_Type", SLANG_UINT_TYPE)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; 8; i++)</div><div class='add'>+     {</div><div class='add'>+	if (types[i] == 0) continue;</div><div class='add'>+</div><div class='add'>+	if (-1 == SLclass_create_synonym (names[i], types[i]))</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#if SIZEOF_INT == SIZEOF_SHORT</div><div class='add'>+   if ((-1 == SLclass_create_synonym ("Short_Type", SLANG_INT_TYPE))</div><div class='add'>+       || (-1 == SLclass_create_synonym ("UShort_Type", SLANG_UINT_TYPE))</div><div class='add'>+       || (-1 == _SLclass_copy_class (SLANG_SHORT_TYPE, SLANG_INT_TYPE))</div><div class='add'>+       || (-1 == _SLclass_copy_class (SLANG_USHORT_TYPE, SLANG_UINT_TYPE)))</div><div class='add'>+     return -1;</div><div class='add'>+#endif</div><div class='add'>+#if SIZEOF_INT == SIZEOF_LONG</div><div class='add'>+   if ((-1 == SLclass_create_synonym ("Long_Type", SLANG_INT_TYPE))</div><div class='add'>+       || (-1 == SLclass_create_synonym ("ULong_Type", SLANG_UINT_TYPE))</div><div class='add'>+       || (-1 == _SLclass_copy_class (SLANG_LONG_TYPE, SLANG_INT_TYPE))</div><div class='add'>+       || (-1 == _SLclass_copy_class (SLANG_ULONG_TYPE, SLANG_UINT_TYPE)))</div><div class='add'>+     return -1;</div><div class='add'>+#endif</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLarith_register_types (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   int a_type, b_type;</div><div class='add'>+   int i, j;</div><div class='add'>+</div><div class='add'>+#if defined(HAVE_SETLOCALE) &amp;&amp; defined(LC_NUMERIC)</div><div class='add'>+   /* make sure decimal point it used --- the parser requires it */</div><div class='add'>+   (void) setlocale (LC_NUMERIC, "C"); </div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; 8; i++)</div><div class='add'>+     {</div><div class='add'>+	Integer_Info_Type *info;</div><div class='add'>+</div><div class='add'>+	info = Integer_Types + i;</div><div class='add'>+</div><div class='add'>+	if (info-&gt;name == NULL)</div><div class='add'>+	  {</div><div class='add'>+	     /* This happens when the object is the same size as an integer</div><div class='add'>+	      * For this case, we really want to copy the integer class.</div><div class='add'>+	      * We will handle that when the synonym is created.</div><div class='add'>+	      */</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (NULL == (cl = SLclass_allocate_class (info-&gt;name)))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	(void) SLclass_set_string_function (cl, arith_string);</div><div class='add'>+	(void) SLclass_set_push_function (cl, integer_push);</div><div class='add'>+	(void) SLclass_set_pop_function (cl, integer_pop);</div><div class='add'>+	cl-&gt;cl_push_literal = info-&gt;push_literal;</div><div class='add'>+	cl-&gt;cl_to_bool = integer_to_bool;</div><div class='add'>+</div><div class='add'>+	cl-&gt;cl_cmp = info-&gt;cmp_fun;</div><div class='add'>+</div><div class='add'>+	if (-1 == SLclass_register_class (cl, info-&gt;data_type, info-&gt;sizeof_type,</div><div class='add'>+					  SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+	  return -1;</div><div class='add'>+	if (-1 == SLclass_add_unary_op (info-&gt;data_type, info-&gt;unary_fun, arith_unary_op_result))</div><div class='add'>+	  return -1;</div><div class='add'>+	</div><div class='add'>+	_SLarith_Is_Arith_Type [info-&gt;data_type] = 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("Double_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+   (void) SLclass_set_push_function (cl, double_push);</div><div class='add'>+   (void) SLclass_set_pop_function (cl, double_pop);</div><div class='add'>+   (void) SLclass_set_string_function (cl, arith_string);</div><div class='add'>+   cl-&gt;cl_byte_code_destroy = double_byte_code_destroy;</div><div class='add'>+   cl-&gt;cl_push_literal = double_push_literal;</div><div class='add'>+   cl-&gt;cl_cmp = double_cmp_function;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_DOUBLE_TYPE, sizeof (double),</div><div class='add'>+				     SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+     return -1;</div><div class='add'>+   if (-1 == SLclass_add_unary_op (SLANG_DOUBLE_TYPE, double_unary_op, arith_unary_op_result))</div><div class='add'>+     return -1;</div><div class='add'>+   _SLarith_Is_Arith_Type [SLANG_DOUBLE_TYPE] = 2;</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("Float_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+   (void) SLclass_set_string_function (cl, arith_string);</div><div class='add'>+   (void) SLclass_set_push_function (cl, float_push);</div><div class='add'>+   (void) SLclass_set_pop_function (cl, float_pop);</div><div class='add'>+   cl-&gt;cl_cmp = float_cmp_function;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_FLOAT_TYPE, sizeof (float),</div><div class='add'>+				     SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+     return -1;</div><div class='add'>+   if (-1 == SLclass_add_unary_op (SLANG_FLOAT_TYPE, float_unary_op, arith_unary_op_result))</div><div class='add'>+     return -1;</div><div class='add'>+   _SLarith_Is_Arith_Type [SLANG_FLOAT_TYPE] = 2;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (-1 == create_synonyms ())</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   for (a_type = 0; a_type &lt;= MAXIMUM_ARITH_TYPE_VALUE; a_type++)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == (i = Type_Precedence_Table [a_type]))</div><div class='add'>+	  continue;</div><div class='add'>+</div><div class='add'>+	for (b_type = 0; b_type &lt;= MAXIMUM_ARITH_TYPE_VALUE; b_type++)</div><div class='add'>+	  {</div><div class='add'>+	     int implicit_ok;</div><div class='add'>+</div><div class='add'>+	     if (-1 == (j = Type_Precedence_Table [b_type]))</div><div class='add'>+	       continue;</div><div class='add'>+</div><div class='add'>+	     /* Allow implicit typecast, except from into to float */</div><div class='add'>+	     implicit_ok = ((j &gt;= FLOAT_PRECEDENCE_VALUE)</div><div class='add'>+			    || (i &lt; FLOAT_PRECEDENCE_VALUE));</div><div class='add'>+</div><div class='add'>+	     if (-1 == SLclass_add_binary_op (a_type, b_type, arith_bin_op, arith_bin_op_result))</div><div class='add'>+	       return -1;</div><div class='add'>+</div><div class='add'>+	     if (i != j)</div><div class='add'>+	       if (-1 == SLclass_add_typecast (a_type, b_type, _SLarith_typecast, implicit_ok))</div><div class='add'>+		 return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+</div><div class='add'>+static void promote_objs (SLang_Object_Type *a, SLang_Object_Type *b,</div><div class='add'>+			  SLang_Object_Type *c, SLang_Object_Type *d)</div><div class='add'>+{</div><div class='add'>+   unsigned char ia, ib, ic, id;</div><div class='add'>+   int i, j;</div><div class='add'>+   void (*copy)(VOID_STAR, VOID_STAR, unsigned int);</div><div class='add'>+</div><div class='add'>+   ia = a-&gt;data_type;</div><div class='add'>+   ib = b-&gt;data_type;</div><div class='add'>+   </div><div class='add'>+   ic = _SLarith_promote_type (ia);</div><div class='add'>+</div><div class='add'>+   if (ic == ib) id = ic;	       /* already promoted */</div><div class='add'>+   else id = _SLarith_promote_type (ib);</div><div class='add'>+</div><div class='add'>+   i = Type_Precedence_Table[ic];</div><div class='add'>+   j = Type_Precedence_Table[id];</div><div class='add'>+   if (i &gt; j)</div><div class='add'>+     {</div><div class='add'>+	id = ic;</div><div class='add'>+	j = i;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   c-&gt;data_type = d-&gt;data_type = id;</div><div class='add'>+</div><div class='add'>+   i = Type_Precedence_Table[ia];</div><div class='add'>+   copy = (void (*)(VOID_STAR, VOID_STAR, unsigned int))</div><div class='add'>+     Binary_Matrix[i][j].copy_function;</div><div class='add'>+   (*copy) ((VOID_STAR) &amp;c-&gt;v, (VOID_STAR)&amp;a-&gt;v, 1);</div><div class='add'>+</div><div class='add'>+   i = Type_Precedence_Table[ib];</div><div class='add'>+   copy = (void (*)(VOID_STAR, VOID_STAR, unsigned int))</div><div class='add'>+     Binary_Matrix[i][j].copy_function;</div><div class='add'>+   (*copy) ((VOID_STAR) &amp;d-&gt;v, (VOID_STAR)&amp;b-&gt;v, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLarith_bin_op (SLang_Object_Type *oa, SLang_Object_Type *ob, int op)</div><div class='add'>+{</div><div class='add'>+   unsigned char a_type, b_type;</div><div class='add'>+</div><div class='add'>+   a_type = oa-&gt;data_type;</div><div class='add'>+   b_type = ob-&gt;data_type;</div><div class='add'>+</div><div class='add'>+   if (a_type != b_type)</div><div class='add'>+     {</div><div class='add'>+	SLang_Object_Type obj_a, obj_b;</div><div class='add'>+	</div><div class='add'>+	/* Handle common cases */</div><div class='add'>+	if ((a_type == SLANG_INT_TYPE)</div><div class='add'>+	    &amp;&amp; (b_type == SLANG_DOUBLE_TYPE))</div><div class='add'>+	  return double_double_scalar_bin_op (oa-&gt;v.int_val, ob-&gt;v.double_val, op);</div><div class='add'>+</div><div class='add'>+	if ((a_type == SLANG_DOUBLE_TYPE)</div><div class='add'>+	    &amp;&amp; (b_type == SLANG_INT_TYPE))</div><div class='add'>+	  return double_double_scalar_bin_op (oa-&gt;v.double_val, ob-&gt;v.int_val, op);</div><div class='add'>+</div><div class='add'>+	/* Otherwise do it the hard way */</div><div class='add'>+	promote_objs (oa, ob, &amp;obj_a, &amp;obj_b);</div><div class='add'>+	oa = &amp;obj_a;</div><div class='add'>+	ob = &amp;obj_b;</div><div class='add'>+	</div><div class='add'>+	a_type = oa-&gt;data_type;</div><div class='add'>+	b_type = ob-&gt;data_type;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+	  </div><div class='add'>+   switch (a_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_CHAR_TYPE:</div><div class='add'>+	return int_int_scalar_bin_op (oa-&gt;v.char_val, ob-&gt;v.char_val, op);</div><div class='add'>+</div><div class='add'>+      case SLANG_UCHAR_TYPE:</div><div class='add'>+	return int_int_scalar_bin_op (oa-&gt;v.uchar_val, ob-&gt;v.uchar_val, op);</div><div class='add'>+</div><div class='add'>+      case SLANG_SHORT_TYPE:</div><div class='add'>+	return int_int_scalar_bin_op (oa-&gt;v.short_val, ob-&gt;v.short_val, op);</div><div class='add'>+</div><div class='add'>+      case SLANG_USHORT_TYPE:</div><div class='add'>+# if SIZEOF_INT == SIZEOF_SHORT</div><div class='add'>+	return uint_uint_scalar_bin_op (oa-&gt;v.ushort_val, ob-&gt;v.ushort_val, op);</div><div class='add'>+# else</div><div class='add'>+	return int_int_scalar_bin_op ((int)oa-&gt;v.ushort_val, (int)ob-&gt;v.ushort_val, op);</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+#if SIZEOF_LONG == SIZEOF_INT</div><div class='add'>+      case SLANG_LONG_TYPE:</div><div class='add'>+#endif</div><div class='add'>+      case SLANG_INT_TYPE:</div><div class='add'>+	return int_int_scalar_bin_op (oa-&gt;v.int_val, ob-&gt;v.int_val, op);</div><div class='add'>+</div><div class='add'>+#if SIZEOF_LONG == SIZEOF_INT</div><div class='add'>+      case SLANG_ULONG_TYPE:</div><div class='add'>+#endif</div><div class='add'>+      case SLANG_UINT_TYPE:</div><div class='add'>+	return uint_uint_scalar_bin_op (oa-&gt;v.uint_val, ob-&gt;v.uint_val, op);</div><div class='add'>+	</div><div class='add'>+#if SIZEOF_LONG != SIZEOF_INT</div><div class='add'>+      case SLANG_LONG_TYPE:</div><div class='add'>+	return long_long_scalar_bin_op (oa-&gt;v.long_val, ob-&gt;v.long_val, op);</div><div class='add'>+      case SLANG_ULONG_TYPE:</div><div class='add'>+	return ulong_ulong_scalar_bin_op (oa-&gt;v.ulong_val, ob-&gt;v.ulong_val, op);</div><div class='add'>+#endif</div><div class='add'>+      case SLANG_FLOAT_TYPE:</div><div class='add'>+	return float_float_scalar_bin_op (oa-&gt;v.float_val, ob-&gt;v.float_val, op);</div><div class='add'>+      case SLANG_DOUBLE_TYPE:</div><div class='add'>+	return double_double_scalar_bin_op (oa-&gt;v.double_val, ob-&gt;v.double_val, op);</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slarith.inc b/mdk-stage1/slang/slarith.inc<br/>new file mode 100644<br/>index 000000000..efa8a5e04<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slarith.inc?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarith.inc</a></div><div class='hunk'>@@ -0,0 +1,783 @@</div><div class='add'>+/* -*- c -*- */</div><div class='add'>+</div><div class='add'>+/* This include file is a template for defining arithmetic binary operations </div><div class='add'>+ * on arithmetic types.  I realize that doing it this way is not very</div><div class='add'>+ * elegant but it minimizes the number of lines of code and I believe it </div><div class='add'>+ * promotes clarity.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* The following macros should be properly defined before including this file:</div><div class='add'>+ *</div><div class='add'>+ *   GENERIC_BINARY_FUNCTION:   The name of the binary function</div><div class='add'>+ *   GENERIC_TYPE:              The class data type</div><div class='add'>+ *   MOD_FUNCTION:	        The function to use for mod</div><div class='add'>+ *   ABS_FUNCTION:              Name of the abs function</div><div class='add'>+ *   SIGN_FUNCTION:             Name of the sign function</div><div class='add'>+ *   GENERIC_UNARY_FUNCTION     Name of the unary function</div><div class='add'>+ *</div><div class='add'>+ * If GENERIC_BIT_OPERATIONS is defined, the bit-level binary operators </div><div class='add'>+ * will get included.  If the data type has a power operation (SLANG_POW), </div><div class='add'>+ * then POW_FUNCTION should be defined to return POW_RESULT_TYPE.</div><div class='add'>+ */</div><div class='add'>+#ifdef GENERIC_BINARY_FUNCTION</div><div class='add'>+</div><div class='add'>+static int GENERIC_BINARY_FUNCTION </div><div class='add'>+(int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+ VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   GENERIC_TYPE *c, *a, *b;</div><div class='add'>+#ifdef POW_FUNCTION</div><div class='add'>+   POW_RESULT_TYPE *d;</div><div class='add'>+#endif</div><div class='add'>+   unsigned int n;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+   unsigned int n_max, da, db;</div><div class='add'>+#endif</div><div class='add'>+   char *cc;</div><div class='add'>+</div><div class='add'>+   (void) a_type;		       /* Both SLANG_INT_TYPE */</div><div class='add'>+   (void) b_type;</div><div class='add'>+</div><div class='add'>+   a = (GENERIC_TYPE *) ap;</div><div class='add'>+   b = (GENERIC_TYPE *) bp;</div><div class='add'>+   c = (GENERIC_TYPE *) cp;</div><div class='add'>+   cc = (char *) cp;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+   if (na == 1) da = 0; else da = 1;</div><div class='add'>+   if (nb == 1) db = 0; else db = 1;</div><div class='add'>+</div><div class='add'>+   if (na &gt; nb) n_max = na; else n_max = nb;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+#ifdef POW_FUNCTION</div><div class='add'>+      case SLANG_POW:</div><div class='add'>+	d = (POW_RESULT_TYPE *) cp;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     d[n] = POW_FUNCTION(*a, *b);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       d[n] = POW_FUNCTION(a[n],b[n]);</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     if (xb == 2)</div><div class='add'>+	       for (n = 0; n &lt; na; n++)</div><div class='add'>+		 d[n] = a[n] * a[n];</div><div class='add'>+	     else</div><div class='add'>+	       for (n = 0; n &lt; na; n++)</div><div class='add'>+		 d[n] = POW_FUNCTION(a[n], xb);</div><div class='add'>+	  }</div><div class='add'>+	else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       d[n] = POW_FUNCTION(xa, b[n]);</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+      case SLANG_PLUS:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = (*a + *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] + b[n];</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] + xb;</div><div class='add'>+	  }</div><div class='add'>+	else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       c[n] = xa + b[n];</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_MINUS:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = (*a - *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] - b[n];</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] - xb;</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       c[n] = xa - b[n];</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_TIMES:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = (*a * *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] * b[n];</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] * xb;</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       c[n] = xa * b[n];</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_DIVIDE:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     if (*b == 0)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		  return -1;</div><div class='add'>+	       }</div><div class='add'>+	     c[n] = (*a / *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       {</div><div class='add'>+		  if (b[n] == 0)</div><div class='add'>+		    {</div><div class='add'>+		       SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		       return -1;</div><div class='add'>+		    }</div><div class='add'>+		  c[n] = a[n] / b[n];</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     </div><div class='add'>+	     if (xb == 0)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		  return -1;</div><div class='add'>+	       }</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] / xb;</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       {</div><div class='add'>+		  if (b[n] == 0)</div><div class='add'>+		    {</div><div class='add'>+		       SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		       return -1;</div><div class='add'>+		    }</div><div class='add'>+		  c[n] = xa / b[n];</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+	     </div><div class='add'>+      case SLANG_MOD:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     if (*b == 0)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		  return -1;</div><div class='add'>+	       }</div><div class='add'>+	     c[n] = MOD_FUNCTION(*a, *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       {</div><div class='add'>+		  if (b[n] == 0)</div><div class='add'>+		    {</div><div class='add'>+		       SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		       return -1;</div><div class='add'>+		    }</div><div class='add'>+		  c[n] = MOD_FUNCTION(a[n],b[n]);</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     if (xb == 0)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		  return -1;</div><div class='add'>+	       }</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = MOD_FUNCTION(a[n],xb);</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       {</div><div class='add'>+		  if (b[n] == 0)</div><div class='add'>+		    {</div><div class='add'>+		       SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		       return -1;</div><div class='add'>+		    }</div><div class='add'>+		  c[n] = MOD_FUNCTION(xa,b[n]);</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+#ifdef GENERIC_BIT_OPERATIONS</div><div class='add'>+      case SLANG_BAND:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = (*a &amp; *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] &amp; b[n];</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] &amp; xb;</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       c[n] = xa &amp; b[n];</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_BXOR:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = (*a ^ *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] ^ b[n];</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] ^ xb;</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       c[n] = xa ^ b[n];</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_BOR:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = (*a | *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] | b[n];</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] | xb;</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       c[n] = xa | b[n];</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_SHL:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = (*a &lt;&lt; *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] &lt;&lt; b[n];</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] &lt;&lt; xb;</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       c[n] = xa &lt;&lt; b[n];</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_SHR:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = (*a &gt;&gt; *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] &gt;&gt; b[n];</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       c[n] = a[n] &gt;&gt; xb;</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       c[n] = xa &gt;&gt; b[n];</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+#endif				       /* GENERIC_BIT_OPERATIONS */</div><div class='add'>+      case SLANG_EQ:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     cc[n] = (*a == *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] == b[n]);</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] == xb);</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       cc[n] = (xa == b[n]);</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_NE:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     cc[n] = (*a != *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] != b[n]);</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] != xb);</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       cc[n] = (xa != b[n]);</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_GT:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     cc[n] = (*a &gt; *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] &gt; b[n]);</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] &gt; xb);</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       cc[n] = (xa &gt; b[n]);</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_GE:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     cc[n] = (*a &gt;= *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] &gt;= b[n]);</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] &gt;= xb);</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       cc[n] = (xa &gt;= b[n]);</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_LT:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     cc[n] = (*a &lt; *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] &lt; b[n]);</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] &lt; xb);</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       cc[n] = (xa &lt; b[n]);</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_LE:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     cc[n] = (*a &lt;= *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] &lt;= b[n]);</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] &lt;= xb);</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       cc[n] = (xa &lt;= b[n]);</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_OR:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     cc[n] = (*a || *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] || b[n]);</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] || xb);</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       cc[n] = (xa || b[n]);</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_AND:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED &lt; 2</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     cc[n] = (*a &amp;&amp; *b); a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	if (na == nb)</div><div class='add'>+	  {</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] &amp;&amp; b[n]);</div><div class='add'>+	  }</div><div class='add'>+	else if (nb == 1)</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xb = *b;</div><div class='add'>+	     for (n = 0; n &lt; na; n++)</div><div class='add'>+	       cc[n] = (a[n] &amp;&amp; xb);</div><div class='add'>+	  }</div><div class='add'>+        else /* if (na == 1) */</div><div class='add'>+	  {</div><div class='add'>+	     GENERIC_TYPE xa = *a;</div><div class='add'>+	     for (n = 0; n &lt; nb; n++)</div><div class='add'>+	       cc[n] = (xa &amp;&amp; b[n]);</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif				       /* GENERIC_BINARY_FUNCTION */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifdef GENERIC_UNARY_FUNCTION</div><div class='add'>+</div><div class='add'>+static int GENERIC_UNARY_FUNCTION</div><div class='add'>+(int op,</div><div class='add'>+ unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+ VOID_STAR bp</div><div class='add'>+ )</div><div class='add'>+{</div><div class='add'>+   GENERIC_TYPE *a, *b;</div><div class='add'>+   unsigned int n;</div><div class='add'>+   int *ib;</div><div class='add'>+</div><div class='add'>+   (void) a_type;</div><div class='add'>+</div><div class='add'>+   a = (GENERIC_TYPE *) ap;</div><div class='add'>+   b = (GENERIC_TYPE *) bp;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLANG_PLUSPLUS:</div><div class='add'>+	for (n = 0; n &lt; na; n++) b[n] = (a[n] + 1);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_MINUSMINUS:</div><div class='add'>+	for (n = 0; n &lt; na; n++) b[n] = (a[n] - 1);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_CHS:</div><div class='add'>+	for (n = 0; n &lt; na; n++) b[n] = (GENERIC_TYPE) -(a[n]);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_SQR:</div><div class='add'>+	for (n = 0; n &lt; na; n++) b[n] = (a[n] * a[n]);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_MUL2:</div><div class='add'>+	for (n = 0; n &lt; na; n++) b[n] = (2 * a[n]);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_ABS:</div><div class='add'>+	for (n = 0; n &lt; na; n++) b[n] = ABS_FUNCTION (a[n]);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_SIGN:</div><div class='add'>+	ib = (int *) bp;</div><div class='add'>+	for (n = 0; n &lt; na; n++)</div><div class='add'>+	  ib[n] = SIGN_FUNCTION(a[n]);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+#ifdef GENERIC_BIT_OPERATIONS</div><div class='add'>+      case SLANG_NOT:</div><div class='add'>+	for (n = 0; n &lt; na; n++) b[n] = !(a[n]);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_BNOT:</div><div class='add'>+	for (n = 0; n &lt; na; n++) b[n] = ~(a[n]);</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+#endif				       /* GENERIC_UNARY_FUNCTION */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifdef SCALAR_BINARY_FUNCTION</div><div class='add'>+</div><div class='add'>+static int SCALAR_BINARY_FUNCTION (GENERIC_TYPE a, GENERIC_TYPE b, int op)</div><div class='add'>+{</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 1;</div><div class='add'>+	</div><div class='add'>+#ifdef POW_FUNCTION</div><div class='add'>+      case SLANG_POW:</div><div class='add'>+	return PUSH_POW_OBJ_FUN(POW_FUNCTION(a, b));</div><div class='add'>+#endif</div><div class='add'>+      case SLANG_PLUS:</div><div class='add'>+	return PUSH_SCALAR_OBJ_FUN (a + b);</div><div class='add'>+      case SLANG_MINUS:</div><div class='add'>+	return PUSH_SCALAR_OBJ_FUN (a - b);</div><div class='add'>+      case SLANG_TIMES:</div><div class='add'>+	return PUSH_SCALAR_OBJ_FUN (a * b);</div><div class='add'>+      case SLANG_DIVIDE:</div><div class='add'>+	if (b == 0)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	return PUSH_SCALAR_OBJ_FUN (a / b);</div><div class='add'>+      case SLANG_MOD:</div><div class='add'>+	if (b == 0)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	return PUSH_SCALAR_OBJ_FUN (MOD_FUNCTION(a,b));</div><div class='add'>+#ifdef GENERIC_BIT_OPERATIONS</div><div class='add'>+      case SLANG_BAND:</div><div class='add'>+	return PUSH_SCALAR_OBJ_FUN (a &amp; b);</div><div class='add'>+      case SLANG_BXOR:</div><div class='add'>+	return PUSH_SCALAR_OBJ_FUN (a ^ b);</div><div class='add'>+      case SLANG_BOR:</div><div class='add'>+	return PUSH_SCALAR_OBJ_FUN (a | b);</div><div class='add'>+      case SLANG_SHL:</div><div class='add'>+	return PUSH_SCALAR_OBJ_FUN (a &lt;&lt; b);</div><div class='add'>+      case SLANG_SHR:</div><div class='add'>+	return PUSH_SCALAR_OBJ_FUN (a &gt;&gt; b);</div><div class='add'>+#endif</div><div class='add'>+      case SLANG_GT: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a &gt; b));</div><div class='add'>+      case SLANG_LT: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a &lt; b));</div><div class='add'>+      case SLANG_GE: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a &gt;= b));</div><div class='add'>+      case SLANG_LE: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a &lt;= b));</div><div class='add'>+      case SLANG_EQ: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a == b));</div><div class='add'>+      case SLANG_NE: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a != b));</div><div class='add'>+      case SLANG_OR: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a || b));</div><div class='add'>+      case SLANG_AND: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a &amp;&amp; b));</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif				       /* SCALAR_BINARY_FUNCTION */</div><div class='add'>+</div><div class='add'>+#ifdef CMP_FUNCTION</div><div class='add'>+static int CMP_FUNCTION (unsigned char unused, VOID_STAR a, VOID_STAR b, int *c)</div><div class='add'>+{</div><div class='add'>+   GENERIC_TYPE x, y;</div><div class='add'>+</div><div class='add'>+   (void) unused;</div><div class='add'>+   x = *(GENERIC_TYPE *) a;</div><div class='add'>+   y = *(GENERIC_TYPE *) b;</div><div class='add'>+   </div><div class='add'>+   if (x &gt; y) *c = 1;</div><div class='add'>+   else if (x == y) *c = 0;</div><div class='add'>+   else *c = -1;</div><div class='add'>+   </div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#undef CMP_FUNCTION</div><div class='add'>+#undef SCALAR_BINARY_FUNCTION</div><div class='add'>+#undef PUSH_POW_OBJ_FUN</div><div class='add'>+#undef PUSH_SCALAR_OBJ_FUN</div><div class='add'>+#undef GENERIC_BINARY_FUNCTION</div><div class='add'>+#undef GENERIC_UNARY_FUNCTION</div><div class='add'>+#undef GENERIC_BIT_OPERATIONS</div><div class='add'>+#undef GENERIC_TYPE</div><div class='add'>+#undef POW_FUNCTION</div><div class='add'>+#undef POW_RESULT_TYPE</div><div class='add'>+#undef MOD_FUNCTION</div><div class='add'>+#undef ABS_FUNCTION</div><div class='add'>+#undef SIGN_FUNCTION</div><div class='head'>diff --git a/mdk-stage1/slang/slarray.c b/mdk-stage1/slang/slarray.c<br/>new file mode 100644<br/>index 000000000..0b9a1406c<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slarray.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarray.c</a></div><div class='hunk'>@@ -0,0 +1,3139 @@</div><div class='add'>+/* Array manipulation routines for S-Lang */</div><div class='add'>+/* Copyright (c) 1997, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#define SL_APP_WANTS_FOREACH</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   int first_index;</div><div class='add'>+   int last_index;</div><div class='add'>+   int delta;</div><div class='add'>+}</div><div class='add'>+SLarray_Range_Array_Type;</div><div class='add'>+</div><div class='add'>+/* Use SLang_pop_array when a linear array is required. */</div><div class='add'>+static int pop_array (SLang_Array_Type **at_ptr, int convert_scalar)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   int one = 1;</div><div class='add'>+   int type;</div><div class='add'>+</div><div class='add'>+   *at_ptr = NULL;</div><div class='add'>+   type = SLang_peek_at_stack ();</div><div class='add'>+</div><div class='add'>+   switch (type)</div><div class='add'>+     {</div><div class='add'>+      case -1:</div><div class='add'>+	return -1;</div><div class='add'>+</div><div class='add'>+      case SLANG_ARRAY_TYPE:</div><div class='add'>+	return SLclass_pop_ptr_obj (SLANG_ARRAY_TYPE, (VOID_STAR *) at_ptr);</div><div class='add'>+</div><div class='add'>+      case SLANG_NULL_TYPE:</div><div class='add'>+	convert_scalar = 0;</div><div class='add'>+	/* drop */</div><div class='add'>+      default:</div><div class='add'>+	if (convert_scalar == 0)</div><div class='add'>+	  {</div><div class='add'>+	     SLdo_pop ();</div><div class='add'>+	     SLang_verror (SL_TYPE_MISMATCH, "Context requires an array.  Scalar not converted");</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (at = SLang_create_array ((unsigned char) type, 0, NULL, &amp;one, 1)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == at-&gt;cl-&gt;cl_apop ((unsigned char) type, at-&gt;data))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_array (at);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *at_ptr = at;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static VOID_STAR linear_get_data_addr (SLang_Array_Type *at, int *dims)</div><div class='add'>+{</div><div class='add'>+   unsigned int num_dims;</div><div class='add'>+   unsigned int ofs;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   int *max_dims;</div><div class='add'>+</div><div class='add'>+   ofs = 0;</div><div class='add'>+   max_dims = at-&gt;dims;</div><div class='add'>+   num_dims = at-&gt;num_dims;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; num_dims; i++)</div><div class='add'>+     {</div><div class='add'>+	int d = dims[i];</div><div class='add'>+</div><div class='add'>+	if (d &lt; 0)</div><div class='add'>+	  d = d + max_dims[i];</div><div class='add'>+</div><div class='add'>+	ofs = ofs * (unsigned int)max_dims [i] + (unsigned int) d;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return (VOID_STAR) ((char *)at-&gt;data + (ofs * at-&gt;sizeof_type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static VOID_STAR get_data_addr (SLang_Array_Type *at, int *dims)</div><div class='add'>+{</div><div class='add'>+   VOID_STAR data;</div><div class='add'>+</div><div class='add'>+   data = at-&gt;data;</div><div class='add'>+   if (data == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_UNKNOWN_ERROR, "Array has no data");</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   data = (*at-&gt;index_fun) (at, dims);</div><div class='add'>+</div><div class='add'>+   if (data == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_UNKNOWN_ERROR, "Unable to access array element");</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLarray_free_array_elements (SLang_Class_Type *cl, VOID_STAR s, unsigned int num)</div><div class='add'>+{</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   void (*f) (unsigned char, VOID_STAR);</div><div class='add'>+   char *p;</div><div class='add'>+   unsigned char type;</div><div class='add'>+</div><div class='add'>+   if ((cl-&gt;cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+       || (cl-&gt;cl_class_type == SLANG_CLASS_TYPE_VECTOR))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   f = cl-&gt;cl_destroy;</div><div class='add'>+   sizeof_type = cl-&gt;cl_sizeof_type;</div><div class='add'>+   type = cl-&gt;cl_data_type;</div><div class='add'>+</div><div class='add'>+   p = (char *) s;</div><div class='add'>+   while (num != 0)</div><div class='add'>+     {</div><div class='add'>+	if (NULL != *(VOID_STAR *)p)</div><div class='add'>+	  {</div><div class='add'>+	     (*f) (type, (VOID_STAR)p);</div><div class='add'>+	     *(VOID_STAR *) p = NULL;</div><div class='add'>+	  }</div><div class='add'>+	p += sizeof_type;</div><div class='add'>+	num--;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int destroy_element (SLang_Array_Type *at,</div><div class='add'>+			    int *dims,</div><div class='add'>+			    VOID_STAR data)</div><div class='add'>+{</div><div class='add'>+   data = get_data_addr (at, dims);</div><div class='add'>+   if (data == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* This function should only get called for arrays that have</div><div class='add'>+    * pointer elements.  Do not call the destroy method if the element</div><div class='add'>+    * is NULL.</div><div class='add'>+    */</div><div class='add'>+   if (NULL != *(VOID_STAR *)data)</div><div class='add'>+     {</div><div class='add'>+	(*at-&gt;cl-&gt;cl_destroy) (at-&gt;data_type, data);</div><div class='add'>+	*(VOID_STAR *) data = NULL;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function only gets called when a new array is created.  Thus there</div><div class='add'>+ * is no need to destroy the object first.</div><div class='add'>+ */</div><div class='add'>+static int new_object_element (SLang_Array_Type *at,</div><div class='add'>+			       int *dims,</div><div class='add'>+			       VOID_STAR data)</div><div class='add'>+{</div><div class='add'>+   data = get_data_addr (at, dims);</div><div class='add'>+   if (data == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return (*at-&gt;cl-&gt;cl_init_array_object) (at-&gt;data_type, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int next_index (int *dims, int *max_dims, unsigned int num_dims)</div><div class='add'>+{</div><div class='add'>+   while (num_dims)</div><div class='add'>+     {</div><div class='add'>+	int dims_i;</div><div class='add'>+</div><div class='add'>+	num_dims--;</div><div class='add'>+</div><div class='add'>+	dims_i = dims [num_dims] + 1;</div><div class='add'>+	if (dims_i != (int) max_dims [num_dims])</div><div class='add'>+	  {</div><div class='add'>+	     dims [num_dims] = dims_i;</div><div class='add'>+	     return 0;</div><div class='add'>+	  }</div><div class='add'>+	dims [num_dims] = 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int do_method_for_all_elements (SLang_Array_Type *at,</div><div class='add'>+				       int (*method)(SLang_Array_Type *,</div><div class='add'>+						     int *,</div><div class='add'>+						     VOID_STAR),</div><div class='add'>+				       VOID_STAR client_data)</div><div class='add'>+{</div><div class='add'>+   int dims [SLARRAY_MAX_DIMS];</div><div class='add'>+   int *max_dims;</div><div class='add'>+   unsigned int num_dims;</div><div class='add'>+</div><div class='add'>+   if (at-&gt;num_elements == 0)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   max_dims = at-&gt;dims;</div><div class='add'>+   num_dims = at-&gt;num_dims;</div><div class='add'>+</div><div class='add'>+   SLMEMSET((char *)dims, 0, sizeof(dims));</div><div class='add'>+</div><div class='add'>+   do</div><div class='add'>+     {</div><div class='add'>+	if (-1 == (*method) (at, dims, client_data))</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+   while (0 == next_index (dims, max_dims, num_dims));</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_free_array (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+   VOID_STAR data;</div><div class='add'>+   unsigned int flags;</div><div class='add'>+</div><div class='add'>+   if (at == NULL) return;</div><div class='add'>+</div><div class='add'>+   if (at-&gt;num_refs &gt; 1)</div><div class='add'>+     {</div><div class='add'>+	at-&gt;num_refs -= 1;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   data = at-&gt;data;</div><div class='add'>+   flags = at-&gt;flags;</div><div class='add'>+</div><div class='add'>+   if (flags &amp; SLARR_DATA_VALUE_IS_INTRINSIC)</div><div class='add'>+     return;			       /* not to be freed */</div><div class='add'>+</div><div class='add'>+   if (flags &amp; SLARR_DATA_VALUE_IS_POINTER)</div><div class='add'>+     (void) do_method_for_all_elements (at, destroy_element, NULL);</div><div class='add'>+</div><div class='add'>+   SLfree ((char *) data);</div><div class='add'>+   SLfree ((char *) at);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Array_Type *</div><div class='add'>+SLang_create_array1 (unsigned char type, int read_only, VOID_STAR data,</div><div class='add'>+		     int *dims, unsigned int num_dims, int no_init)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   unsigned int num_elements;</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   unsigned int size;</div><div class='add'>+</div><div class='add'>+   if (num_dims &gt; SLARRAY_MAX_DIMS)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED, "%u dimensional arrays are not supported", num_dims);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; num_dims; i++)</div><div class='add'>+     {</div><div class='add'>+	if (dims[i] &lt; 0)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_INVALID_PARM, "Size of array dim %u is less than 0", i);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+   at = (SLang_Array_Type *) SLmalloc (sizeof(SLang_Array_Type));</div><div class='add'>+   if (at == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   SLMEMSET ((char*) at, 0, sizeof(SLang_Array_Type));</div><div class='add'>+</div><div class='add'>+   at-&gt;data_type = type;</div><div class='add'>+   at-&gt;cl = cl;</div><div class='add'>+   at-&gt;num_dims = num_dims;</div><div class='add'>+   at-&gt;num_refs = 1;</div><div class='add'>+</div><div class='add'>+   if (read_only) at-&gt;flags = SLARR_DATA_VALUE_IS_READ_ONLY;</div><div class='add'>+   switch (cl-&gt;cl_class_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_CLASS_TYPE_VECTOR:</div><div class='add'>+      case SLANG_CLASS_TYPE_SCALAR:</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	at-&gt;flags |= SLARR_DATA_VALUE_IS_POINTER;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   num_elements = 1;</div><div class='add'>+   for (i = 0; i &lt; num_dims; i++)</div><div class='add'>+     {</div><div class='add'>+	at-&gt;dims [i] = dims[i];</div><div class='add'>+	num_elements = dims [i] * num_elements;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Now set the rest of the unused dimensions to 1.  This makes it easier</div><div class='add'>+    * when transposing arrays.</div><div class='add'>+    */</div><div class='add'>+   while (i &lt; SLARRAY_MAX_DIMS)</div><div class='add'>+     at-&gt;dims[i++] = 1;</div><div class='add'>+</div><div class='add'>+   at-&gt;num_elements = num_elements;</div><div class='add'>+   at-&gt;index_fun = linear_get_data_addr;</div><div class='add'>+   at-&gt;sizeof_type = sizeof_type = cl-&gt;cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+   if (data != NULL)</div><div class='add'>+     {</div><div class='add'>+	at-&gt;data = data;</div><div class='add'>+	return at;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   size = num_elements * sizeof_type;</div><div class='add'>+</div><div class='add'>+   if (size == 0) size = 1;</div><div class='add'>+</div><div class='add'>+   if (NULL == (data = (VOID_STAR) SLmalloc (size)))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_array (at);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (no_init == 0)</div><div class='add'>+     SLMEMSET ((char *) data, 0, size);</div><div class='add'>+</div><div class='add'>+   at-&gt;data = data;</div><div class='add'>+</div><div class='add'>+   if ((cl-&gt;cl_init_array_object != NULL)</div><div class='add'>+       &amp;&amp; (-1 == do_method_for_all_elements (at, new_object_element, NULL)))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_array (at);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   return at;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Array_Type *</div><div class='add'>+SLang_create_array (unsigned char type, int read_only, VOID_STAR data,</div><div class='add'>+		    int *dims, unsigned int num_dims)</div><div class='add'>+{</div><div class='add'>+   return SLang_create_array1 (type, read_only, data, dims, num_dims, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_add_intrinsic_array (char *name,</div><div class='add'>+			       unsigned char type,</div><div class='add'>+			       int read_only,</div><div class='add'>+			       VOID_STAR data,</div><div class='add'>+			       unsigned int num_dims, ...)</div><div class='add'>+{</div><div class='add'>+   va_list ap;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   int dims[SLARRAY_MAX_DIMS];</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   if ((num_dims &gt; SLARRAY_MAX_DIMS)</div><div class='add'>+       || (name == NULL)</div><div class='add'>+       || (data == NULL))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Unable to create intrinsic array");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   va_start (ap, num_dims);</div><div class='add'>+   for (i = 0; i &lt; num_dims; i++)</div><div class='add'>+     dims [i] = va_arg (ap, int);</div><div class='add'>+   va_end (ap);</div><div class='add'>+</div><div class='add'>+   at = SLang_create_array (type, read_only, data, dims, num_dims);</div><div class='add'>+   if (at == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+   at-&gt;flags |= SLARR_DATA_VALUE_IS_INTRINSIC;</div><div class='add'>+</div><div class='add'>+   /* Note: The variable that refers to the intrinsic array is regarded as</div><div class='add'>+    * read-only.  That way, Array_Name = another_array; will fail.</div><div class='add'>+    */</div><div class='add'>+   if (-1 == SLadd_intrinsic_variable (name, (VOID_STAR) at, SLANG_ARRAY_TYPE, 1))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_array (at);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_array_indices (int *dims, unsigned int num_dims)</div><div class='add'>+{</div><div class='add'>+   unsigned int n;</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   if (num_dims &gt; SLARRAY_MAX_DIMS)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Array size not supported");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   n = num_dims;</div><div class='add'>+   while (n != 0)</div><div class='add'>+     {</div><div class='add'>+	n--;</div><div class='add'>+	if (-1 == SLang_pop_integer (&amp;i))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	dims[n] = i;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_array (SLang_Array_Type *at, int free_flag)</div><div class='add'>+{</div><div class='add'>+   if (at == NULL)</div><div class='add'>+     return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+   at-&gt;num_refs += 1;</div><div class='add'>+</div><div class='add'>+   if (0 == SLclass_push_ptr_obj (SLANG_ARRAY_TYPE, (VOID_STAR) at))</div><div class='add'>+     {</div><div class='add'>+	if (free_flag)</div><div class='add'>+	  SLang_free_array (at);</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   at-&gt;num_refs -= 1;</div><div class='add'>+</div><div class='add'>+   if (free_flag) SLang_free_array (at);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function gets called via expressions such as Double_Type[10, 20];</div><div class='add'>+ */</div><div class='add'>+static int push_create_new_array (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int num_dims;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   unsigned char type;</div><div class='add'>+   int dims [SLARRAY_MAX_DIMS];</div><div class='add'>+   int (*anew) (unsigned char, unsigned int);</div><div class='add'>+</div><div class='add'>+   num_dims = (SLang_Num_Function_Args - 1);</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_datatype (&amp;type))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   anew = (_SLclass_get_class (type))-&gt;cl_anew;</div><div class='add'>+   if (anew != NULL)</div><div class='add'>+     return (*anew) (type, num_dims);</div><div class='add'>+</div><div class='add'>+   if (-1 == pop_array_indices (dims, num_dims))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (NULL == (at = SLang_create_array (type, 0, NULL, dims, num_dims)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_element_at_addr (SLang_Array_Type *at,</div><div class='add'>+				 VOID_STAR data, int allow_null)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = at-&gt;cl;</div><div class='add'>+   if ((at-&gt;flags &amp; SLARR_DATA_VALUE_IS_POINTER)</div><div class='add'>+       &amp;&amp; (*(VOID_STAR *) data == NULL))</div><div class='add'>+     {</div><div class='add'>+	if (allow_null)</div><div class='add'>+	  return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+	SLang_verror (SL_VARIABLE_UNINITIALIZED,</div><div class='add'>+		      "%s array has unitialized element", cl-&gt;cl_name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return (*cl-&gt;cl_apush)(at-&gt;data_type, data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int coerse_array_to_linear (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+   SLarray_Range_Array_Type *range;</div><div class='add'>+   int *data;</div><div class='add'>+   int xmin, dx;</div><div class='add'>+   unsigned int i, imax;</div><div class='add'>+</div><div class='add'>+   /* FIXME: Priority = low.  This assumes that if an array is not linear, then</div><div class='add'>+    * it is a range.</div><div class='add'>+    */</div><div class='add'>+   if (0 == (at-&gt;flags &amp; SLARR_DATA_VALUE_IS_RANGE))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   range = (SLarray_Range_Array_Type *) at-&gt;data;</div><div class='add'>+   xmin = range-&gt;first_index;</div><div class='add'>+   dx = range-&gt;delta;</div><div class='add'>+</div><div class='add'>+   imax = at-&gt;num_elements;</div><div class='add'>+   data = (int *) SLmalloc ((imax + 1) * sizeof (int));</div><div class='add'>+   if (data == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; imax; i++)</div><div class='add'>+     {</div><div class='add'>+	data [i] = xmin;</div><div class='add'>+	xmin += dx;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLfree ((char *) range);</div><div class='add'>+   at-&gt;data = (VOID_STAR) data;</div><div class='add'>+   at-&gt;flags &amp;= ~SLARR_DATA_VALUE_IS_RANGE;</div><div class='add'>+   at-&gt;index_fun = linear_get_data_addr;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+free_index_objects (SLang_Object_Type *index_objs, unsigned int num_indices)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+   SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; num_indices; i++)</div><div class='add'>+     {</div><div class='add'>+	obj = index_objs + i;</div><div class='add'>+	if (obj-&gt;data_type != 0)</div><div class='add'>+	  SLang_free_object (obj);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+pop_indices (SLang_Object_Type *index_objs, unsigned int num_indices,</div><div class='add'>+	     int *is_index_array)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   SLMEMSET((char *) index_objs, 0, num_indices * sizeof (SLang_Object_Type));</div><div class='add'>+</div><div class='add'>+   *is_index_array = 0;</div><div class='add'>+</div><div class='add'>+   if (num_indices &gt;= SLARRAY_MAX_DIMS)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "too many indices for array");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   i = num_indices;</div><div class='add'>+   while (i != 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+	i--;</div><div class='add'>+	obj = index_objs + i;</div><div class='add'>+	if (-1 == _SLang_pop_object_of_type (SLANG_INT_TYPE, obj, 1))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	if (obj-&gt;data_type == SLANG_ARRAY_TYPE)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_Array_Type *at = obj-&gt;v.array_val;</div><div class='add'>+</div><div class='add'>+	     if (at-&gt;num_dims == 1)</div><div class='add'>+	       {</div><div class='add'>+		  if ((num_indices == 1)</div><div class='add'>+		      &amp;&amp; (0 == (at-&gt;flags &amp; SLARR_DATA_VALUE_IS_RANGE)))</div><div class='add'>+		    *is_index_array = 1;</div><div class='add'>+	       }</div><div class='add'>+	     else</div><div class='add'>+	       {</div><div class='add'>+		  SLang_verror (SL_INVALID_PARM, "expecting a 1-d index array");</div><div class='add'>+		  goto return_error;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   free_index_objects (index_objs, num_indices);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Here ind_at is a linear 1-d array of indices */</div><div class='add'>+static int</div><div class='add'>+check_index_array_ranges (SLang_Array_Type *at, SLang_Array_Type *ind_at)</div><div class='add'>+{</div><div class='add'>+   int *indices, *indices_max;</div><div class='add'>+   unsigned int num_elements;</div><div class='add'>+</div><div class='add'>+   num_elements = at-&gt;num_elements;</div><div class='add'>+   indices = (int *) ind_at-&gt;data;</div><div class='add'>+   indices_max = indices + ind_at-&gt;num_elements;</div><div class='add'>+</div><div class='add'>+   while (indices &lt; indices_max)</div><div class='add'>+     {</div><div class='add'>+	unsigned int d;</div><div class='add'>+</div><div class='add'>+	d = (unsigned int) *indices++;</div><div class='add'>+	if (d &gt;= num_elements)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_INVALID_PARM,</div><div class='add'>+			   "index-array is out of range");</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+transfer_n_elements (SLang_Array_Type *at, VOID_STAR dest_data, VOID_STAR src_data,</div><div class='add'>+		     unsigned int sizeof_type, unsigned int n, int is_ptr)</div><div class='add'>+{</div><div class='add'>+   unsigned char data_type;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (is_ptr == 0)</div><div class='add'>+     {</div><div class='add'>+	SLMEMCPY ((char *) dest_data, (char *)src_data, n * sizeof_type);</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   data_type = at-&gt;data_type;</div><div class='add'>+   cl = at-&gt;cl;</div><div class='add'>+</div><div class='add'>+   while (n != 0)</div><div class='add'>+     {</div><div class='add'>+	if (*(VOID_STAR *)dest_data != NULL)</div><div class='add'>+	  {</div><div class='add'>+	     (*cl-&gt;cl_destroy) (data_type, dest_data);</div><div class='add'>+	     *(VOID_STAR *) dest_data = NULL;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (*(VOID_STAR *) src_data == NULL)</div><div class='add'>+	  *(VOID_STAR *) dest_data = NULL;</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == (*cl-&gt;cl_acopy) (data_type, src_data, dest_data))</div><div class='add'>+	       /* No need to destroy anything */</div><div class='add'>+	       return -1;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	src_data = (VOID_STAR) ((char *)src_data + sizeof_type);</div><div class='add'>+	dest_data = (VOID_STAR) ((char *)dest_data + sizeof_type);</div><div class='add'>+</div><div class='add'>+	n--;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_SLarray_aget_transfer_elem (SLang_Array_Type *at, int *indices,</div><div class='add'>+			     VOID_STAR new_data, unsigned int sizeof_type, int is_ptr)</div><div class='add'>+{</div><div class='add'>+   VOID_STAR at_data;</div><div class='add'>+</div><div class='add'>+   /* Since 1 element is being transferred, there is not need to coerse</div><div class='add'>+    * the array to linear.</div><div class='add'>+    */</div><div class='add'>+   if (NULL == (at_data = get_data_addr (at, indices)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return transfer_n_elements (at, new_data, at_data, sizeof_type, 1, is_ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Here the ind_at index-array is a 1-d array of indices.  This function</div><div class='add'>+ * creates a 1-d array of made up of values of 'at' at the locations</div><div class='add'>+ * specified by the indices.  The result is pushed.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+aget_from_index_array (SLang_Array_Type *at,</div><div class='add'>+		       SLang_Array_Type *ind_at)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *new_at;</div><div class='add'>+   int *indices, *indices_max;</div><div class='add'>+   unsigned char *new_data, *src_data;</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   int is_ptr;</div><div class='add'>+   </div><div class='add'>+   if (-1 == coerse_array_to_linear (at))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == coerse_array_to_linear (ind_at))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == check_index_array_ranges (at, ind_at))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (NULL == (new_at = SLang_create_array (at-&gt;data_type, 0, NULL, ind_at-&gt;dims, 1)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* Since the index array is linear, I can address it directly */</div><div class='add'>+   indices = (int *) ind_at-&gt;data;</div><div class='add'>+   indices_max = indices + ind_at-&gt;num_elements;</div><div class='add'>+</div><div class='add'>+   src_data = (unsigned char *) at-&gt;data;</div><div class='add'>+   new_data = (unsigned char *) new_at-&gt;data;</div><div class='add'>+   sizeof_type = new_at-&gt;sizeof_type;</div><div class='add'>+   is_ptr = (new_at-&gt;flags &amp; SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+</div><div class='add'>+   while (indices &lt; indices_max)</div><div class='add'>+     {</div><div class='add'>+	unsigned int offset;</div><div class='add'>+</div><div class='add'>+	offset = sizeof_type * (unsigned int)*indices;</div><div class='add'>+	if (-1 == transfer_n_elements (at, (VOID_STAR) new_data,</div><div class='add'>+				       (VOID_STAR) (src_data + offset),</div><div class='add'>+				       sizeof_type, 1, is_ptr))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_array (new_at);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	new_data += sizeof_type;</div><div class='add'>+	indices++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return SLang_push_array (new_at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is extremely ugly.  It is due to the fact that the index_objects</div><div class='add'>+ * may contain ranges.  This is a utility function for the aget/aput</div><div class='add'>+ * routines</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+convert_nasty_index_objs (SLang_Array_Type *at,</div><div class='add'>+			  SLang_Object_Type *index_objs,</div><div class='add'>+			  unsigned int num_indices,</div><div class='add'>+			  int **index_data,</div><div class='add'>+			  int *range_buf, int *range_delta_buf,</div><div class='add'>+			  int *max_dims,</div><div class='add'>+			  unsigned int *num_elements,</div><div class='add'>+			  int *is_array, int is_dim_array[SLARRAY_MAX_DIMS])</div><div class='add'>+{</div><div class='add'>+   unsigned int i, total_num_elements;</div><div class='add'>+   SLang_Array_Type *ind_at;</div><div class='add'>+</div><div class='add'>+   if (num_indices != at-&gt;num_dims)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Array requires %u indices", at-&gt;num_dims);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *is_array = 0;</div><div class='add'>+   total_num_elements = 1;</div><div class='add'>+   for (i = 0; i &lt; num_indices; i++)</div><div class='add'>+     {</div><div class='add'>+	int max_index, min_index;</div><div class='add'>+	SLang_Object_Type *obj;</div><div class='add'>+	int at_dims_i;</div><div class='add'>+</div><div class='add'>+	at_dims_i = at-&gt;dims[i];</div><div class='add'>+	obj = index_objs + i;</div><div class='add'>+	range_delta_buf [i] = 0;</div><div class='add'>+</div><div class='add'>+	if (obj-&gt;data_type == SLANG_INT_TYPE)</div><div class='add'>+	  {</div><div class='add'>+	     range_buf [i] = min_index = max_index = obj-&gt;v.int_val;</div><div class='add'>+	     max_dims [i] = 1;</div><div class='add'>+	     index_data[i] = range_buf + i;</div><div class='add'>+	     is_dim_array[i] = 0;</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     *is_array = 1;</div><div class='add'>+	     is_dim_array[i] = 1;</div><div class='add'>+	     ind_at = obj-&gt;v.array_val;</div><div class='add'>+</div><div class='add'>+	     if (ind_at-&gt;flags &amp; SLARR_DATA_VALUE_IS_RANGE)</div><div class='add'>+	       {</div><div class='add'>+		  SLarray_Range_Array_Type *r;</div><div class='add'>+		  int delta;</div><div class='add'>+		  int first_index, last_index;</div><div class='add'>+</div><div class='add'>+		  r = (SLarray_Range_Array_Type *) ind_at-&gt;data;</div><div class='add'>+</div><div class='add'>+		  /* In an array indexing context, range arrays have different</div><div class='add'>+		   * semantics.  Consider a[[0:10]].  Clearly this means elements</div><div class='add'>+		   * 0-10 of a.  But what does a[[0:-1]] mean?  By itself,</div><div class='add'>+		   * [0:-1] is a null matrix [].  But, it is useful in an</div><div class='add'>+		   * indexing context to allow -1 to refer to the last element</div><div class='add'>+		   * of the array.  Similarly, [-3:-1] refers to the last 3</div><div class='add'>+		   * elements.</div><div class='add'>+		   * </div><div class='add'>+		   * However, [-1:-3] does not refer to any of the elements.</div><div class='add'>+		   */</div><div class='add'>+		  if ((first_index = r-&gt;first_index) &lt; 0)</div><div class='add'>+		    {</div><div class='add'>+		       if (at_dims_i != 0)</div><div class='add'>+			 first_index = (at_dims_i + first_index) % at_dims_i;</div><div class='add'>+		    }</div><div class='add'>+</div><div class='add'>+		  if ((last_index = r-&gt;last_index) &lt; 0)</div><div class='add'>+		    {</div><div class='add'>+		       if (at_dims_i != 0)</div><div class='add'>+			 last_index = (at_dims_i + last_index) % at_dims_i;</div><div class='add'>+		    }</div><div class='add'>+</div><div class='add'>+		  delta = r-&gt;delta;</div><div class='add'>+</div><div class='add'>+		  range_delta_buf [i] = delta;</div><div class='add'>+		  range_buf[i] = first_index;</div><div class='add'>+</div><div class='add'>+		  if (delta &gt; 0)</div><div class='add'>+		    {</div><div class='add'>+		       if (first_index &gt; last_index)</div><div class='add'>+			 max_dims[i] = min_index = max_index = 0;</div><div class='add'>+		       else</div><div class='add'>+			 {</div><div class='add'>+			    max_index = min_index = first_index;</div><div class='add'>+			    while (max_index + delta &lt;= last_index)</div><div class='add'>+			      max_index += delta;</div><div class='add'>+			    max_dims [i] = 1 + (max_index - min_index) / delta;</div><div class='add'>+			 }</div><div class='add'>+		    }</div><div class='add'>+		  else</div><div class='add'>+		    {</div><div class='add'>+		       if (first_index &lt; last_index)</div><div class='add'>+			 max_dims[i] = min_index = max_index = 0;</div><div class='add'>+		       else</div><div class='add'>+			 {</div><div class='add'>+			    min_index = max_index = first_index;</div><div class='add'>+			    while (min_index + delta &gt;= last_index)</div><div class='add'>+			      min_index += delta;</div><div class='add'>+			    max_dims [i] = 1 + (max_index - min_index) / (-delta);</div><div class='add'>+			 }</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+	     else</div><div class='add'>+	       {</div><div class='add'>+		  int *tmp, *tmp_max;</div><div class='add'>+</div><div class='add'>+		  if (0 == (max_dims[i] = ind_at-&gt;num_elements))</div><div class='add'>+		    {</div><div class='add'>+		       total_num_elements = 0;</div><div class='add'>+		       break;</div><div class='add'>+		    }</div><div class='add'>+</div><div class='add'>+		  tmp = (int *) ind_at-&gt;data;</div><div class='add'>+		  tmp_max = tmp + ind_at-&gt;num_elements;</div><div class='add'>+		  index_data [i] = tmp;</div><div class='add'>+</div><div class='add'>+		  min_index = max_index = *tmp;</div><div class='add'>+		  while (tmp &lt; tmp_max)</div><div class='add'>+		    {</div><div class='add'>+		       if (max_index &gt; *tmp)</div><div class='add'>+			 max_index = *tmp;</div><div class='add'>+		       if (min_index &lt; *tmp)</div><div class='add'>+			 min_index = *tmp;</div><div class='add'>+</div><div class='add'>+		       tmp++;</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if ((at_dims_i == 0) &amp;&amp; (max_dims[i] == 0))</div><div class='add'>+	  {</div><div class='add'>+	     total_num_elements = 0;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (max_index &lt; 0)</div><div class='add'>+	  max_index += at_dims_i;</div><div class='add'>+	if (min_index &lt; 0)</div><div class='add'>+	  min_index += at_dims_i;</div><div class='add'>+</div><div class='add'>+	if ((min_index &lt; 0) || (min_index &gt;= at_dims_i)</div><div class='add'>+	    || (max_index &lt; 0) || (max_index &gt;= at_dims_i))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_INVALID_PARM, "Array index %u ([%d:%d]) out of allowed range [0-&gt;%d]",</div><div class='add'>+			   i, min_index, max_index, at_dims_i);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	total_num_elements = total_num_elements * max_dims[i];</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *num_elements = total_num_elements;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This routine pushes a 1-d vector of values from 'at' indexed by</div><div class='add'>+ * the objects 'index_objs'.  These objects can either be integers or</div><div class='add'>+ * 1-d integer arrays.  The fact that the 1-d arrays can be ranges</div><div class='add'>+ * makes this look ugly.</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+aget_from_indices (SLang_Array_Type *at,</div><div class='add'>+		   SLang_Object_Type *index_objs, unsigned int num_indices)</div><div class='add'>+{</div><div class='add'>+   int *index_data [SLARRAY_MAX_DIMS];</div><div class='add'>+   int range_buf [SLARRAY_MAX_DIMS];</div><div class='add'>+   int range_delta_buf [SLARRAY_MAX_DIMS];</div><div class='add'>+   int max_dims [SLARRAY_MAX_DIMS];</div><div class='add'>+   unsigned int i, num_elements;</div><div class='add'>+   SLang_Array_Type *new_at;</div><div class='add'>+   int map_indices[SLARRAY_MAX_DIMS];</div><div class='add'>+   int indices [SLARRAY_MAX_DIMS];</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   int is_ptr, ret, is_array;</div><div class='add'>+   char *new_data;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   int is_dim_array[SLARRAY_MAX_DIMS];</div><div class='add'>+</div><div class='add'>+   if (-1 == convert_nasty_index_objs (at, index_objs, num_indices,</div><div class='add'>+				       index_data, range_buf, range_delta_buf,</div><div class='add'>+				       max_dims, &amp;num_elements, &amp;is_array,</div><div class='add'>+				       is_dim_array))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   is_ptr = (at-&gt;flags &amp; SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+   sizeof_type = at-&gt;sizeof_type;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (at-&gt;data_type);</div><div class='add'>+</div><div class='add'>+   if ((is_array == 0) &amp;&amp; (num_elements == 1))</div><div class='add'>+     {</div><div class='add'>+	new_data = (char *)cl-&gt;cl_transfer_buf;</div><div class='add'>+	memset (new_data, 0, sizeof_type);</div><div class='add'>+	new_at = NULL;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	int i_num_elements = (int)num_elements;</div><div class='add'>+</div><div class='add'>+	new_at = SLang_create_array (at-&gt;data_type, 0, NULL, &amp;i_num_elements, 1);</div><div class='add'>+	if (NULL == new_at)</div><div class='add'>+	  return -1;</div><div class='add'>+	if (num_elements == 0)</div><div class='add'>+	  return SLang_push_array (new_at, 1);</div><div class='add'>+</div><div class='add'>+	new_data = (char *)new_at-&gt;data;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLMEMSET((char *) map_indices, 0, sizeof(map_indices));</div><div class='add'>+   do</div><div class='add'>+     {</div><div class='add'>+	for (i = 0; i &lt; num_indices; i++)</div><div class='add'>+	  {</div><div class='add'>+	     int j;</div><div class='add'>+</div><div class='add'>+	     j = map_indices[i];</div><div class='add'>+</div><div class='add'>+	     if (0 != range_delta_buf[i])</div><div class='add'>+	       indices[i] = range_buf[i] + j * range_delta_buf[i];</div><div class='add'>+	     else</div><div class='add'>+	       indices[i] = index_data [i][j];</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (-1 == _SLarray_aget_transfer_elem (at, indices, (VOID_STAR)new_data, sizeof_type, is_ptr))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_array (new_at);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	new_data += sizeof_type;</div><div class='add'>+     }</div><div class='add'>+   while (0 == next_index (map_indices, max_dims, num_indices));</div><div class='add'>+</div><div class='add'>+   if (new_at != NULL)</div><div class='add'>+     {</div><div class='add'>+	int num_dims = 0;</div><div class='add'>+	/* Fixup dimensions on array */</div><div class='add'>+	for (i = 0; i &lt; num_indices; i++)</div><div class='add'>+	  {</div><div class='add'>+	     if (is_dim_array[i]) /* was: (max_dims[i] &gt; 1) */</div><div class='add'>+	       {</div><div class='add'>+		  new_at-&gt;dims[num_dims] = max_dims[i];</div><div class='add'>+		  num_dims++;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (num_dims != 0) new_at-&gt;num_dims = num_dims;</div><div class='add'>+	return SLang_push_array (new_at, 1);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Here new_data is a whole new copy, so free it after the push */</div><div class='add'>+   new_data -= sizeof_type;</div><div class='add'>+   if (is_ptr &amp;&amp; (*(VOID_STAR *)new_data == NULL))</div><div class='add'>+     ret = SLang_push_null ();</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	ret = (*cl-&gt;cl_apush) (at-&gt;data_type, (VOID_STAR)new_data);</div><div class='add'>+	(*cl-&gt;cl_adestroy) (at-&gt;data_type, (VOID_STAR)new_data);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_string_as_array (unsigned char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   int ilen;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   ilen = (int) len;</div><div class='add'>+</div><div class='add'>+   at = SLang_create_array (SLANG_UCHAR_TYPE, 0, NULL, &amp;ilen, 1);</div><div class='add'>+   if (at == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   memcpy ((char *)at-&gt;data, (char *)s, len);</div><div class='add'>+   return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_array_as_string (char **sp)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   *sp = NULL;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_array_of_type (&amp;at, SLANG_UCHAR_TYPE))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   ret = 0;</div><div class='add'>+</div><div class='add'>+   if (NULL == (*sp = SLang_create_nslstring ((char *) at-&gt;data, at-&gt;num_elements)))</div><div class='add'>+     ret = -1;</div><div class='add'>+</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_array_as_bstring (SLang_BString_Type **bs)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   *bs = NULL;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_array_of_type (&amp;at, SLANG_UCHAR_TYPE))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   ret = 0;</div><div class='add'>+</div><div class='add'>+   if (NULL == (*bs = SLbstring_create ((unsigned char *) at-&gt;data, at-&gt;num_elements)))</div><div class='add'>+     ret = -1;</div><div class='add'>+</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int aget_from_array (unsigned int num_indices)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   SLang_Object_Type index_objs [SLARRAY_MAX_DIMS];</div><div class='add'>+   int ret;</div><div class='add'>+   int is_index_array;</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   if (num_indices &gt; SLARRAY_MAX_DIMS)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Number of dims must be less than %d", SLARRAY_MAX_DIMS);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == pop_array (&amp;at, 1))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == pop_indices (index_objs, num_indices, &amp;is_index_array))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_array (at);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (is_index_array == 0)</div><div class='add'>+     ret = aget_from_indices (at, index_objs, num_indices);</div><div class='add'>+   else</div><div class='add'>+     ret = aget_from_index_array (at, index_objs[0].v.array_val);</div><div class='add'>+</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+   for (i = 0; i &lt; num_indices; i++)</div><div class='add'>+     SLang_free_object (index_objs + i);</div><div class='add'>+</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_string_element (unsigned char type, unsigned char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   if (SLang_peek_at_stack () == SLANG_ARRAY_TYPE)</div><div class='add'>+     {</div><div class='add'>+	char *str;</div><div class='add'>+</div><div class='add'>+	/* The indices are array values.  So, do this: */</div><div class='add'>+	if (-1 == push_string_as_array (s, len))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	if (-1 == aget_from_array (1))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	if (type == SLANG_BSTRING_TYPE)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_BString_Type *bs;</div><div class='add'>+	     int ret;</div><div class='add'>+</div><div class='add'>+	     if (-1 == pop_array_as_bstring (&amp;bs))</div><div class='add'>+	       return -1;</div><div class='add'>+</div><div class='add'>+	     ret = SLang_push_bstring (bs);</div><div class='add'>+	     SLbstring_free (bs);</div><div class='add'>+	     return ret;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (-1 == pop_array_as_string (&amp;str))</div><div class='add'>+	  return -1;</div><div class='add'>+	return _SLang_push_slstring (str);   /* frees s upon error */</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_integer (&amp;i))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (i &lt; 0) i = i + (int)len;</div><div class='add'>+   if ((unsigned int) i &gt; len)</div><div class='add'>+     i = len;			       /* get \0 character --- bstrings include it as well */</div><div class='add'>+</div><div class='add'>+   i = s[(unsigned int) i];</div><div class='add'>+</div><div class='add'>+   return SLang_push_integer (i);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* ARRAY[i, j, k] generates code: __args i j ...k ARRAY __aput/__aget</div><div class='add'>+ * Here i, j, ... k may be a mixture of integers and 1-d arrays, or</div><div class='add'>+ * a single 2-d array of indices.  The 2-d index array is generated by the</div><div class='add'>+ * 'where' function.</div><div class='add'>+ *</div><div class='add'>+ * If ARRAY is of type DataType, then this function will create an array of</div><div class='add'>+ * the appropriate type.  In that case, the indices i, j, ..., k must be</div><div class='add'>+ * integers.</div><div class='add'>+ */</div><div class='add'>+int _SLarray_aget (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int num_indices;</div><div class='add'>+   int type;</div><div class='add'>+   int (*aget_fun) (unsigned char, unsigned int);</div><div class='add'>+</div><div class='add'>+   num_indices = (SLang_Num_Function_Args - 1);</div><div class='add'>+</div><div class='add'>+   type = SLang_peek_at_stack ();</div><div class='add'>+   switch (type)</div><div class='add'>+     {</div><div class='add'>+      case -1:</div><div class='add'>+	return -1;		       /* stack underflow */</div><div class='add'>+</div><div class='add'>+      case SLANG_DATATYPE_TYPE:</div><div class='add'>+	return push_create_new_array ();</div><div class='add'>+</div><div class='add'>+      case SLANG_BSTRING_TYPE:</div><div class='add'>+	if (1 == num_indices)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_BString_Type *bs;</div><div class='add'>+	     int ret;</div><div class='add'>+	     unsigned int len;</div><div class='add'>+	     unsigned char *s;</div><div class='add'>+</div><div class='add'>+	     if (-1 == SLang_pop_bstring (&amp;bs))</div><div class='add'>+	       return -1;</div><div class='add'>+</div><div class='add'>+	     if (NULL == (s = SLbstring_get_pointer (bs, &amp;len)))</div><div class='add'>+	       ret = -1;</div><div class='add'>+	     else</div><div class='add'>+	       ret = push_string_element (type, s, len);</div><div class='add'>+</div><div class='add'>+	     SLbstring_free (bs);</div><div class='add'>+	     return ret;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_STRING_TYPE:</div><div class='add'>+	if (1 == num_indices)</div><div class='add'>+	  {</div><div class='add'>+	     char *s;</div><div class='add'>+	     int ret;</div><div class='add'>+</div><div class='add'>+	     if (-1 == SLang_pop_slstring (&amp;s))</div><div class='add'>+	       return -1;</div><div class='add'>+</div><div class='add'>+	     ret = push_string_element (type, (unsigned char *)s, strlen (s));</div><div class='add'>+	     SLang_free_slstring (s);</div><div class='add'>+	     return ret;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_ARRAY_TYPE:</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	aget_fun = _SLclass_get_class (type)-&gt;cl_aget;</div><div class='add'>+	if (NULL != aget_fun)</div><div class='add'>+	  return (*aget_fun) (type, num_indices);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return aget_from_array (num_indices);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_SLarray_aput_transfer_elem (SLang_Array_Type *at, int *indices,</div><div class='add'>+			     VOID_STAR data_to_put, unsigned int sizeof_type, int is_ptr)</div><div class='add'>+{</div><div class='add'>+   VOID_STAR at_data;</div><div class='add'>+</div><div class='add'>+   /* Since 1 element is being transferred, there is no need to coerse</div><div class='add'>+    * the array to linear.</div><div class='add'>+    */</div><div class='add'>+   if (NULL == (at_data = get_data_addr (at, indices)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return transfer_n_elements (at, at_data, data_to_put, sizeof_type, 1, is_ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+aput_get_array_to_put (SLang_Class_Type *cl, unsigned int num_elements, int allow_array,</div><div class='add'>+		       SLang_Array_Type **at_ptr, char **data_to_put, unsigned int *data_increment)</div><div class='add'>+{</div><div class='add'>+   unsigned char data_type;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   *at_ptr = NULL;</div><div class='add'>+</div><div class='add'>+   data_type = cl-&gt;cl_data_type;</div><div class='add'>+   if (-1 == SLclass_typecast (data_type, 1, allow_array))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((data_type != SLANG_ARRAY_TYPE)</div><div class='add'>+       &amp;&amp; (data_type != SLANG_ANY_TYPE)</div><div class='add'>+       &amp;&amp; (SLANG_ARRAY_TYPE == SLang_peek_at_stack ()))</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLang_pop_array (&amp;at, 0))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	if ((at-&gt;num_elements != num_elements)</div><div class='add'>+#if 0</div><div class='add'>+	    || (at-&gt;num_dims != 1)</div><div class='add'>+#endif</div><div class='add'>+	    )</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_TYPE_MISMATCH, "Array size is inappropriate for use with index-array");</div><div class='add'>+	     SLang_free_array (at);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	*data_to_put = (char *) at-&gt;data;</div><div class='add'>+	*data_increment = at-&gt;sizeof_type;</div><div class='add'>+	*at_ptr = at;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *data_increment = 0;</div><div class='add'>+   *data_to_put = (char *) cl-&gt;cl_transfer_buf;</div><div class='add'>+</div><div class='add'>+   if (-1 == (*cl-&gt;cl_apop)(data_type, (VOID_STAR) *data_to_put))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+aput_from_indices (SLang_Array_Type *at,</div><div class='add'>+		   SLang_Object_Type *index_objs, unsigned int num_indices)</div><div class='add'>+{</div><div class='add'>+   int *index_data [SLARRAY_MAX_DIMS];</div><div class='add'>+   int range_buf [SLARRAY_MAX_DIMS];</div><div class='add'>+   int range_delta_buf [SLARRAY_MAX_DIMS];</div><div class='add'>+   int max_dims [SLARRAY_MAX_DIMS];</div><div class='add'>+   unsigned int i, num_elements;</div><div class='add'>+   SLang_Array_Type *bt;</div><div class='add'>+   int map_indices[SLARRAY_MAX_DIMS];</div><div class='add'>+   int indices [SLARRAY_MAX_DIMS];</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   int is_ptr, is_array, ret;</div><div class='add'>+   char *data_to_put;</div><div class='add'>+   unsigned int data_increment;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   int is_dim_array [SLARRAY_MAX_DIMS];</div><div class='add'>+</div><div class='add'>+   if (-1 == convert_nasty_index_objs (at, index_objs, num_indices,</div><div class='add'>+				       index_data, range_buf, range_delta_buf,</div><div class='add'>+				       max_dims, &amp;num_elements, &amp;is_array,</div><div class='add'>+				       is_dim_array))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   cl = at-&gt;cl;</div><div class='add'>+</div><div class='add'>+   if (-1 == aput_get_array_to_put (cl, num_elements, is_array,</div><div class='add'>+				    &amp;bt, &amp;data_to_put, &amp;data_increment))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   sizeof_type = at-&gt;sizeof_type;</div><div class='add'>+   is_ptr = (at-&gt;flags &amp; SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+</div><div class='add'>+   ret = -1;</div><div class='add'>+</div><div class='add'>+   SLMEMSET((char *) map_indices, 0, sizeof(map_indices));</div><div class='add'>+   if (num_elements) do</div><div class='add'>+     {</div><div class='add'>+	for (i = 0; i &lt; num_indices; i++)</div><div class='add'>+	  {</div><div class='add'>+	     int j;</div><div class='add'>+</div><div class='add'>+	     j = map_indices[i];</div><div class='add'>+</div><div class='add'>+	     if (0 != range_delta_buf[i])</div><div class='add'>+	       indices[i] = range_buf[i] + j * range_delta_buf[i];</div><div class='add'>+	     else</div><div class='add'>+	       indices[i] = index_data [i][j];</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (-1 == _SLarray_aput_transfer_elem (at, indices, (VOID_STAR)data_to_put, sizeof_type, is_ptr))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	data_to_put += data_increment;</div><div class='add'>+     }</div><div class='add'>+   while (0 == next_index (map_indices, max_dims, num_indices));</div><div class='add'>+</div><div class='add'>+   ret = 0;</div><div class='add'>+</div><div class='add'>+   /* drop */</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   if (bt == NULL)</div><div class='add'>+     {</div><div class='add'>+	if (is_ptr)</div><div class='add'>+	  (*cl-&gt;cl_destroy) (cl-&gt;cl_data_type, (VOID_STAR) data_to_put);</div><div class='add'>+     }</div><div class='add'>+   else SLang_free_array (bt);</div><div class='add'>+</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+aput_from_index_array (SLang_Array_Type *at, SLang_Array_Type *ind_at)</div><div class='add'>+{</div><div class='add'>+   int *indices, *indices_max;</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   char *data_to_put, *dest_data;</div><div class='add'>+   unsigned int data_increment;</div><div class='add'>+   int is_ptr;</div><div class='add'>+   SLang_Array_Type *bt;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   if (-1 == coerse_array_to_linear (at))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == coerse_array_to_linear (ind_at))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == check_index_array_ranges (at, ind_at))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   sizeof_type = at-&gt;sizeof_type;</div><div class='add'>+</div><div class='add'>+   cl = at-&gt;cl;</div><div class='add'>+</div><div class='add'>+   /* Note that if bt is returned as non NULL, then the array is a linear</div><div class='add'>+    * one.</div><div class='add'>+    */</div><div class='add'>+   if (-1 == aput_get_array_to_put (cl, ind_at-&gt;num_elements, 1,</div><div class='add'>+				    &amp;bt, &amp;data_to_put, &amp;data_increment))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* Since the index array is linear, I can address it directly */</div><div class='add'>+   indices = (int *) ind_at-&gt;data;</div><div class='add'>+   indices_max = indices + ind_at-&gt;num_elements;</div><div class='add'>+</div><div class='add'>+   is_ptr = (at-&gt;flags &amp; SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+   dest_data = (char *) at-&gt;data;</div><div class='add'>+</div><div class='add'>+   ret = -1;</div><div class='add'>+   while (indices &lt; indices_max)</div><div class='add'>+     {</div><div class='add'>+	unsigned int offset;</div><div class='add'>+</div><div class='add'>+	offset = sizeof_type * (unsigned int)*indices;</div><div class='add'>+</div><div class='add'>+	if (-1 == transfer_n_elements (at, (VOID_STAR) (dest_data + offset),</div><div class='add'>+				       (VOID_STAR) data_to_put, sizeof_type, 1,</div><div class='add'>+				       is_ptr))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	indices++;</div><div class='add'>+	data_to_put += data_increment;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   ret = 0;</div><div class='add'>+   /* Drop */</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+</div><div class='add'>+   if (bt == NULL)</div><div class='add'>+     {</div><div class='add'>+	if (is_ptr)</div><div class='add'>+	  (*cl-&gt;cl_destroy) (cl-&gt;cl_data_type, (VOID_STAR)data_to_put);</div><div class='add'>+     }</div><div class='add'>+   else SLang_free_array (bt);</div><div class='add'>+</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* ARRAY[i, j, k] = generates code: __args i j k ARRAY __aput</div><div class='add'>+ */</div><div class='add'>+int _SLarray_aput (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int num_indices;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   SLang_Object_Type index_objs [SLARRAY_MAX_DIMS];</div><div class='add'>+   int ret;</div><div class='add'>+   int is_index_array;</div><div class='add'>+   int (*aput_fun) (unsigned char, unsigned int);</div><div class='add'>+   int type;</div><div class='add'>+</div><div class='add'>+   ret = -1;</div><div class='add'>+   num_indices = (SLang_Num_Function_Args - 1);</div><div class='add'>+</div><div class='add'>+   type = SLang_peek_at_stack ();</div><div class='add'>+   switch (type)</div><div class='add'>+     {</div><div class='add'>+      case -1:</div><div class='add'>+	return -1;</div><div class='add'>+</div><div class='add'>+      case SLANG_ARRAY_TYPE:</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	if (NULL != (aput_fun = _SLclass_get_class (type)-&gt;cl_aput))</div><div class='add'>+	  return (*aput_fun) (type, num_indices);</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_array (&amp;at, 0))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (at-&gt;flags &amp; SLARR_DATA_VALUE_IS_READ_ONLY)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_READONLY_ERROR, "%s Array is read-only",</div><div class='add'>+		      SLclass_get_datatype_name (at-&gt;data_type));</div><div class='add'>+	SLang_free_array (at);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == pop_indices (index_objs, num_indices, &amp;is_index_array))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_array (at);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (is_index_array == 0)</div><div class='add'>+     ret = aput_from_indices (at, index_objs, num_indices);</div><div class='add'>+   else</div><div class='add'>+     ret = aput_from_index_array (at, index_objs[0].v.array_val);</div><div class='add'>+</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+   free_index_objects (index_objs, num_indices);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is for 1-d matrices only.  It is used by the sort function */</div><div class='add'>+static int push_element_at_index (SLang_Array_Type *at, int indx)</div><div class='add'>+{</div><div class='add'>+   VOID_STAR data;</div><div class='add'>+</div><div class='add'>+   if (NULL == (data = get_data_addr (at, &amp;indx)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return push_element_at_addr (at, (VOID_STAR) data, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Name_Type *Sort_Function;</div><div class='add'>+static SLang_Array_Type *Sort_Array;</div><div class='add'>+</div><div class='add'>+static int sort_cmp_fun (int *a, int *b)</div><div class='add'>+{</div><div class='add'>+   int cmp;</div><div class='add'>+</div><div class='add'>+   if (SLang_Error</div><div class='add'>+       || (-1 == push_element_at_index (Sort_Array, *a))</div><div class='add'>+       || (-1 == push_element_at_index (Sort_Array, *b))</div><div class='add'>+       || (-1 == SLexecute_function (Sort_Function))</div><div class='add'>+       || (-1 == SLang_pop_integer (&amp;cmp)))</div><div class='add'>+     {</div><div class='add'>+	/* DO not allow qsort to loop forever.  Return something meaningful */</div><div class='add'>+	if (*a &gt; *b) return 1;</div><div class='add'>+	if (*a &lt; *b) return -1;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return cmp;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int builtin_sort_cmp_fun (int *a, int *b)</div><div class='add'>+{</div><div class='add'>+   VOID_STAR a_data;</div><div class='add'>+   VOID_STAR b_data;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   </div><div class='add'>+   cl = Sort_Array-&gt;cl;</div><div class='add'>+</div><div class='add'>+   if ((SLang_Error == 0)</div><div class='add'>+       &amp;&amp; (NULL != (a_data = get_data_addr (Sort_Array, a)))</div><div class='add'>+       &amp;&amp; (NULL != (b_data = get_data_addr (Sort_Array, b))))</div><div class='add'>+     {</div><div class='add'>+	int cmp;</div><div class='add'>+</div><div class='add'>+	if ((Sort_Array-&gt;flags &amp; SLARR_DATA_VALUE_IS_POINTER)</div><div class='add'>+	    &amp;&amp; ((*(VOID_STAR *) a_data == NULL) || (*(VOID_STAR *) a_data == NULL)))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_VARIABLE_UNINITIALIZED,</div><div class='add'>+			   "%s array has unitialized element", cl-&gt;cl_name);</div><div class='add'>+	  }</div><div class='add'>+	else if (0 == (*cl-&gt;cl_cmp)(Sort_Array-&gt;data_type, a_data, b_data, &amp;cmp))</div><div class='add'>+	  return cmp;</div><div class='add'>+     }</div><div class='add'>+       </div><div class='add'>+       </div><div class='add'>+   if (*a &gt; *b) return 1;</div><div class='add'>+   if (*a == *b) return 0;</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sort_array_internal (SLang_Array_Type *at_str, </div><div class='add'>+				 SLang_Name_Type *entry,</div><div class='add'>+				 int (*sort_fun)(int *, int *))</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *ind_at;</div><div class='add'>+   /* This is a silly hack to make up for braindead compilers and the lack of</div><div class='add'>+    * uniformity in prototypes for qsort.</div><div class='add'>+    */</div><div class='add'>+   void (*qsort_fun) (char *, unsigned int, int, int (*)(int *, int *));</div><div class='add'>+   int *indx;</div><div class='add'>+   int i, n;</div><div class='add'>+   int dims[1];</div><div class='add'>+</div><div class='add'>+   if (Sort_Array != NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED, "array_sort is not recursive");</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   n = at_str-&gt;num_elements;</div><div class='add'>+</div><div class='add'>+   if (at_str-&gt;num_dims != 1)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "sort is restricted to 1 dim arrays");</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   dims [0] = n;</div><div class='add'>+</div><div class='add'>+   if (NULL == (ind_at = SLang_create_array (SLANG_INT_TYPE, 0, NULL, dims, 1)))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   indx = (int *) ind_at-&gt;data;</div><div class='add'>+   for (i = 0; i &lt; n; i++) indx[i] = i;</div><div class='add'>+</div><div class='add'>+   if (n &gt; 1)</div><div class='add'>+     {</div><div class='add'>+	qsort_fun = (void (*)(char *, unsigned int, int, int (*)(int *,</div><div class='add'>+								 int *)))</div><div class='add'>+	  qsort;</div><div class='add'>+</div><div class='add'>+	Sort_Array = at_str;</div><div class='add'>+	Sort_Function = entry;</div><div class='add'>+	(*qsort_fun) ((char *) indx, n, sizeof (int), sort_fun);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Sort_Array = NULL;</div><div class='add'>+   (void) SLang_push_array (ind_at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sort_array (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Name_Type *entry;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   int (*sort_fun) (int *, int *);</div><div class='add'>+</div><div class='add'>+   if (SLang_Num_Function_Args != 1)</div><div class='add'>+     {</div><div class='add'>+	sort_fun = sort_cmp_fun;</div><div class='add'>+</div><div class='add'>+	if (NULL == (entry = SLang_pop_function ()))</div><div class='add'>+	  return;</div><div class='add'>+</div><div class='add'>+	if (-1 == SLang_pop_array (&amp;at, 1))</div><div class='add'>+	  return;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	sort_fun = builtin_sort_cmp_fun;</div><div class='add'>+	if (-1 == SLang_pop_array (&amp;at, 1))</div><div class='add'>+	  return;</div><div class='add'>+	if (at-&gt;cl-&gt;cl_cmp == NULL)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_NOT_IMPLEMENTED, </div><div class='add'>+			   "%s does not have a predefined sorting method",</div><div class='add'>+			   at-&gt;cl-&gt;cl_name);</div><div class='add'>+	     SLang_free_array (at);</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+	entry = NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   sort_array_internal (at, entry, sort_fun);</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+   SLang_free_function (entry);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void bstring_to_array (SLang_BString_Type *bs)</div><div class='add'>+{</div><div class='add'>+   unsigned char *s;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   </div><div class='add'>+   if (NULL == (s = SLbstring_get_pointer (bs, &amp;len)))</div><div class='add'>+     (void) SLang_push_null ();</div><div class='add'>+   else</div><div class='add'>+     (void) push_string_as_array (s, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_to_bstring (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+   unsigned int nbytes;</div><div class='add'>+   SLang_BString_Type *bs;</div><div class='add'>+</div><div class='add'>+   nbytes = at-&gt;num_elements * at-&gt;sizeof_type;</div><div class='add'>+   bs = SLbstring_create ((unsigned char *)at-&gt;data, nbytes);</div><div class='add'>+   (void) SLang_push_bstring (bs);</div><div class='add'>+   SLbstring_free (bs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void init_char_array (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   char *s;</div><div class='add'>+   unsigned int n, ndim;</div><div class='add'>+</div><div class='add'>+   if (SLang_pop_slstring (&amp;s)) return;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_array (&amp;at, 0))</div><div class='add'>+     goto free_and_return;</div><div class='add'>+</div><div class='add'>+   if (at-&gt;data_type != SLANG_CHAR_TYPE)</div><div class='add'>+     {</div><div class='add'>+	SLang_doerror("Operation requires character array");</div><div class='add'>+	goto free_and_return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   n = strlen (s);</div><div class='add'>+   ndim = at-&gt;num_elements;</div><div class='add'>+   if (n &gt; ndim)</div><div class='add'>+     {</div><div class='add'>+	SLang_doerror("String too big to init array");</div><div class='add'>+	goto free_and_return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   strncpy((char *) at-&gt;data, s, ndim);</div><div class='add'>+   /* drop */</div><div class='add'>+</div><div class='add'>+   free_and_return:</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+   SLang_free_slstring (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_info (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at, *bt;</div><div class='add'>+   int num_dims;</div><div class='add'>+</div><div class='add'>+   if (-1 == pop_array (&amp;at, 1))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   num_dims = (int)at-&gt;num_dims;</div><div class='add'>+</div><div class='add'>+   if (NULL != (bt = SLang_create_array (SLANG_INT_TYPE, 0, NULL, &amp;num_dims, 1)))</div><div class='add'>+     {</div><div class='add'>+	int *bdata;</div><div class='add'>+	int i;</div><div class='add'>+	int *a_dims;</div><div class='add'>+</div><div class='add'>+	a_dims = at-&gt;dims;</div><div class='add'>+	bdata = (int *) bt-&gt;data;</div><div class='add'>+	for (i = 0; i &lt; num_dims; i++) bdata [i] = a_dims [i];</div><div class='add'>+</div><div class='add'>+	if (0 == SLang_push_array (bt, 1))</div><div class='add'>+	  {</div><div class='add'>+	     (void) SLang_push_integer ((int) at-&gt;num_dims);</div><div class='add'>+	     (void) _SLang_push_datatype (at-&gt;data_type);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static VOID_STAR range_get_data_addr (SLang_Array_Type *at, int *dims)</div><div class='add'>+{</div><div class='add'>+   static int value;</div><div class='add'>+   SLarray_Range_Array_Type *r;</div><div class='add'>+   int d;</div><div class='add'>+</div><div class='add'>+   d = *dims;</div><div class='add'>+   r = (SLarray_Range_Array_Type *)at-&gt;data;</div><div class='add'>+</div><div class='add'>+   if (d &lt; 0)</div><div class='add'>+     d += at-&gt;dims[0];</div><div class='add'>+</div><div class='add'>+   value = r-&gt;first_index + d * r-&gt;delta;</div><div class='add'>+   return (VOID_STAR) &amp;value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Array_Type *inline_implicit_int_array (int *xminptr, int *xmaxptr, int *dxptr)</div><div class='add'>+{</div><div class='add'>+   int delta;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   int dims, idims;</div><div class='add'>+   SLarray_Range_Array_Type *data;</div><div class='add'>+</div><div class='add'>+   if (dxptr == NULL) delta = 1;</div><div class='add'>+   else delta = *dxptr;</div><div class='add'>+</div><div class='add'>+   if (delta == 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "range-array increment must be non-zero");</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   data = (SLarray_Range_Array_Type *) SLmalloc (sizeof (SLarray_Range_Array_Type));</div><div class='add'>+   if (data == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   SLMEMSET((char *) data, 0, sizeof (SLarray_Range_Array_Type));</div><div class='add'>+   data-&gt;delta = delta;</div><div class='add'>+   dims = 0;</div><div class='add'>+</div><div class='add'>+   if (xminptr != NULL)</div><div class='add'>+     data-&gt;first_index = *xminptr;</div><div class='add'>+   else</div><div class='add'>+     data-&gt;first_index = 0;</div><div class='add'>+</div><div class='add'>+   if (xmaxptr != NULL)</div><div class='add'>+     data-&gt;last_index = *xmaxptr;</div><div class='add'>+   else</div><div class='add'>+     data-&gt;last_index = -1;</div><div class='add'>+</div><div class='add'>+/*   if ((xminptr != NULL) &amp;&amp; (xmaxptr != NULL))</div><div class='add'>+     { */</div><div class='add'>+	idims = 1 + (data-&gt;last_index - data-&gt;first_index) / delta;</div><div class='add'>+	if (idims &gt; 0)</div><div class='add'>+	  dims = idims;</div><div class='add'>+    /* } */</div><div class='add'>+</div><div class='add'>+   if (NULL == (at = SLang_create_array (SLANG_INT_TYPE, 0, (VOID_STAR) data, &amp;dims, 1)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   at-&gt;index_fun = range_get_data_addr;</div><div class='add'>+   at-&gt;flags |= SLARR_DATA_VALUE_IS_RANGE;</div><div class='add'>+</div><div class='add'>+   return at;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+static SLang_Array_Type *inline_implicit_floating_array (unsigned char type,</div><div class='add'>+							 double *xminptr, double *xmaxptr, double *dxptr)</div><div class='add'>+{</div><div class='add'>+   int n, i;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   int dims;</div><div class='add'>+   double xmin, xmax, dx;</div><div class='add'>+</div><div class='add'>+   if ((xminptr == NULL) || (xmaxptr == NULL))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "range-array has unknown size");</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   xmin = *xminptr;</div><div class='add'>+   xmax = *xmaxptr;</div><div class='add'>+   if (dxptr == NULL) dx = 1.0;</div><div class='add'>+   else dx = *dxptr;</div><div class='add'>+</div><div class='add'>+   if (dx == 0.0)</div><div class='add'>+     {</div><div class='add'>+	SLang_doerror ("range-array increment must be non-zero");</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* I have convinced myself that it is better to use semi-open intervals</div><div class='add'>+    * because of less ambiguities.  So, [a:b:c] will represent the set of</div><div class='add'>+    * values a, a + c, a + 2c ... a + nc</div><div class='add'>+    * such that a + nc &lt; b.  That is, b lies outside the interval.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   /* Allow for roundoff by adding 0.5 before truncation */</div><div class='add'>+   n = (int)(1.5 + ((xmax - xmin) / dx));</div><div class='add'>+   if (n &lt;= 0)</div><div class='add'>+     n = 0;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	double last = xmin + (n-1) * dx;</div><div class='add'>+</div><div class='add'>+	if (dx &gt; 0.0)</div><div class='add'>+	  {</div><div class='add'>+	     if (last &gt;= xmax)</div><div class='add'>+	       n -= 1;</div><div class='add'>+	  }</div><div class='add'>+	else if (last &lt;= xmax)</div><div class='add'>+	  n -= 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   dims = n;</div><div class='add'>+   if (NULL == (at = SLang_create_array1 (type, 0, NULL, &amp;dims, 1, 1)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   if (type == SLANG_DOUBLE_TYPE)</div><div class='add'>+     {</div><div class='add'>+	double *ptr;</div><div class='add'>+</div><div class='add'>+	ptr = (double *) at-&gt;data;</div><div class='add'>+</div><div class='add'>+	for (i = 0; i &lt; n; i++)</div><div class='add'>+	  ptr[i] = xmin + i * dx;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	float *ptr;</div><div class='add'>+</div><div class='add'>+	ptr = (float *) at-&gt;data;</div><div class='add'>+</div><div class='add'>+	for (i = 0; i &lt; n; i++)</div><div class='add'>+	  ptr[i] = (float) (xmin + i * dx);</div><div class='add'>+     }</div><div class='add'>+   return at;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* FIXME: Priority=medium</div><div class='add'>+ * This needs to be updated to work with all integer types.</div><div class='add'>+ */</div><div class='add'>+int _SLarray_inline_implicit_array (void)</div><div class='add'>+{</div><div class='add'>+   int int_vals[3];</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   double double_vals[3];</div><div class='add'>+#endif</div><div class='add'>+   int has_vals[3];</div><div class='add'>+   unsigned int i, count;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   int precedence;</div><div class='add'>+   unsigned char type;</div><div class='add'>+   int is_int;</div><div class='add'>+</div><div class='add'>+   count = SLang_Num_Function_Args;</div><div class='add'>+</div><div class='add'>+   if (count == 2)</div><div class='add'>+     has_vals [2] = 0;</div><div class='add'>+   else if (count != 3)</div><div class='add'>+     {</div><div class='add'>+	SLang_doerror ("wrong number of arguments to __implicit_inline_array");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   is_int = 1;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   type = 0;</div><div class='add'>+   precedence = 0;</div><div class='add'>+</div><div class='add'>+   i = count;</div><div class='add'>+   while (i--)</div><div class='add'>+     {</div><div class='add'>+	int this_type, this_precedence;</div><div class='add'>+</div><div class='add'>+	if (-1 == (this_type = SLang_peek_at_stack ()))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	this_precedence = _SLarith_get_precedence ((unsigned char) this_type);</div><div class='add'>+	if (precedence &lt; this_precedence)</div><div class='add'>+	  {</div><div class='add'>+	     type = (unsigned char) this_type;</div><div class='add'>+	     precedence = this_precedence;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	has_vals [i] = 1;</div><div class='add'>+</div><div class='add'>+	switch (this_type)</div><div class='add'>+	  {</div><div class='add'>+	   case SLANG_NULL_TYPE:</div><div class='add'>+	     has_vals[i] = 0;</div><div class='add'>+	     (void) SLdo_pop ();</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	   case SLANG_DOUBLE_TYPE:</div><div class='add'>+	   case SLANG_FLOAT_TYPE:</div><div class='add'>+	     if (-1 == SLang_pop_double (double_vals + i, NULL, NULL))</div><div class='add'>+	       return -1;</div><div class='add'>+	     is_int = 0;</div><div class='add'>+	     break;</div><div class='add'>+#endif</div><div class='add'>+	   default:</div><div class='add'>+	     if (-1 == SLang_pop_integer (int_vals + i))</div><div class='add'>+	       return -1;</div><div class='add'>+	     double_vals[i] = (double) int_vals[i];</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   if (is_int == 0)</div><div class='add'>+     at = inline_implicit_floating_array (type,</div><div class='add'>+					  (has_vals[0] ? &amp;double_vals[0] : NULL),</div><div class='add'>+					  (has_vals[1] ? &amp;double_vals[1] : NULL),</div><div class='add'>+					  (has_vals[2] ? &amp;double_vals[2] : NULL));</div><div class='add'>+   else</div><div class='add'>+#endif</div><div class='add'>+     at = inline_implicit_int_array ((has_vals[0] ? &amp;int_vals[0] : NULL),</div><div class='add'>+				     (has_vals[1] ? &amp;int_vals[1] : NULL),</div><div class='add'>+				     (has_vals[2] ? &amp;int_vals[2] : NULL));</div><div class='add'>+</div><div class='add'>+   if (at == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLarray_wildcard_array (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+     </div><div class='add'>+   if (NULL == (at = inline_implicit_int_array (NULL, NULL, NULL)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Array_Type *concat_arrays (unsigned int count)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type **arrays;</div><div class='add'>+   SLang_Array_Type *at, *bt;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   int num_elements;</div><div class='add'>+   unsigned char type;</div><div class='add'>+   char *src_data, *dest_data;</div><div class='add'>+   int is_ptr;</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   int max_dims, min_dims, max_rows, min_rows;</div><div class='add'>+</div><div class='add'>+   arrays = (SLang_Array_Type **)SLmalloc (count * sizeof (SLang_Array_Type *));</div><div class='add'>+   if (arrays == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLdo_pop_n (count);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   SLMEMSET((char *) arrays, 0, count * sizeof(SLang_Array_Type *));</div><div class='add'>+</div><div class='add'>+   at = NULL;</div><div class='add'>+</div><div class='add'>+   num_elements = 0;</div><div class='add'>+   i = count;</div><div class='add'>+</div><div class='add'>+   while (i != 0)</div><div class='add'>+     {</div><div class='add'>+	i--;</div><div class='add'>+</div><div class='add'>+	if (-1 == SLang_pop_array (&amp;bt, 1))</div><div class='add'>+	  goto free_and_return;</div><div class='add'>+</div><div class='add'>+	arrays[i] = bt;</div><div class='add'>+	num_elements += (int)bt-&gt;num_elements;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   type = arrays[0]-&gt;data_type;</div><div class='add'>+   max_dims = min_dims = arrays[0]-&gt;num_dims;</div><div class='add'>+   min_rows = max_rows = arrays[0]-&gt;dims[0];</div><div class='add'>+</div><div class='add'>+   for (i = 1; i &lt; count; i++)</div><div class='add'>+     {</div><div class='add'>+	SLang_Array_Type *ct;</div><div class='add'>+	int num;</div><div class='add'>+</div><div class='add'>+	bt = arrays[i];</div><div class='add'>+</div><div class='add'>+	num = bt-&gt;num_dims;</div><div class='add'>+	if (num &gt; max_dims) max_dims = num;</div><div class='add'>+	if (num &lt; min_dims) min_dims = num;</div><div class='add'>+</div><div class='add'>+	num = bt-&gt;dims[0];</div><div class='add'>+	if (num &gt; max_rows) max_rows = num;</div><div class='add'>+	if (num &lt; min_rows) min_rows = num;</div><div class='add'>+</div><div class='add'>+	if (type == bt-&gt;data_type)</div><div class='add'>+	  continue;</div><div class='add'>+</div><div class='add'>+	if (1 != _SLarray_typecast (bt-&gt;data_type, (VOID_STAR) &amp;bt, 1,</div><div class='add'>+				    type, (VOID_STAR) &amp;ct, 1))</div><div class='add'>+	  goto free_and_return;</div><div class='add'>+</div><div class='add'>+	SLang_free_array (bt);</div><div class='add'>+	arrays [i] = ct;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (at = SLang_create_array (type, 0, NULL, &amp;num_elements, 1)))</div><div class='add'>+     goto free_and_return;</div><div class='add'>+</div><div class='add'>+   is_ptr = (at-&gt;flags &amp; SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+   sizeof_type = at-&gt;sizeof_type;</div><div class='add'>+   dest_data = (char *) at-&gt;data;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; count; i++)</div><div class='add'>+     {</div><div class='add'>+	bt = arrays[i];</div><div class='add'>+</div><div class='add'>+	src_data = (char *) bt-&gt;data;</div><div class='add'>+	num_elements = bt-&gt;num_elements;</div><div class='add'>+</div><div class='add'>+	if (-1 == transfer_n_elements (bt, (VOID_STAR)dest_data, (VOID_STAR)src_data, sizeof_type,</div><div class='add'>+				       num_elements, is_ptr))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_array (at);</div><div class='add'>+	     at = NULL;</div><div class='add'>+	     goto free_and_return;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	dest_data += num_elements * sizeof_type;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* If the arrays are all 1-d, and all the same size, then reshape to a</div><div class='add'>+    * 2-d array.  This will allow us to do, e.g.</div><div class='add'>+    * a = [[1,2], [3,4]]</div><div class='add'>+    * to specifiy a 2-d.</div><div class='add'>+    * Someday I will generalize this.</div><div class='add'>+    */</div><div class='add'>+   if ((max_dims == min_dims) &amp;&amp; (max_dims == 1) &amp;&amp; (min_rows == max_rows))</div><div class='add'>+     {</div><div class='add'>+	at-&gt;num_dims = 2;</div><div class='add'>+	at-&gt;dims[0] = count;</div><div class='add'>+	at-&gt;dims[1] = min_rows;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   free_and_return:</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; count; i++)</div><div class='add'>+     SLang_free_array (arrays[i]);</div><div class='add'>+   SLfree ((char *) arrays);</div><div class='add'>+</div><div class='add'>+   return at;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLarray_inline_array (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type *obj;</div><div class='add'>+   unsigned char type, this_type;</div><div class='add'>+   unsigned int count;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   obj = _SLStack_Pointer;</div><div class='add'>+</div><div class='add'>+   count = SLang_Num_Function_Args;</div><div class='add'>+   type = 0;</div><div class='add'>+</div><div class='add'>+   while ((count &gt; 0) &amp;&amp; (--obj &gt;= _SLRun_Stack))</div><div class='add'>+     {</div><div class='add'>+	this_type = obj-&gt;data_type;</div><div class='add'>+</div><div class='add'>+	if (type == 0)</div><div class='add'>+	  type = this_type;</div><div class='add'>+</div><div class='add'>+	if ((type == this_type) || (type == SLANG_ARRAY_TYPE))</div><div class='add'>+	  {</div><div class='add'>+	     count--;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	switch (this_type)</div><div class='add'>+	  {</div><div class='add'>+	   case SLANG_ARRAY_TYPE:</div><div class='add'>+	     type = SLANG_ARRAY_TYPE;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case SLANG_INT_TYPE:</div><div class='add'>+	     switch (type)</div><div class='add'>+	       {</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+		case SLANG_DOUBLE_TYPE:</div><div class='add'>+		  break;</div><div class='add'>+#endif</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+		case SLANG_COMPLEX_TYPE:</div><div class='add'>+		  break;</div><div class='add'>+#endif</div><div class='add'>+		default:</div><div class='add'>+		  goto type_mismatch;</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	   case SLANG_DOUBLE_TYPE:</div><div class='add'>+	     switch (type)</div><div class='add'>+	       {</div><div class='add'>+		case SLANG_INT_TYPE:</div><div class='add'>+		  type = SLANG_DOUBLE_TYPE;</div><div class='add'>+		  break;</div><div class='add'>+# if SLANG_HAS_COMPLEX</div><div class='add'>+		case SLANG_COMPLEX_TYPE:</div><div class='add'>+		  break;</div><div class='add'>+# endif</div><div class='add'>+		default:</div><div class='add'>+		  goto type_mismatch;</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+#endif</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+	   case SLANG_COMPLEX_TYPE:</div><div class='add'>+	     switch (type)</div><div class='add'>+	       {</div><div class='add'>+		case SLANG_INT_TYPE:</div><div class='add'>+		case SLANG_DOUBLE_TYPE:</div><div class='add'>+		  type = SLANG_COMPLEX_TYPE;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		default:</div><div class='add'>+		  goto type_mismatch;</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+#endif</div><div class='add'>+	   default:</div><div class='add'>+	     type_mismatch:</div><div class='add'>+	     _SLclass_type_mismatch_error (type, this_type);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	count--;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (count != 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_STACK_UNDERFLOW;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   count = SLang_Num_Function_Args;</div><div class='add'>+</div><div class='add'>+   if (count == 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED, "Empty inline-arrays not supported");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (type == SLANG_ARRAY_TYPE)</div><div class='add'>+     {</div><div class='add'>+	if (NULL == (at = concat_arrays (count)))</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	SLang_Object_Type index_obj;</div><div class='add'>+	int icount = (int) count;</div><div class='add'>+</div><div class='add'>+	if (NULL == (at = SLang_create_array (type, 0, NULL, &amp;icount, 1)))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	index_obj.data_type = SLANG_INT_TYPE;</div><div class='add'>+	while (count != 0)</div><div class='add'>+	  {</div><div class='add'>+	     count--;</div><div class='add'>+	     index_obj.v.int_val = (int) count;</div><div class='add'>+	     if (-1 == aput_from_indices (at, &amp;index_obj, 1))</div><div class='add'>+	       {</div><div class='add'>+		  SLang_free_array (at);</div><div class='add'>+		  SLdo_pop_n (count);</div><div class='add'>+		  return -1;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int array_binary_op_result (int op, unsigned char a, unsigned char b,</div><div class='add'>+				   unsigned char *c)</div><div class='add'>+{</div><div class='add'>+   (void) op;</div><div class='add'>+   (void) a;</div><div class='add'>+   (void) b;</div><div class='add'>+   *c = SLANG_ARRAY_TYPE;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int array_binary_op (int op,</div><div class='add'>+			    unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+			    unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+			    VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at, *bt, *ct;</div><div class='add'>+   unsigned int i, num_dims;</div><div class='add'>+   int (*binary_fun) (int,</div><div class='add'>+		      unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+		      unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+		      VOID_STAR);</div><div class='add'>+   SLang_Class_Type *a_cl, *b_cl, *c_cl;</div><div class='add'>+   int no_init;</div><div class='add'>+</div><div class='add'>+   if (a_type == SLANG_ARRAY_TYPE)</div><div class='add'>+     {</div><div class='add'>+	if (na != 1)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_NOT_IMPLEMENTED, "Binary operation on multiple arrays not implemented");</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	at = *(SLang_Array_Type **) ap;</div><div class='add'>+	if (-1 == coerse_array_to_linear (at))</div><div class='add'>+	  return -1;</div><div class='add'>+	ap = at-&gt;data;</div><div class='add'>+	a_type = at-&gt;data_type;</div><div class='add'>+	na = at-&gt;num_elements;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	at = NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (b_type == SLANG_ARRAY_TYPE)</div><div class='add'>+     {</div><div class='add'>+	if (nb != 1)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_NOT_IMPLEMENTED, "Binary operation on multiple arrays not implemented");</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	bt = *(SLang_Array_Type **) bp;</div><div class='add'>+	if (-1 == coerse_array_to_linear (bt))</div><div class='add'>+	  return -1;</div><div class='add'>+	bp = bt-&gt;data;</div><div class='add'>+	b_type = bt-&gt;data_type;</div><div class='add'>+	nb = bt-&gt;num_elements;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	bt = NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((at != NULL) &amp;&amp; (bt != NULL))</div><div class='add'>+     {</div><div class='add'>+	num_dims = at-&gt;num_dims;</div><div class='add'>+</div><div class='add'>+	if (num_dims != bt-&gt;num_dims)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_TYPE_MISMATCH, "Arrays must have same dim for binary operation");</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	for (i = 0; i &lt; num_dims; i++)</div><div class='add'>+	  {</div><div class='add'>+	     if (at-&gt;dims[i] != bt-&gt;dims[i])</div><div class='add'>+	       {</div><div class='add'>+		  SLang_verror (SL_TYPE_MISMATCH, "Arrays must be the same for binary operation");</div><div class='add'>+		  return -1;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   a_cl = _SLclass_get_class (a_type);</div><div class='add'>+   b_cl = _SLclass_get_class (b_type);</div><div class='add'>+</div><div class='add'>+   if (NULL == (binary_fun = _SLclass_get_binary_fun (op, a_cl, b_cl, &amp;c_cl, 1)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   no_init = ((c_cl-&gt;cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+	      || (c_cl-&gt;cl_class_type == SLANG_CLASS_TYPE_VECTOR));</div><div class='add'>+</div><div class='add'>+   ct = NULL;</div><div class='add'>+#if _SLANG_USE_TMP_OPTIMIZATION</div><div class='add'>+   /* If we are dealing with scalar (or vector) objects, and if the object</div><div class='add'>+    * appears to be owned by the stack, then use it instead of creating a </div><div class='add'>+    * new version.  This can happen with code such as:</div><div class='add'>+    * @  x = [1,2,3,4];</div><div class='add'>+    * @  x = __tmp(x) + 1;</div><div class='add'>+    */</div><div class='add'>+   if (no_init)</div><div class='add'>+     {</div><div class='add'>+	if ((at != NULL) </div><div class='add'>+	    &amp;&amp; (at-&gt;num_refs == 1)</div><div class='add'>+	    &amp;&amp; (at-&gt;data_type == c_cl-&gt;cl_data_type))</div><div class='add'>+	  {</div><div class='add'>+	     ct = at;</div><div class='add'>+	     ct-&gt;num_refs = 2;</div><div class='add'>+	  }</div><div class='add'>+	else if ((bt != NULL) </div><div class='add'>+	    &amp;&amp; (bt-&gt;num_refs == 1)</div><div class='add'>+	    &amp;&amp; (bt-&gt;data_type == c_cl-&gt;cl_data_type))</div><div class='add'>+	  {</div><div class='add'>+	     ct = bt;</div><div class='add'>+	     ct-&gt;num_refs = 2;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+#endif				       /* _SLANG_USE_TMP_OPTIMIZATION */</div><div class='add'>+   </div><div class='add'>+   if (ct == NULL)</div><div class='add'>+     {</div><div class='add'>+	if (at != NULL) ct = at; else ct = bt;</div><div class='add'>+	ct = SLang_create_array1 (c_cl-&gt;cl_data_type, 0, NULL, ct-&gt;dims, ct-&gt;num_dims, no_init);</div><div class='add'>+	if (ct == NULL)</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+   if ((na == 0) || (nb == 0)	       /* allow empty arrays */</div><div class='add'>+       || (1 == (*binary_fun) (op, a_type, ap, na, b_type, bp, nb, ct-&gt;data)))</div><div class='add'>+     {</div><div class='add'>+	*(SLang_Array_Type **) cp = ct;</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_free_array (ct);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_where (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at, *bt;</div><div class='add'>+   char *a_data;</div><div class='add'>+   int *b_data;</div><div class='add'>+   unsigned int i, num_elements;</div><div class='add'>+   int b_num;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_array (&amp;at, 1))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   bt = NULL;</div><div class='add'>+</div><div class='add'>+   if (at-&gt;data_type != SLANG_CHAR_TYPE)</div><div class='add'>+     {</div><div class='add'>+	int zero;</div><div class='add'>+	SLang_Array_Type *tmp_at;</div><div class='add'>+</div><div class='add'>+	tmp_at = at;</div><div class='add'>+	zero = 0;</div><div class='add'>+	if (1 != array_binary_op (SLANG_NE,</div><div class='add'>+				  SLANG_ARRAY_TYPE, (VOID_STAR) &amp;at, 1,</div><div class='add'>+				  SLANG_CHAR_TYPE, (VOID_STAR) &amp;zero, 1,</div><div class='add'>+				  (VOID_STAR) &amp;tmp_at))</div><div class='add'>+	    goto return_error;</div><div class='add'>+</div><div class='add'>+	SLang_free_array (at);</div><div class='add'>+	at = tmp_at;</div><div class='add'>+	if (at-&gt;data_type != SLANG_CHAR_TYPE)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_Error = SL_TYPE_MISMATCH;</div><div class='add'>+	     goto return_error;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   a_data = (char *) at-&gt;data;</div><div class='add'>+   num_elements = at-&gt;num_elements;</div><div class='add'>+</div><div class='add'>+   b_num = 0;</div><div class='add'>+   for (i = 0; i &lt; num_elements; i++)</div><div class='add'>+     if (a_data[i] != 0) b_num++;</div><div class='add'>+</div><div class='add'>+   if (NULL == (bt = SLang_create_array1 (SLANG_INT_TYPE, 0, NULL, &amp;b_num, 1, 1)))</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   b_data = (int *) bt-&gt;data;</div><div class='add'>+</div><div class='add'>+   i = 0;</div><div class='add'>+   while (b_num)</div><div class='add'>+     {</div><div class='add'>+	if (a_data[i] != 0)</div><div class='add'>+	  {</div><div class='add'>+	     *b_data++ = i;</div><div class='add'>+	     b_num--;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	i++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   (void) SLang_push_array (bt, 0);</div><div class='add'>+   /* drop */</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+   SLang_free_array (bt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int do_array_reshape (SLang_Array_Type *at, SLang_Array_Type *ind_at)</div><div class='add'>+{</div><div class='add'>+   int *dims;</div><div class='add'>+   unsigned int i, num_dims;</div><div class='add'>+   unsigned int num_elements;</div><div class='add'>+</div><div class='add'>+   if ((ind_at-&gt;data_type != SLANG_INT_TYPE)</div><div class='add'>+       || (ind_at-&gt;num_dims != 1))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_TYPE_MISMATCH, "Expecting 1-d integer array");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   num_dims = ind_at-&gt;num_elements;</div><div class='add'>+   dims = (int *) ind_at-&gt;data;</div><div class='add'>+</div><div class='add'>+   num_elements = 1;</div><div class='add'>+   for (i = 0; i &lt; num_dims; i++)</div><div class='add'>+     {</div><div class='add'>+	int d = dims[i];</div><div class='add'>+	if (d &lt; 0)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_INVALID_PARM, "reshape: dimension is less then 0");</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	num_elements = (unsigned int) d * num_elements;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((num_elements != at-&gt;num_elements)</div><div class='add'>+       || (num_dims &gt; SLARRAY_MAX_DIMS))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Unable to reshape array to specified size");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; num_dims; i++)</div><div class='add'>+     at-&gt;dims [i] = dims[i];</div><div class='add'>+</div><div class='add'>+   while (i &lt; SLARRAY_MAX_DIMS)</div><div class='add'>+     {</div><div class='add'>+	at-&gt;dims [i] = 1;</div><div class='add'>+	i++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   at-&gt;num_dims = num_dims;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_reshape (SLang_Array_Type *at, SLang_Array_Type *ind_at)</div><div class='add'>+{</div><div class='add'>+   (void) do_array_reshape (at, ind_at);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void _array_reshape (SLang_Array_Type *ind_at)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   SLang_Array_Type *new_at;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_array (&amp;at, 1))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   /* FIXME: Priority=low: duplicate_array could me modified to look at num_refs */</div><div class='add'>+</div><div class='add'>+   /* Now try to avoid the overhead of creating a new array if possible */</div><div class='add'>+   if (at-&gt;num_refs == 1)</div><div class='add'>+     {</div><div class='add'>+	/* Great, we are the sole owner of this array. */</div><div class='add'>+	if ((-1 == do_array_reshape (at, ind_at))</div><div class='add'>+	    || (-1 == SLclass_push_ptr_obj (SLANG_ARRAY_TYPE, (VOID_STAR)at)))</div><div class='add'>+	  SLang_free_array (at);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   new_at = SLang_duplicate_array (at);</div><div class='add'>+   if (new_at != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (0 == do_array_reshape (new_at, ind_at))</div><div class='add'>+	  (void) SLang_push_array (new_at, 0);</div><div class='add'>+	</div><div class='add'>+	SLang_free_array (new_at);</div><div class='add'>+     }</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   unsigned int increment;</div><div class='add'>+   char *addr;</div><div class='add'>+}</div><div class='add'>+Map_Arg_Type;</div><div class='add'>+/* Usage: array_map (Return-Type, func, args,....); */</div><div class='add'>+static void array_map (void)</div><div class='add'>+{</div><div class='add'>+   Map_Arg_Type *args;</div><div class='add'>+   unsigned int num_args;</div><div class='add'>+   unsigned int i, i_control;</div><div class='add'>+   SLang_Name_Type *nt;</div><div class='add'>+   unsigned int num_elements;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   char *addr;</div><div class='add'>+   unsigned char type;</div><div class='add'>+</div><div class='add'>+   at = NULL;</div><div class='add'>+   args = NULL;</div><div class='add'>+   nt = NULL;</div><div class='add'>+</div><div class='add'>+   if (SLang_Num_Function_Args &lt; 3)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM,</div><div class='add'>+		      "Usage: array_map (Return-Type, &amp;func, args...)");</div><div class='add'>+	SLdo_pop_n (SLang_Num_Function_Args);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   num_args = (unsigned int)SLang_Num_Function_Args - 2;</div><div class='add'>+   args = (Map_Arg_Type *) SLmalloc (num_args * sizeof (Map_Arg_Type));</div><div class='add'>+   if (args == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLdo_pop_n (SLang_Num_Function_Args);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   memset ((char *) args, 0, num_args * sizeof (Map_Arg_Type));</div><div class='add'>+   i = num_args;</div><div class='add'>+   i_control = 0;</div><div class='add'>+   while (i &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	i--;</div><div class='add'>+	if (-1 == SLang_pop_array (&amp;args[i].at, 1))</div><div class='add'>+	  {</div><div class='add'>+	     SLdo_pop_n (i + 2);</div><div class='add'>+	     goto return_error;</div><div class='add'>+	  }</div><div class='add'>+	if (args[i].at-&gt;num_elements &gt; 1)</div><div class='add'>+	  i_control = i;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (nt = SLang_pop_function ()))</div><div class='add'>+     {</div><div class='add'>+	SLdo_pop_n (1);</div><div class='add'>+	goto return_error;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   num_elements = args[i_control].at-&gt;num_elements;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_datatype (&amp;type))</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   if (type == SLANG_UNDEFINED_TYPE)   /* Void_Type */</div><div class='add'>+     at = NULL;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	at = args[i_control].at;</div><div class='add'>+</div><div class='add'>+	if (NULL == (at = SLang_create_array (type, 0, NULL, at-&gt;dims, at-&gt;num_dims)))</div><div class='add'>+	  goto return_error;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; num_args; i++)</div><div class='add'>+     {</div><div class='add'>+	SLang_Array_Type *ati = args[i].at;</div><div class='add'>+	/* FIXME: Priority = low: The actual dimensions should be compared. */</div><div class='add'>+	if (ati-&gt;num_elements == num_elements)</div><div class='add'>+	  args[i].increment = ati-&gt;sizeof_type;</div><div class='add'>+	/* memset already guarantees increment to be zero */</div><div class='add'>+</div><div class='add'>+	if (ati-&gt;num_elements == 0)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (0, "array_map: function argument %d of %d is an empty array", </div><div class='add'>+			   i+1, num_args);</div><div class='add'>+	     goto return_error;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	args[i].addr = (char *) ati-&gt;data;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (at == NULL)</div><div class='add'>+     addr = NULL;</div><div class='add'>+   else</div><div class='add'>+     addr = (char *)at-&gt;data;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; num_elements; i++)</div><div class='add'>+     {</div><div class='add'>+	unsigned int j;</div><div class='add'>+</div><div class='add'>+	if (-1 == SLang_start_arg_list ())</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	for (j = 0; j &lt; num_args; j++)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == push_element_at_addr (args[j].at, </div><div class='add'>+					     (VOID_STAR) args[j].addr,</div><div class='add'>+					     1))</div><div class='add'>+	       {</div><div class='add'>+		  SLdo_pop_n (j);</div><div class='add'>+		  goto return_error;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     args[j].addr += args[j].increment;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (-1 == SLang_end_arg_list ())</div><div class='add'>+	  {</div><div class='add'>+	     SLdo_pop_n (num_args);</div><div class='add'>+	     goto return_error;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (-1 == SLexecute_function (nt))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	if (at == NULL)</div><div class='add'>+	  continue;</div><div class='add'>+</div><div class='add'>+	if (-1 == at-&gt;cl-&gt;cl_apop (type, (VOID_STAR) addr))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	addr += at-&gt;sizeof_type;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (at != NULL)</div><div class='add'>+     (void) SLang_push_array (at, 0);</div><div class='add'>+</div><div class='add'>+   /* drop */</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+   SLang_free_function (nt);</div><div class='add'>+   if (args != NULL)</div><div class='add'>+     {</div><div class='add'>+	for (i = 0; i &lt; num_args; i++)</div><div class='add'>+	  SLang_free_array (args[i].at);</div><div class='add'>+</div><div class='add'>+	SLfree ((char *) args);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Array_Table [] =</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_0("array_map", array_map, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("array_sort", sort_array, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_1("array_to_bstring", array_to_bstring, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_1("bstring_to_array", bstring_to_array, SLANG_VOID_TYPE, SLANG_BSTRING_TYPE),</div><div class='add'>+   MAKE_INTRINSIC("init_char_array", init_char_array, SLANG_VOID_TYPE, 0),</div><div class='add'>+   MAKE_INTRINSIC("array_info", array_info, SLANG_VOID_TYPE, 0),</div><div class='add'>+   MAKE_INTRINSIC("where", array_where, SLANG_VOID_TYPE, 0),</div><div class='add'>+   MAKE_INTRINSIC_2("reshape", array_reshape, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE, SLANG_ARRAY_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_1("_reshape", _array_reshape, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE),</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static char *array_string (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   char buf[512];</div><div class='add'>+   unsigned int i, num_dims;</div><div class='add'>+   int *dims;</div><div class='add'>+</div><div class='add'>+   at = *(SLang_Array_Type **) v;</div><div class='add'>+   type = at-&gt;data_type;</div><div class='add'>+   num_dims = at-&gt;num_dims;</div><div class='add'>+   dims = at-&gt;dims;</div><div class='add'>+</div><div class='add'>+   sprintf (buf, "%s[%d", SLclass_get_datatype_name (type), at-&gt;dims[0]);</div><div class='add'>+</div><div class='add'>+   for (i = 1; i &lt; num_dims; i++)</div><div class='add'>+     sprintf (buf + strlen(buf), ",%d", dims[i]);</div><div class='add'>+   strcat (buf, "]");</div><div class='add'>+</div><div class='add'>+   return SLmake_string (buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_destroy (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   SLang_free_array (*(SLang_Array_Type **) v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int array_push (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   at = *(SLang_Array_Type **) v;</div><div class='add'>+   return SLang_push_array (at, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Intrinsic arrays are not stored in a variable. So, the address that</div><div class='add'>+ * would contain the variable holds the array address.</div><div class='add'>+ */</div><div class='add'>+static int array_push_intrinsic (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   return SLang_push_array ((SLang_Array_Type *) v, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLarray_add_bin_op (unsigned char type)</div><div class='add'>+{</div><div class='add'>+   SL_OOBinary_Type *ab;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   ab = cl-&gt;cl_binary_ops;</div><div class='add'>+</div><div class='add'>+   while (ab != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (ab-&gt;data_type == SLANG_ARRAY_TYPE)</div><div class='add'>+	  return 0;</div><div class='add'>+	ab = ab-&gt;next;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLclass_add_binary_op (SLANG_ARRAY_TYPE, type, array_binary_op, array_binary_op_result))</div><div class='add'>+       || (-1 == SLclass_add_binary_op (type, SLANG_ARRAY_TYPE, array_binary_op, array_binary_op_result)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Array_Type *</div><div class='add'>+do_array_math_op (int op, int unary_type,</div><div class='add'>+		  SLang_Array_Type *at, unsigned int na)</div><div class='add'>+{</div><div class='add'>+   unsigned char a_type, b_type;</div><div class='add'>+   int (*f) (int, unsigned char, VOID_STAR, unsigned int, VOID_STAR);</div><div class='add'>+   SLang_Array_Type *bt;</div><div class='add'>+   SLang_Class_Type *b_cl;</div><div class='add'>+   int no_init;</div><div class='add'>+</div><div class='add'>+   if (na != 1)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED, "Operation restricted to 1 array");</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   a_type = at-&gt;data_type;</div><div class='add'>+   if (NULL == (f = _SLclass_get_unary_fun (op, at-&gt;cl, &amp;b_cl, unary_type)))</div><div class='add'>+     return NULL;</div><div class='add'>+   b_type = b_cl-&gt;cl_data_type;</div><div class='add'>+</div><div class='add'>+   if (-1 == coerse_array_to_linear (at))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   no_init = ((b_cl-&gt;cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+	      || (b_cl-&gt;cl_class_type == SLANG_CLASS_TYPE_VECTOR));</div><div class='add'>+</div><div class='add'>+#if _SLANG_USE_TMP_OPTIMIZATION</div><div class='add'>+   /* If we are dealing with scalar (or vector) objects, and if the object</div><div class='add'>+    * appears to be owned by the stack, then use it instead of creating a </div><div class='add'>+    * new version.  This can happen with code such as:</div><div class='add'>+    * @  x = [1,2,3,4];</div><div class='add'>+    * @  x = UNARY_OP(__tmp(x));</div><div class='add'>+    */</div><div class='add'>+   if (no_init</div><div class='add'>+       &amp;&amp; (at-&gt;num_refs == 1)</div><div class='add'>+       &amp;&amp; (at-&gt;data_type == b_cl-&gt;cl_data_type))</div><div class='add'>+     {</div><div class='add'>+	bt = at;</div><div class='add'>+	bt-&gt;num_refs = 2;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+#endif				       /* _SLANG_USE_TMP_OPTIMIZATION */</div><div class='add'>+     if (NULL == (bt = SLang_create_array1 (b_type, 0, NULL, at-&gt;dims, at-&gt;num_dims, no_init)))</div><div class='add'>+       return NULL;</div><div class='add'>+</div><div class='add'>+   if (1 != (*f)(op, a_type, at-&gt;data, at-&gt;num_elements, bt-&gt;data))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_array (bt);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   return bt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+array_unary_op_result (int op, unsigned char a, unsigned char *b)</div><div class='add'>+{</div><div class='add'>+   (void) op;</div><div class='add'>+   (void) a;</div><div class='add'>+   *b = SLANG_ARRAY_TYPE;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+array_unary_op (int op,</div><div class='add'>+		unsigned char a, VOID_STAR ap, unsigned int na,</div><div class='add'>+		VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   (void) a;</div><div class='add'>+   at = *(SLang_Array_Type **) ap;</div><div class='add'>+   if (NULL == (at = do_array_math_op (op, _SLANG_BC_UNARY, at, na)))</div><div class='add'>+     {</div><div class='add'>+	if (SLang_Error) return -1;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+   *(SLang_Array_Type **) bp = at;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+array_math_op (int op,</div><div class='add'>+	       unsigned char a, VOID_STAR ap, unsigned int na,</div><div class='add'>+	       VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   (void) a;</div><div class='add'>+   at = *(SLang_Array_Type **) ap;</div><div class='add'>+   if (NULL == (at = do_array_math_op (op, _SLANG_BC_MATH_UNARY, at, na)))</div><div class='add'>+     {</div><div class='add'>+	if (SLang_Error) return -1;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+   *(SLang_Array_Type **) bp = at;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+array_app_op (int op,</div><div class='add'>+	      unsigned char a, VOID_STAR ap, unsigned int na,</div><div class='add'>+	      VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   (void) a;</div><div class='add'>+   at = *(SLang_Array_Type **) ap;</div><div class='add'>+   if (NULL == (at = do_array_math_op (op, _SLANG_BC_APP_UNARY, at, na)))</div><div class='add'>+     {</div><div class='add'>+	if (SLang_Error) return -1;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+   *(SLang_Array_Type **) bp = at;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_SLarray_typecast (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+		   unsigned char b_type, VOID_STAR bp,</div><div class='add'>+		   int is_implicit)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at, *bt;</div><div class='add'>+   SLang_Class_Type *b_cl;</div><div class='add'>+   int no_init;</div><div class='add'>+   int (*t) (unsigned char, VOID_STAR, unsigned int, unsigned char, VOID_STAR);</div><div class='add'>+</div><div class='add'>+   if (na != 1)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED, "typecast of multiple arrays not implemented");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   at = *(SLang_Array_Type **) ap;</div><div class='add'>+   a_type = at-&gt;data_type;</div><div class='add'>+</div><div class='add'>+   if (a_type == b_type)</div><div class='add'>+     {</div><div class='add'>+	at-&gt;num_refs += 1;</div><div class='add'>+	*(SLang_Array_Type **) bp = at;</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (t = _SLclass_get_typecast (a_type, b_type, is_implicit)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == coerse_array_to_linear (at))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   b_cl = _SLclass_get_class (b_type);</div><div class='add'>+</div><div class='add'>+   no_init = ((b_cl-&gt;cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+	      || (b_cl-&gt;cl_class_type == SLANG_CLASS_TYPE_VECTOR));</div><div class='add'>+</div><div class='add'>+   if (NULL == (bt = SLang_create_array1 (b_type, 0, NULL, at-&gt;dims, at-&gt;num_dims, no_init)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (1 == (*t) (a_type, at-&gt;data, at-&gt;num_elements, b_type, bt-&gt;data))</div><div class='add'>+     {</div><div class='add'>+	*(SLang_Array_Type **) bp = bt;</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_free_array (bt);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Array_Type *SLang_duplicate_array (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *bt;</div><div class='add'>+   char *data, *a_data;</div><div class='add'>+   unsigned int i, num_elements, sizeof_type;</div><div class='add'>+   unsigned int size;</div><div class='add'>+   int (*cl_acopy) (unsigned char, VOID_STAR, VOID_STAR);</div><div class='add'>+   unsigned char type;</div><div class='add'>+</div><div class='add'>+   if (-1 == coerse_array_to_linear (at))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   type = at-&gt;data_type;</div><div class='add'>+   num_elements = at-&gt;num_elements;</div><div class='add'>+   sizeof_type = at-&gt;sizeof_type;</div><div class='add'>+   size = num_elements * sizeof_type;</div><div class='add'>+</div><div class='add'>+   if (NULL == (data = SLmalloc (size)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   if (NULL == (bt = SLang_create_array (type, 0, (VOID_STAR)data, at-&gt;dims, at-&gt;num_dims)))</div><div class='add'>+     {</div><div class='add'>+	SLfree (data);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   a_data = (char *) at-&gt;data;</div><div class='add'>+   if (0 == (at-&gt;flags &amp; SLARR_DATA_VALUE_IS_POINTER))</div><div class='add'>+     {</div><div class='add'>+	SLMEMCPY (data, a_data, size);</div><div class='add'>+	return bt;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLMEMSET (data, 0, size);</div><div class='add'>+</div><div class='add'>+   cl_acopy = at-&gt;cl-&gt;cl_acopy;</div><div class='add'>+   for (i = 0; i &lt; num_elements; i++)</div><div class='add'>+     {</div><div class='add'>+	if (NULL != *(VOID_STAR *) a_data)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == (*cl_acopy) (type, (VOID_STAR) a_data, (VOID_STAR) data))</div><div class='add'>+	       {</div><div class='add'>+		  SLang_free_array (bt);</div><div class='add'>+		  return NULL;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	data += sizeof_type;</div><div class='add'>+	a_data += sizeof_type;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return bt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int array_dereference (unsigned char type, VOID_STAR addr)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   at = SLang_duplicate_array (*(SLang_Array_Type **) addr);</div><div class='add'>+   if (at == NULL) return -1;</div><div class='add'>+   return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function gets called via, e.g., @Array_Type (Double_Type, [10,20]);</div><div class='add'>+ */</div><div class='add'>+static int</div><div class='add'>+array_datatype_deref (unsigned char type)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *ind_at;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+   /* The parser generated code for this as if a function call were to be</div><div class='add'>+    * made.  However, the interpreter simply called the deref object routine</div><div class='add'>+    * instead of the function call.  So, I must simulate the function call.</div><div class='add'>+    * This needs to be formalized to hide this detail from applications</div><div class='add'>+    * who wish to do the same.  So...</div><div class='add'>+    * FIXME: Priority=medium</div><div class='add'>+    */</div><div class='add'>+   if (0 == _SL_increment_frame_pointer ())</div><div class='add'>+     (void) _SL_decrement_frame_pointer ();</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_array (&amp;ind_at, 1))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((ind_at-&gt;data_type != SLANG_INT_TYPE)</div><div class='add'>+       || (ind_at-&gt;num_dims != 1))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_TYPE_MISMATCH, "Expecting 1-d integer array");</div><div class='add'>+	goto return_error;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_datatype (&amp;type))</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   if (NULL == (at = SLang_create_array (type, 0, NULL,</div><div class='add'>+					 (int *) ind_at-&gt;data,</div><div class='add'>+					 ind_at-&gt;num_elements)))</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   SLang_free_array (ind_at);</div><div class='add'>+   return SLang_push_array (at, 1);</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   SLang_free_array (ind_at);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int array_length (unsigned char type, VOID_STAR v, unsigned int *len)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   at = *(SLang_Array_Type **) v;</div><div class='add'>+   *len = at-&gt;num_elements;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+_SLarray_init_slarray (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLadd_intrin_fun_table (Array_Table, NULL))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("Array_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   (void) SLclass_set_string_function (cl, array_string);</div><div class='add'>+   (void) SLclass_set_destroy_function (cl, array_destroy);</div><div class='add'>+   (void) SLclass_set_push_function (cl, array_push);</div><div class='add'>+   cl-&gt;cl_push_intrinsic = array_push_intrinsic;</div><div class='add'>+   cl-&gt;cl_dereference = array_dereference;</div><div class='add'>+   cl-&gt;cl_datatype_deref = array_datatype_deref;</div><div class='add'>+   cl-&gt;cl_length = array_length;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_ARRAY_TYPE, sizeof (VOID_STAR),</div><div class='add'>+				     SLANG_CLASS_TYPE_PTR))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLclass_add_binary_op (SLANG_ARRAY_TYPE, SLANG_ARRAY_TYPE, array_binary_op, array_binary_op_result))</div><div class='add'>+       || (-1 == SLclass_add_unary_op (SLANG_ARRAY_TYPE, array_unary_op, array_unary_op_result))</div><div class='add'>+       || (-1 == SLclass_add_app_unary_op (SLANG_ARRAY_TYPE, array_app_op, array_unary_op_result))</div><div class='add'>+       || (-1 == SLclass_add_math_op (SLANG_ARRAY_TYPE, array_math_op, array_unary_op_result))</div><div class='add'>+       || (-1 == SLclass_add_math_op (SLANG_ARRAY_TYPE, array_math_op, array_unary_op_result)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_array (SLang_Array_Type **at_ptr, int convert_scalar)</div><div class='add'>+{</div><div class='add'>+   if (-1 == pop_array (at_ptr, convert_scalar))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == coerse_array_to_linear (*at_ptr))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_array (*at_ptr);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_array_of_type (SLang_Array_Type **at, unsigned char type)</div><div class='add'>+{</div><div class='add'>+   if (-1 == SLclass_typecast (type, 1, 1))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return SLang_pop_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void (*_SLang_Matrix_Multiply)(void);</div><div class='add'>+</div><div class='add'>+int _SLarray_matrix_multiply (void)</div><div class='add'>+{</div><div class='add'>+   if (_SLang_Matrix_Multiply != NULL)</div><div class='add'>+     {</div><div class='add'>+	(*_SLang_Matrix_Multiply)();</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+   SLang_verror (SL_NOT_IMPLEMENTED, "Matrix multiplication not available");</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct _SLang_Foreach_Context_Type</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   unsigned int next_element_index;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+SLang_Foreach_Context_Type *</div><div class='add'>+_SLarray_cl_foreach_open (unsigned char type, unsigned int num)</div><div class='add'>+{</div><div class='add'>+   SLang_Foreach_Context_Type *c;</div><div class='add'>+</div><div class='add'>+   if (num != 0)</div><div class='add'>+     {</div><div class='add'>+	SLdo_pop_n (num + 1);</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "%s does not support 'foreach using' form",</div><div class='add'>+		      SLclass_get_datatype_name (type));</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (c = (SLang_Foreach_Context_Type *) SLmalloc (sizeof (SLang_Foreach_Context_Type))))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+</div><div class='add'>+   if (-1 == pop_array (&amp;c-&gt;at, 1))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) c);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLarray_cl_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   if (c == NULL) return;</div><div class='add'>+   SLang_free_array (c-&gt;at);</div><div class='add'>+   SLfree ((char *) c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLarray_cl_foreach (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   VOID_STAR data;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   if (c == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   at = c-&gt;at;</div><div class='add'>+   if (at-&gt;num_elements == c-&gt;next_element_index)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   /* FIXME: Priority = low.  The following assumes linear arrays</div><div class='add'>+    * or Integer range arrays.  Fixing it right requires a method to get the</div><div class='add'>+    * nth element of a multidimensional array.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   if (at-&gt;flags &amp; SLARR_DATA_VALUE_IS_RANGE)</div><div class='add'>+     {</div><div class='add'>+	int d = (int) c-&gt;next_element_index;</div><div class='add'>+	data = range_get_data_addr (at, &amp;d);</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     data = (VOID_STAR) ((char *)at-&gt;data + (c-&gt;next_element_index * at-&gt;sizeof_type));</div><div class='add'>+</div><div class='add'>+   c-&gt;next_element_index += 1;</div><div class='add'>+</div><div class='add'>+   if ((at-&gt;flags &amp; SLARR_DATA_VALUE_IS_POINTER)</div><div class='add'>+       &amp;&amp; (*(VOID_STAR *) data == NULL))</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLang_push_null ())</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+   else if (-1 == (*at-&gt;cl-&gt;cl_apush)(at-&gt;data_type, data))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* keep going */</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slarrfun.c b/mdk-stage1/slang/slarrfun.c<br/>new file mode 100644<br/>index 000000000..bfa6ec5e5<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slarrfun.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarrfun.c</a></div><div class='hunk'>@@ -0,0 +1,464 @@</div><div class='add'>+/* Advanced array manipulation routines for S-Lang */</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static int next_transposed_index (int *dims, int *max_dims, unsigned int num_dims)</div><div class='add'>+{</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; (int) num_dims; i++)</div><div class='add'>+     {</div><div class='add'>+	int dims_i;</div><div class='add'>+</div><div class='add'>+	dims_i = dims [i] + 1;</div><div class='add'>+	if (dims_i != (int) max_dims [i])</div><div class='add'>+	  {</div><div class='add'>+	     dims [i] = dims_i;</div><div class='add'>+	     return 0;</div><div class='add'>+	  }</div><div class='add'>+	dims [i] = 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Array_Type *allocate_transposed_array (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+   unsigned int num_elements;</div><div class='add'>+   SLang_Array_Type *bt;</div><div class='add'>+   VOID_STAR b_data;</div><div class='add'>+</div><div class='add'>+   num_elements = at-&gt;num_elements;</div><div class='add'>+   b_data = (VOID_STAR) SLmalloc (at-&gt;sizeof_type * num_elements);</div><div class='add'>+   if (b_data == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   bt = SLang_create_array (at-&gt;data_type, 0, b_data, at-&gt;dims, 2);</div><div class='add'>+   if (bt == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *)b_data);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   bt-&gt;dims[1] = at-&gt;dims[0];</div><div class='add'>+   bt-&gt;dims[0] = at-&gt;dims[1];</div><div class='add'>+</div><div class='add'>+   return bt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define GENERIC_TYPE float</div><div class='add'>+#define TRANSPOSE_2D_ARRAY transpose_floats</div><div class='add'>+#define GENERIC_TYPE_A float</div><div class='add'>+#define GENERIC_TYPE_B float</div><div class='add'>+#define GENERIC_TYPE_C float</div><div class='add'>+#define INNERPROD_FUNCTION innerprod_float_float</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+# define INNERPROD_COMPLEX_A innerprod_complex_float</div><div class='add'>+# define INNERPROD_A_COMPLEX innerprod_float_complex</div><div class='add'>+#endif</div><div class='add'>+#include "slarrfun.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_TYPE double</div><div class='add'>+#define TRANSPOSE_2D_ARRAY transpose_doubles</div><div class='add'>+#define GENERIC_TYPE_A double</div><div class='add'>+#define GENERIC_TYPE_B double</div><div class='add'>+#define GENERIC_TYPE_C double</div><div class='add'>+#define INNERPROD_FUNCTION innerprod_double_double</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+# define INNERPROD_COMPLEX_A innerprod_complex_double</div><div class='add'>+# define INNERPROD_A_COMPLEX innerprod_double_complex</div><div class='add'>+#endif</div><div class='add'>+#include "slarrfun.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_TYPE_A double</div><div class='add'>+#define GENERIC_TYPE_B float</div><div class='add'>+#define GENERIC_TYPE_C double</div><div class='add'>+#define INNERPROD_FUNCTION innerprod_double_float</div><div class='add'>+#include "slarrfun.inc"</div><div class='add'>+</div><div class='add'>+#define GENERIC_TYPE_A float</div><div class='add'>+#define GENERIC_TYPE_B double</div><div class='add'>+#define GENERIC_TYPE_C double</div><div class='add'>+#define INNERPROD_FUNCTION innerprod_float_double</div><div class='add'>+#include "slarrfun.inc"</div><div class='add'>+</div><div class='add'>+/* Finally pick up the complex_complex multiplication</div><div class='add'>+ * and do the integers</div><div class='add'>+ */</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+# define INNERPROD_COMPLEX_COMPLEX innerprod_complex_complex</div><div class='add'>+#endif</div><div class='add'>+#define GENERIC_TYPE int</div><div class='add'>+#define TRANSPOSE_2D_ARRAY transpose_ints</div><div class='add'>+#include "slarrfun.inc"</div><div class='add'>+</div><div class='add'>+#if SIZEOF_LONG != SIZEOF_INT</div><div class='add'>+# define GENERIC_TYPE long</div><div class='add'>+# define TRANSPOSE_2D_ARRAY transpose_longs</div><div class='add'>+# include "slarrfun.inc"</div><div class='add'>+#else</div><div class='add'>+# define transpose_longs transpose_ints</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SIZEOF_SHORT != SIZEOF_INT</div><div class='add'>+# define GENERIC_TYPE short</div><div class='add'>+# define TRANSPOSE_2D_ARRAY transpose_shorts</div><div class='add'>+# include "slarrfun.inc"</div><div class='add'>+#else</div><div class='add'>+# define transpose_shorts transpose_ints</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define GENERIC_TYPE char</div><div class='add'>+#define TRANSPOSE_2D_ARRAY transpose_chars</div><div class='add'>+#include "slarrfun.inc"</div><div class='add'>+</div><div class='add'>+/* This routine works only with linear arrays */</div><div class='add'>+static SLang_Array_Type *transpose (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+   int dims [SLARRAY_MAX_DIMS];</div><div class='add'>+   int *max_dims;</div><div class='add'>+   unsigned int num_dims;</div><div class='add'>+   SLang_Array_Type *bt;</div><div class='add'>+   int i;</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   int is_ptr;</div><div class='add'>+   char *b_data;</div><div class='add'>+</div><div class='add'>+   max_dims = at-&gt;dims;</div><div class='add'>+   num_dims = at-&gt;num_dims;</div><div class='add'>+</div><div class='add'>+   if ((at-&gt;num_elements == 0)</div><div class='add'>+       || (num_dims == 1))</div><div class='add'>+     {</div><div class='add'>+	bt = SLang_duplicate_array (at);</div><div class='add'>+	if (num_dims == 1) bt-&gt;num_dims = 2;</div><div class='add'>+	goto transpose_dims;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* For numeric arrays skip the overhead below */</div><div class='add'>+   if (num_dims == 2)</div><div class='add'>+     {</div><div class='add'>+	bt = allocate_transposed_array (at);</div><div class='add'>+	if (bt == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+	switch (at-&gt;data_type)</div><div class='add'>+	  {</div><div class='add'>+	   case SLANG_INT_TYPE:</div><div class='add'>+	   case SLANG_UINT_TYPE:</div><div class='add'>+	     return transpose_ints (at, bt);</div><div class='add'>+	   case SLANG_DOUBLE_TYPE:</div><div class='add'>+	    return transpose_doubles (at, bt);</div><div class='add'>+	   case SLANG_FLOAT_TYPE:</div><div class='add'>+	     return transpose_floats (at, bt);</div><div class='add'>+	   case SLANG_CHAR_TYPE:</div><div class='add'>+	   case SLANG_UCHAR_TYPE:</div><div class='add'>+	     return transpose_chars (at, bt);</div><div class='add'>+	   case SLANG_LONG_TYPE:</div><div class='add'>+	   case SLANG_ULONG_TYPE:</div><div class='add'>+	     return transpose_longs (at, bt);</div><div class='add'>+	   case SLANG_SHORT_TYPE:</div><div class='add'>+	   case SLANG_USHORT_TYPE:</div><div class='add'>+	     return transpose_shorts (at, bt);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	bt = SLang_create_array (at-&gt;data_type, 0, NULL, max_dims, num_dims);</div><div class='add'>+	if (bt == NULL) return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   sizeof_type = at-&gt;sizeof_type;</div><div class='add'>+   is_ptr = (at-&gt;flags &amp; SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+</div><div class='add'>+   memset ((char *)dims, 0, sizeof(dims));</div><div class='add'>+</div><div class='add'>+   b_data = (char *) bt-&gt;data;</div><div class='add'>+</div><div class='add'>+   do</div><div class='add'>+     {</div><div class='add'>+	if (-1 == _SLarray_aget_transfer_elem (at, dims, (VOID_STAR) b_data,</div><div class='add'>+					       sizeof_type, is_ptr))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_array (bt);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+	b_data += sizeof_type;</div><div class='add'>+     }</div><div class='add'>+   while (0 == next_transposed_index (dims, max_dims, num_dims));</div><div class='add'>+</div><div class='add'>+   transpose_dims:</div><div class='add'>+</div><div class='add'>+   num_dims = bt-&gt;num_dims;</div><div class='add'>+   for (i = 0; i &lt; (int) num_dims; i++)</div><div class='add'>+     bt-&gt;dims[i] = max_dims [num_dims - i - 1];</div><div class='add'>+</div><div class='add'>+   return bt;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_transpose (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+   if (NULL != (at = transpose (at)))</div><div class='add'>+     (void) SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_inner_product_parms (SLang_Array_Type *a, int *dp,</div><div class='add'>+				    unsigned int *loops, unsigned int *other)</div><div class='add'>+{</div><div class='add'>+   int num_dims;</div><div class='add'>+   int d;</div><div class='add'>+   </div><div class='add'>+   d = *dp;</div><div class='add'>+   </div><div class='add'>+   num_dims = (int)a-&gt;num_dims;</div><div class='add'>+   if (num_dims == 0) </div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Inner-product operation requires an array of at least 1 dimension.");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* An index of -1 refers to last dimension */</div><div class='add'>+   if (d == -1)</div><div class='add'>+     d += num_dims;</div><div class='add'>+   *dp = d;</div><div class='add'>+</div><div class='add'>+   if (a-&gt;num_elements == 0)</div><div class='add'>+     {				       /* [] # [] ==&gt; [] */</div><div class='add'>+	*loops = *other = 0;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *loops = a-&gt;num_elements / a-&gt;dims[d];</div><div class='add'>+</div><div class='add'>+   if (d == 0)</div><div class='add'>+     {</div><div class='add'>+	*other = *loops;  /* a-&gt;num_elements / a-&gt;dims[0]; */</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   *other = a-&gt;dims[d];</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This routines takes two arrays A_i..j and B_j..k and produces a third</div><div class='add'>+ * via C_i..k = A_i..j B_j..k.</div><div class='add'>+ * </div><div class='add'>+ * If A is a vector, and B is a 2-d matrix, then regard A as a 2-d matrix</div><div class='add'>+ * with 1-column.</div><div class='add'>+ */</div><div class='add'>+static void do_inner_product (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *a, *b, *c;</div><div class='add'>+   void (*fun)(SLang_Array_Type *, SLang_Array_Type *, SLang_Array_Type *,</div><div class='add'>+	       unsigned int, unsigned int, unsigned int, unsigned int, </div><div class='add'>+	       unsigned int);</div><div class='add'>+   unsigned char c_type;</div><div class='add'>+   int dims[SLARRAY_MAX_DIMS];</div><div class='add'>+   int status;</div><div class='add'>+   unsigned int a_loops, b_loops, b_inc, a_stride;</div><div class='add'>+   int ai_dims, i, j;</div><div class='add'>+   unsigned int num_dims, a_num_dims, b_num_dims;</div><div class='add'>+   int ai, bi;</div><div class='add'>+</div><div class='add'>+   /* The result of a inner_product will be either a float, double, or</div><div class='add'>+    * a complex number.</div><div class='add'>+    * </div><div class='add'>+    * If an integer array is used, it will be promoted to a float.</div><div class='add'>+    */</div><div class='add'>+   </div><div class='add'>+   switch (SLang_peek_at_stack1 ())</div><div class='add'>+     {</div><div class='add'>+      case SLANG_DOUBLE_TYPE:</div><div class='add'>+	if (-1 == SLang_pop_array_of_type (&amp;b, SLANG_DOUBLE_TYPE))</div><div class='add'>+	  return;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+      case SLANG_COMPLEX_TYPE:</div><div class='add'>+	if (-1 == SLang_pop_array_of_type (&amp;b, SLANG_COMPLEX_TYPE))</div><div class='add'>+	  return;</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+      case SLANG_FLOAT_TYPE:</div><div class='add'>+      default:</div><div class='add'>+	if (-1 == SLang_pop_array_of_type (&amp;b, SLANG_FLOAT_TYPE))</div><div class='add'>+	  return;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   switch (SLang_peek_at_stack1 ())</div><div class='add'>+     {</div><div class='add'>+      case SLANG_DOUBLE_TYPE:</div><div class='add'>+	status = SLang_pop_array_of_type (&amp;a, SLANG_DOUBLE_TYPE);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+      case SLANG_COMPLEX_TYPE:</div><div class='add'>+	status = SLang_pop_array_of_type (&amp;a, SLANG_COMPLEX_TYPE);</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+      case SLANG_FLOAT_TYPE:</div><div class='add'>+      default:</div><div class='add'>+	status = SLang_pop_array_of_type (&amp;a, SLANG_FLOAT_TYPE);</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (status == -1)</div><div class='add'>+     {</div><div class='add'>+	SLang_free_array (b);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   ai = -1;			       /* last index of a */</div><div class='add'>+   bi = 0;			       /* first index of b */</div><div class='add'>+   if ((-1 == get_inner_product_parms (a, &amp;ai, &amp;a_loops, &amp;a_stride))</div><div class='add'>+       || (-1 == get_inner_product_parms (b, &amp;bi, &amp;b_loops, &amp;b_inc)))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_TYPE_MISMATCH, "Array dimensions are not compatible for inner-product");</div><div class='add'>+	goto free_and_return;</div><div class='add'>+     }</div><div class='add'>+       </div><div class='add'>+   a_num_dims = a-&gt;num_dims;</div><div class='add'>+   b_num_dims = b-&gt;num_dims;</div><div class='add'>+</div><div class='add'>+   /* Coerse a 1-d vector to 2-d */</div><div class='add'>+   if ((a_num_dims == 1) </div><div class='add'>+       &amp;&amp; (b_num_dims == 2)</div><div class='add'>+       &amp;&amp; (a-&gt;num_elements))</div><div class='add'>+     {</div><div class='add'>+	a_num_dims = 2;</div><div class='add'>+	ai = 1;</div><div class='add'>+	a_loops = a-&gt;num_elements;</div><div class='add'>+	a_stride = 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((ai_dims = a-&gt;dims[ai]) != b-&gt;dims[bi])</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_TYPE_MISMATCH, "Array dimensions are not compatible for inner-product");</div><div class='add'>+	goto free_and_return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   num_dims = a_num_dims + b_num_dims - 2;</div><div class='add'>+   if (num_dims &gt; SLARRAY_MAX_DIMS)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "Inner-product result exceed max allowed dimensions");</div><div class='add'>+	goto free_and_return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (num_dims)</div><div class='add'>+     {</div><div class='add'>+	j = 0;</div><div class='add'>+	for (i = 0; i &lt; (int)a_num_dims; i++)</div><div class='add'>+	  if (i != ai) dims [j++] = a-&gt;dims[i];</div><div class='add'>+	for (i = 0; i &lt; (int)b_num_dims; i++)</div><div class='add'>+	  if (i != bi) dims [j++] = b-&gt;dims[i];</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	/* a scalar */</div><div class='add'>+	num_dims = 1;</div><div class='add'>+	dims[0] = 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   c_type = 0; fun = NULL;</div><div class='add'>+   switch (a-&gt;data_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_FLOAT_TYPE:</div><div class='add'>+	switch (b-&gt;data_type)</div><div class='add'>+	  {</div><div class='add'>+	   case SLANG_FLOAT_TYPE:</div><div class='add'>+	     c_type = SLANG_FLOAT_TYPE;</div><div class='add'>+	     fun = innerprod_float_float;</div><div class='add'>+	     break;</div><div class='add'>+	   case SLANG_DOUBLE_TYPE:</div><div class='add'>+	     c_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+	     fun = innerprod_float_double;</div><div class='add'>+	     break;</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+	   case SLANG_COMPLEX_TYPE:</div><div class='add'>+	     c_type = SLANG_COMPLEX_TYPE;</div><div class='add'>+	     fun = innerprod_float_complex;</div><div class='add'>+	     break;</div><div class='add'>+#endif</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_DOUBLE_TYPE:</div><div class='add'>+	switch (b-&gt;data_type)</div><div class='add'>+	  {</div><div class='add'>+	   case SLANG_FLOAT_TYPE:</div><div class='add'>+	     c_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+	     fun = innerprod_double_float;</div><div class='add'>+	     break;</div><div class='add'>+	   case SLANG_DOUBLE_TYPE:</div><div class='add'>+	     c_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+	     fun = innerprod_double_double;</div><div class='add'>+	     break;</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+	   case SLANG_COMPLEX_TYPE:</div><div class='add'>+	     c_type = SLANG_COMPLEX_TYPE;</div><div class='add'>+	     fun = innerprod_double_complex;</div><div class='add'>+	     break;</div><div class='add'>+#endif</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+      case SLANG_COMPLEX_TYPE:</div><div class='add'>+	c_type = SLANG_COMPLEX_TYPE;</div><div class='add'>+	switch (b-&gt;data_type)</div><div class='add'>+	  {</div><div class='add'>+	   case SLANG_FLOAT_TYPE:</div><div class='add'>+	     fun = innerprod_complex_float;</div><div class='add'>+	     break;</div><div class='add'>+	   case SLANG_DOUBLE_TYPE:</div><div class='add'>+	     fun = innerprod_complex_double;</div><div class='add'>+	     break;</div><div class='add'>+	   case SLANG_COMPLEX_TYPE:</div><div class='add'>+	     fun = innerprod_complex_complex;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+      default:</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (c = SLang_create_array (c_type, 0, NULL, dims, num_dims)))</div><div class='add'>+     goto free_and_return;</div><div class='add'>+</div><div class='add'>+   (*fun)(a, b, c, a_loops, a_stride, b_loops, b_inc, ai_dims);</div><div class='add'>+</div><div class='add'>+   (void) SLang_push_array (c, 1);</div><div class='add'>+   /* drop */</div><div class='add'>+</div><div class='add'>+   free_and_return:</div><div class='add'>+   SLang_free_array (a);</div><div class='add'>+   SLang_free_array (b);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Array_Fun_Table [] =</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_1("transpose", array_transpose, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE),</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLang_init_array (void)</div><div class='add'>+{</div><div class='add'>+   if (-1 == SLadd_intrin_fun_table (Array_Fun_Table, "__SLARRAY__"))</div><div class='add'>+     return -1;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   _SLang_Matrix_Multiply = do_inner_product;</div><div class='add'>+#endif</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slarrfun.inc b/mdk-stage1/slang/slarrfun.inc<br/>new file mode 100644<br/>index 000000000..348473a6f<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slarrfun.inc?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarrfun.inc</a></div><div class='hunk'>@@ -0,0 +1,257 @@</div><div class='add'>+/* -*- mode: C -*- */</div><div class='add'>+</div><div class='add'>+/* Some "inline" functions for generic scalar types */</div><div class='add'>+</div><div class='add'>+#ifdef TRANSPOSE_2D_ARRAY</div><div class='add'>+static SLang_Array_Type *TRANSPOSE_2D_ARRAY (SLang_Array_Type *at, SLang_Array_Type *bt)</div><div class='add'>+{</div><div class='add'>+   GENERIC_TYPE *a_data, *b_data;</div><div class='add'>+   int nr, nc, i;</div><div class='add'>+</div><div class='add'>+   nr = at-&gt;dims[0];</div><div class='add'>+   nc = at-&gt;dims[1];</div><div class='add'>+</div><div class='add'>+   a_data = (GENERIC_TYPE *) at-&gt;data;</div><div class='add'>+   b_data = (GENERIC_TYPE *) bt-&gt;data;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; nr; i++)</div><div class='add'>+     {</div><div class='add'>+	GENERIC_TYPE *offset = b_data + i;</div><div class='add'>+	int j;</div><div class='add'>+	for (j = 0; j &lt; nc; j++)</div><div class='add'>+	  {</div><div class='add'>+	     *offset = *a_data++;</div><div class='add'>+	     offset += nr;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   return bt;</div><div class='add'>+}</div><div class='add'>+#undef TRANSPOSE_2D_ARRAY</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifdef INNERPROD_FUNCTION</div><div class='add'>+</div><div class='add'>+static void INNERPROD_FUNCTION</div><div class='add'>+  (SLang_Array_Type *at, SLang_Array_Type *bt, SLang_Array_Type *ct,</div><div class='add'>+   unsigned int a_loops, unsigned int a_stride,</div><div class='add'>+   unsigned int b_loops, unsigned int b_inc,</div><div class='add'>+   unsigned int inner_loops)</div><div class='add'>+{</div><div class='add'>+   GENERIC_TYPE_A *a;</div><div class='add'>+   GENERIC_TYPE_B *b;</div><div class='add'>+   GENERIC_TYPE_C *c;</div><div class='add'>+</div><div class='add'>+   c = (GENERIC_TYPE_C *) ct-&gt;data;</div><div class='add'>+   b = (GENERIC_TYPE_B *) bt-&gt;data;</div><div class='add'>+   a = (GENERIC_TYPE_A *) at-&gt;data;</div><div class='add'>+   </div><div class='add'>+   while (a_loops--)</div><div class='add'>+     {</div><div class='add'>+	GENERIC_TYPE_B *bb;</div><div class='add'>+	unsigned int j;</div><div class='add'>+</div><div class='add'>+	bb = b;</div><div class='add'>+</div><div class='add'>+	for (j = 0; j &lt; inner_loops; j++)</div><div class='add'>+	  {</div><div class='add'>+	     double x = (double) a[j];</div><div class='add'>+</div><div class='add'>+	     if (x != 0.0)</div><div class='add'>+	       {</div><div class='add'>+		  unsigned int k;</div><div class='add'>+</div><div class='add'>+		  for (k = 0; k &lt; b_loops; k++)</div><div class='add'>+		    c[k] += x * bb[k];</div><div class='add'>+	       }</div><div class='add'>+	     bb += b_inc;</div><div class='add'>+	  }</div><div class='add'>+	c += b_loops;</div><div class='add'>+	a += a_stride;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+#undef INNERPROD_FUNCTION</div><div class='add'>+</div><div class='add'>+#undef GENERIC_TYPE_A</div><div class='add'>+#undef GENERIC_TYPE_B</div><div class='add'>+#undef GENERIC_TYPE_C</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef INNERPROD_COMPLEX_A</div><div class='add'>+static void INNERPROD_COMPLEX_A</div><div class='add'>+  (SLang_Array_Type *at, SLang_Array_Type *bt, SLang_Array_Type *ct,</div><div class='add'>+   unsigned int a_loops, unsigned int a_stride,</div><div class='add'>+   unsigned int b_loops, unsigned int b_inc,</div><div class='add'>+   unsigned int inner_loops)</div><div class='add'>+{</div><div class='add'>+   double *a;</div><div class='add'>+   GENERIC_TYPE *b;</div><div class='add'>+   double *c;</div><div class='add'>+</div><div class='add'>+   c = (double *) ct-&gt;data;</div><div class='add'>+   b = (GENERIC_TYPE *) bt-&gt;data;</div><div class='add'>+   a = (double *) at-&gt;data;</div><div class='add'>+   </div><div class='add'>+   a_stride *= 2;</div><div class='add'>+</div><div class='add'>+   while (a_loops--)</div><div class='add'>+     {</div><div class='add'>+	GENERIC_TYPE *bb;</div><div class='add'>+	unsigned int bb_loops;</div><div class='add'>+</div><div class='add'>+	bb = b;</div><div class='add'>+	bb_loops = b_loops;</div><div class='add'>+	</div><div class='add'>+	while (bb_loops--)</div><div class='add'>+	  {</div><div class='add'>+	     double real_sum;</div><div class='add'>+	     double imag_sum;</div><div class='add'>+	     unsigned int iloops;</div><div class='add'>+	     double *aa;</div><div class='add'>+	     GENERIC_TYPE *bbb;</div><div class='add'>+	     </div><div class='add'>+	     aa = a;</div><div class='add'>+	     bbb = bb;</div><div class='add'>+	     iloops = inner_loops;</div><div class='add'>+</div><div class='add'>+	     real_sum = 0.0;</div><div class='add'>+	     imag_sum = 0.0;</div><div class='add'>+	     while (iloops--)</div><div class='add'>+	       {</div><div class='add'>+		  real_sum += aa[0] * (double)bbb[0];</div><div class='add'>+		  imag_sum += aa[1] * (double)bbb[0];</div><div class='add'>+		  aa += 2;</div><div class='add'>+		  bbb += b_inc;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     *c++ = real_sum;</div><div class='add'>+	     *c++ = imag_sum;</div><div class='add'>+	     bb++;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	a += a_stride;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void INNERPROD_A_COMPLEX</div><div class='add'>+  (SLang_Array_Type *at, SLang_Array_Type *bt, SLang_Array_Type *ct,</div><div class='add'>+   unsigned int a_loops, unsigned int a_stride,</div><div class='add'>+   unsigned int b_loops, unsigned int b_inc,</div><div class='add'>+   unsigned int inner_loops)</div><div class='add'>+{</div><div class='add'>+   GENERIC_TYPE *a;</div><div class='add'>+   double *b;</div><div class='add'>+   double *c;</div><div class='add'>+</div><div class='add'>+   c = (double *) ct-&gt;data;</div><div class='add'>+   b = (double *) bt-&gt;data;</div><div class='add'>+   a = (GENERIC_TYPE *) at-&gt;data;</div><div class='add'>+   </div><div class='add'>+   b_inc *= 2;</div><div class='add'>+</div><div class='add'>+   while (a_loops--)</div><div class='add'>+     {</div><div class='add'>+	double *bb;</div><div class='add'>+	unsigned int bb_loops;</div><div class='add'>+</div><div class='add'>+	bb = b;</div><div class='add'>+	bb_loops = b_loops;</div><div class='add'>+	</div><div class='add'>+	while (bb_loops--)</div><div class='add'>+	  {</div><div class='add'>+	     double real_sum;</div><div class='add'>+	     double imag_sum;</div><div class='add'>+	     unsigned int iloops;</div><div class='add'>+	     GENERIC_TYPE *aa;</div><div class='add'>+	     double *bbb;</div><div class='add'>+</div><div class='add'>+	     aa = a;</div><div class='add'>+	     bbb = bb;</div><div class='add'>+	     iloops = inner_loops;</div><div class='add'>+</div><div class='add'>+	     real_sum = 0.0;</div><div class='add'>+	     imag_sum = 0.0;</div><div class='add'>+	     while (iloops--)</div><div class='add'>+	       {</div><div class='add'>+		  real_sum += (double)aa[0] * bbb[0];</div><div class='add'>+		  imag_sum += (double)aa[0] * bbb[1];</div><div class='add'>+		  aa += 1;</div><div class='add'>+		  bbb += b_inc;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     *c++ = real_sum;</div><div class='add'>+	     *c++ = imag_sum;</div><div class='add'>+	     bb += 2;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	a += a_stride;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#undef INNERPROD_A_COMPLEX</div><div class='add'>+#undef INNERPROD_COMPLEX_A</div><div class='add'>+#endif				       /* INNERPROD_COMPLEX_A */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifdef INNERPROD_COMPLEX_COMPLEX</div><div class='add'>+static void INNERPROD_COMPLEX_COMPLEX</div><div class='add'>+  (SLang_Array_Type *at, SLang_Array_Type *bt, SLang_Array_Type *ct,</div><div class='add'>+   unsigned int a_loops, unsigned int a_stride,</div><div class='add'>+   unsigned int b_loops, unsigned int b_inc,</div><div class='add'>+   unsigned int inner_loops)</div><div class='add'>+{</div><div class='add'>+   double *a;</div><div class='add'>+   double *b;</div><div class='add'>+   double *c;</div><div class='add'>+</div><div class='add'>+   c = (double *) ct-&gt;data;</div><div class='add'>+   b = (double *) bt-&gt;data;</div><div class='add'>+   a = (double *) at-&gt;data;</div><div class='add'>+   </div><div class='add'>+   a_stride *= 2;</div><div class='add'>+   b_inc *= 2;</div><div class='add'>+</div><div class='add'>+   while (a_loops--)</div><div class='add'>+     {</div><div class='add'>+	double *bb;</div><div class='add'>+	unsigned int bb_loops;</div><div class='add'>+</div><div class='add'>+	bb = b;</div><div class='add'>+	bb_loops = b_loops;</div><div class='add'>+	</div><div class='add'>+	while (bb_loops--)</div><div class='add'>+	  {</div><div class='add'>+	     double real_sum;</div><div class='add'>+	     double imag_sum;</div><div class='add'>+	     unsigned int iloops;</div><div class='add'>+	     double *aa;</div><div class='add'>+	     double *bbb;</div><div class='add'>+</div><div class='add'>+	     aa = a;</div><div class='add'>+	     bbb = bb;</div><div class='add'>+	     iloops = inner_loops;</div><div class='add'>+</div><div class='add'>+	     real_sum = 0.0;</div><div class='add'>+	     imag_sum = 0.0;</div><div class='add'>+	     while (iloops--)</div><div class='add'>+	       {</div><div class='add'>+		  real_sum += aa[0]*bbb[0] - aa[1]*bbb[1];</div><div class='add'>+		  imag_sum += aa[0]*bbb[1] + aa[1]*bbb[0];</div><div class='add'>+		  aa += 2;</div><div class='add'>+		  bbb += b_inc;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     *c++ = real_sum;</div><div class='add'>+	     *c++ = imag_sum;</div><div class='add'>+	     bb += 2;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	a += a_stride;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+#undef INNERPROD_COMPLEX_COMPLEX</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef GENERIC_TYPE</div><div class='add'>+# undef GENERIC_TYPE</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slarrmis.c b/mdk-stage1/slang/slarrmis.c<br/>new file mode 100644<br/>index 000000000..330dcb53f<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slarrmis.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slarrmis.c</a></div><div class='hunk'>@@ -0,0 +1,38 @@</div><div class='add'>+/* Misc Array Functions */</div><div class='add'>+/* Copyright (c) 1997, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+int SLang_get_array_element (SLang_Array_Type *at, int *indices, VOID_STAR data)</div><div class='add'>+{</div><div class='add'>+   int is_ptr;</div><div class='add'>+</div><div class='add'>+   if ((at == NULL)</div><div class='add'>+       || (indices == NULL)</div><div class='add'>+       || (data == NULL))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   is_ptr = (at-&gt;flags &amp; SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+   if (is_ptr) *(VOID_STAR *) data = NULL;</div><div class='add'>+   return _SLarray_aget_transfer_elem (at, indices, data, at-&gt;sizeof_type, is_ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_set_array_element (SLang_Array_Type *at, int *indices, VOID_STAR data)</div><div class='add'>+{</div><div class='add'>+   if ((at == NULL)</div><div class='add'>+       || (indices == NULL)</div><div class='add'>+       || (data == NULL))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   return _SLarray_aput_transfer_elem (at, indices, data, at-&gt;sizeof_type,</div><div class='add'>+				       at-&gt;flags &amp; SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slassoc.c b/mdk-stage1/slang/slassoc.c<br/>new file mode 100644<br/>index 000000000..5997458d2<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slassoc.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slassoc.c</a></div><div class='hunk'>@@ -0,0 +1,713 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#define SL_APP_WANTS_FOREACH</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#define USE_NEW_ANYTYPE_CODE 1</div><div class='add'>+</div><div class='add'>+typedef struct _SLAssoc_Array_Element_Type</div><div class='add'>+{</div><div class='add'>+   char *key;		       /* slstring */</div><div class='add'>+   struct _SLAssoc_Array_Element_Type *next;</div><div class='add'>+   SLang_Object_Type value;</div><div class='add'>+}</div><div class='add'>+_SLAssoc_Array_Element_Type;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   _SLAssoc_Array_Element_Type *elements[SLASSOC_HASH_TABLE_SIZE];</div><div class='add'>+   SLang_Object_Type default_value;</div><div class='add'>+   unsigned int num_elements;</div><div class='add'>+#define HAS_DEFAULT_VALUE	1</div><div class='add'>+   unsigned int flags;</div><div class='add'>+   unsigned char type;</div><div class='add'>+}</div><div class='add'>+SLang_Assoc_Array_Type;</div><div class='add'>+</div><div class='add'>+#define USE_CACHED_STRING	1</div><div class='add'>+</div><div class='add'>+#if USE_CACHED_STRING </div><div class='add'>+static char *Cached_String;</div><div class='add'>+static SLang_Object_Type *Cached_Obj;</div><div class='add'>+static SLang_Assoc_Array_Type *Cached_Array;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_Assoc_Array_Type *alloc_assoc_array (unsigned char type, int has_default_value)</div><div class='add'>+{</div><div class='add'>+   SLang_Assoc_Array_Type *a;</div><div class='add'>+</div><div class='add'>+   a = (SLang_Assoc_Array_Type *)SLmalloc (sizeof (SLang_Assoc_Array_Type));</div><div class='add'>+   if (a == NULL)</div><div class='add'>+     {</div><div class='add'>+	if (has_default_value)</div><div class='add'>+	  SLdo_pop_n (1);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   memset ((char *) a, 0, sizeof (SLang_Assoc_Array_Type));</div><div class='add'>+   a-&gt;type = type;</div><div class='add'>+</div><div class='add'>+   if (has_default_value)</div><div class='add'>+     {</div><div class='add'>+	if (</div><div class='add'>+#if USE_NEW_ANYTYPE_CODE</div><div class='add'>+	    ((type != SLANG_ANY_TYPE) &amp;&amp; (-1 == SLclass_typecast (type, 1, 1)))</div><div class='add'>+#else</div><div class='add'>+	    (-1 == SLclass_typecast (type, 1, 1))</div><div class='add'>+#endif</div><div class='add'>+	    || (-1 == SLang_pop (&amp;a-&gt;default_value)))</div><div class='add'>+	  {</div><div class='add'>+	     SLfree ((char *) a);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	a-&gt;flags |= HAS_DEFAULT_VALUE;</div><div class='add'>+     }</div><div class='add'>+   return a;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_element (_SLAssoc_Array_Element_Type *e)</div><div class='add'>+{</div><div class='add'>+   if (e == NULL)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   SLang_free_object (&amp;e-&gt;value);</div><div class='add'>+   SLang_free_slstring (e-&gt;key);</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+   if (e-&gt;key == Cached_String)</div><div class='add'>+     Cached_String = NULL;</div><div class='add'>+#endif</div><div class='add'>+   SLfree ((char *)e);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void delete_assoc_array (SLang_Assoc_Array_Type *a)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   if (a == NULL) return;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; SLASSOC_HASH_TABLE_SIZE; i++)</div><div class='add'>+     {</div><div class='add'>+	_SLAssoc_Array_Element_Type *e;</div><div class='add'>+</div><div class='add'>+	e = a-&gt;elements[i];</div><div class='add'>+	while (e != NULL)</div><div class='add'>+	  {</div><div class='add'>+	     _SLAssoc_Array_Element_Type *next_e;</div><div class='add'>+</div><div class='add'>+	     next_e = e-&gt;next;</div><div class='add'>+	     free_element (e);</div><div class='add'>+	     e = next_e;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   if (a-&gt;flags &amp; HAS_DEFAULT_VALUE)</div><div class='add'>+     SLang_free_object (&amp;a-&gt;default_value);</div><div class='add'>+</div><div class='add'>+   SLfree ((char *) a);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static SLang_Object_Type *</div><div class='add'>+find_element (SLang_Assoc_Array_Type *a, char *str, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   unsigned int h;</div><div class='add'>+   _SLAssoc_Array_Element_Type *e;</div><div class='add'>+</div><div class='add'>+   h = (unsigned int) (hash % SLASSOC_HASH_TABLE_SIZE);</div><div class='add'>+   e = a-&gt;elements[h];</div><div class='add'>+</div><div class='add'>+   while (e != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (str == e-&gt;key)       /* slstrings can be compared this way */</div><div class='add'>+	  {</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+	     Cached_String = str;</div><div class='add'>+	     Cached_Obj = &amp;e-&gt;value;</div><div class='add'>+	     Cached_Array = a;</div><div class='add'>+#endif</div><div class='add'>+	     return &amp;e-&gt;value;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	e = e-&gt;next;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static _SLAssoc_Array_Element_Type *</div><div class='add'>+create_element (SLang_Assoc_Array_Type *a, char *str, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   unsigned int h;</div><div class='add'>+   _SLAssoc_Array_Element_Type *e;</div><div class='add'>+</div><div class='add'>+   e = (_SLAssoc_Array_Element_Type *) SLmalloc (sizeof (_SLAssoc_Array_Element_Type));</div><div class='add'>+   if (e == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   memset ((char *) e, 0, sizeof (_SLAssoc_Array_Element_Type));</div><div class='add'>+   h = (unsigned int) (hash % SLASSOC_HASH_TABLE_SIZE);</div><div class='add'>+</div><div class='add'>+   if (NULL == (str = _SLstring_dup_hashed_string (str, hash)))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) e);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   e-&gt;key = str;</div><div class='add'>+   e-&gt;next = a-&gt;elements[h];</div><div class='add'>+   a-&gt;elements[h] = e;</div><div class='add'>+</div><div class='add'>+   a-&gt;num_elements += 1;</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+   Cached_String = str;</div><div class='add'>+   Cached_Obj = &amp;e-&gt;value;</div><div class='add'>+   Cached_Array = a;</div><div class='add'>+#endif</div><div class='add'>+   return e;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int store_object (SLang_Assoc_Array_Type *a, char *s, SLang_Object_Type *obj)</div><div class='add'>+{</div><div class='add'>+   unsigned long hash;</div><div class='add'>+   SLang_Object_Type *v;</div><div class='add'>+</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+   if ((s == Cached_String) &amp;&amp; (a == Cached_Array))</div><div class='add'>+     {</div><div class='add'>+	v = Cached_Obj;</div><div class='add'>+	SLang_free_object (v);</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+#endif</div><div class='add'>+	hash = _SLcompute_string_hash (s);</div><div class='add'>+	if (NULL != (v = find_element (a, s, hash)))</div><div class='add'>+	  SLang_free_object (v);</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     _SLAssoc_Array_Element_Type *e;</div><div class='add'>+	     </div><div class='add'>+	     e = create_element (a, s, hash);</div><div class='add'>+	     if (e == NULL)</div><div class='add'>+	       return -1;</div><div class='add'>+	     </div><div class='add'>+	     v = &amp;e-&gt;value;</div><div class='add'>+	  }</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   *v = *obj;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void assoc_destroy (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   delete_assoc_array ((SLang_Assoc_Array_Type *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_index (unsigned int num_indices,</div><div class='add'>+		      SLang_MMT_Type **mmt,</div><div class='add'>+		      SLang_Assoc_Array_Type **a,</div><div class='add'>+		      char **str)</div><div class='add'>+{</div><div class='add'>+   if (NULL == (*mmt = SLang_pop_mmt (SLANG_ASSOC_TYPE)))</div><div class='add'>+     {</div><div class='add'>+	*a = NULL;</div><div class='add'>+	*str = NULL;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((num_indices != 1)</div><div class='add'>+       || (-1 == SLang_pop_slstring (str)))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "Assoc_Type arrays require a single string index");</div><div class='add'>+	SLang_free_mmt (*mmt);</div><div class='add'>+	*mmt = NULL;</div><div class='add'>+	*a = NULL;</div><div class='add'>+	*str = NULL;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *a = (SLang_Assoc_Array_Type *) SLang_object_from_mmt (*mmt);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int assoc_aget (unsigned char type, unsigned int num_indices)</div><div class='add'>+{</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+   char *str;</div><div class='add'>+   SLang_Assoc_Array_Type *a;</div><div class='add'>+   SLang_Object_Type *obj;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   if (-1 == pop_index (num_indices, &amp;mmt, &amp;a, &amp;str))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+   if ((str == Cached_String) &amp;&amp; (a == Cached_Array))</div><div class='add'>+     obj = Cached_Obj;</div><div class='add'>+   else</div><div class='add'>+#endif</div><div class='add'>+     obj = find_element (a, str, _SLcompute_string_hash (str));</div><div class='add'>+</div><div class='add'>+   if ((obj == NULL)</div><div class='add'>+       &amp;&amp; (a-&gt;flags &amp; HAS_DEFAULT_VALUE))</div><div class='add'>+     obj = &amp;a-&gt;default_value;</div><div class='add'>+</div><div class='add'>+   if (obj == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INTRINSIC_ERROR,</div><div class='add'>+		      "No such element in Assoc Array: %s", str);</div><div class='add'>+	ret = -1;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type[obj-&gt;data_type])</div><div class='add'>+	  ret = SLang_push (obj);</div><div class='add'>+#endif</div><div class='add'>+	else</div><div class='add'>+	  ret = _SLpush_slang_obj (obj);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_free_slstring (str);</div><div class='add'>+   SLang_free_mmt (mmt);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int assoc_aput (unsigned char type, unsigned int num_indices)</div><div class='add'>+{</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+   char *str;</div><div class='add'>+   SLang_Assoc_Array_Type *a;</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   if (-1 == pop_index (num_indices, &amp;mmt, &amp;a, &amp;str))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   ret = -1;</div><div class='add'>+</div><div class='add'>+   if (0 == SLang_pop (&amp;obj))</div><div class='add'>+     {</div><div class='add'>+	if ((obj.data_type != a-&gt;type)</div><div class='add'>+#if USE_NEW_ANYTYPE_CODE</div><div class='add'>+	    &amp;&amp; (a-&gt;type != SLANG_ANY_TYPE)</div><div class='add'>+#endif</div><div class='add'>+	    )</div><div class='add'>+	  {</div><div class='add'>+	     (void) SLang_push (&amp;obj);</div><div class='add'>+	     if ((-1 == SLclass_typecast (a-&gt;type, 1, 1))</div><div class='add'>+		 || (-1 == SLang_pop (&amp;obj)))</div><div class='add'>+	       goto the_return;</div><div class='add'>+	  }</div><div class='add'>+	</div><div class='add'>+	if (-1 == store_object (a, str, &amp;obj))</div><div class='add'>+	  SLang_free_object (&amp;obj);</div><div class='add'>+	else</div><div class='add'>+	  ret = 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   the_return:</div><div class='add'>+   SLang_free_slstring (str);</div><div class='add'>+   SLang_free_mmt (mmt);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int assoc_anew (unsigned char type, unsigned int num_dims)</div><div class='add'>+{</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+   SLang_Assoc_Array_Type *a;</div><div class='add'>+   int has_default_value;</div><div class='add'>+</div><div class='add'>+   has_default_value = 0;</div><div class='add'>+   switch (num_dims)</div><div class='add'>+     {</div><div class='add'>+      case 0:</div><div class='add'>+	type = SLANG_ANY_TYPE;</div><div class='add'>+	break;</div><div class='add'>+      case 2:</div><div class='add'>+	(void) SLreverse_stack (2);</div><div class='add'>+	has_default_value = 1;</div><div class='add'>+	/* drop */</div><div class='add'>+      case 1:</div><div class='add'>+	if (0 == _SLang_pop_datatype (&amp;type))</div><div class='add'>+	  break;</div><div class='add'>+	num_dims--;</div><div class='add'>+	/* drop */</div><div class='add'>+      default:</div><div class='add'>+	SLdo_pop_n (num_dims);</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "Usage: Assoc_Type [DataType_Type]");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   a = alloc_assoc_array (type, has_default_value);</div><div class='add'>+   if (a == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (NULL == (mmt = SLang_create_mmt (SLANG_ASSOC_TYPE, (VOID_STAR) a)))</div><div class='add'>+     {</div><div class='add'>+	delete_assoc_array (a);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_push_mmt (mmt))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_mmt (mmt);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void assoc_get_keys (SLang_Assoc_Array_Type *a)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   int num;</div><div class='add'>+   unsigned int i, j;</div><div class='add'>+   char **data;</div><div class='add'>+</div><div class='add'>+   /* Note: If support for threads is added, then we need to modify this</div><div class='add'>+    * algorithm to prevent another thread from modifying the array.</div><div class='add'>+    * However, that should be handled in inner_interp.</div><div class='add'>+    */</div><div class='add'>+   num = a-&gt;num_elements;</div><div class='add'>+</div><div class='add'>+   if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &amp;num, 1)))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   data = (char **)at-&gt;data;</div><div class='add'>+</div><div class='add'>+   i = 0;</div><div class='add'>+   for (j = 0; j &lt; SLASSOC_HASH_TABLE_SIZE; j++)</div><div class='add'>+     {</div><div class='add'>+	_SLAssoc_Array_Element_Type *e;</div><div class='add'>+</div><div class='add'>+	e = a-&gt;elements[j];</div><div class='add'>+	while (e != NULL)</div><div class='add'>+	  {</div><div class='add'>+	     /* Next cannot fail because it is an slstring */</div><div class='add'>+	     data [i] = SLang_create_slstring (e-&gt;key);</div><div class='add'>+	     e = e-&gt;next;</div><div class='add'>+	     i++;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   (void) SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+transfer_element (SLang_Class_Type *cl, VOID_STAR dest_data,</div><div class='add'>+		  SLang_Object_Type *obj)</div><div class='add'>+{</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   VOID_STAR src_data;</div><div class='add'>+</div><div class='add'>+#if USE_NEW_ANYTYPE_CODE</div><div class='add'>+   if (cl-&gt;cl_data_type == SLANG_ANY_TYPE)</div><div class='add'>+     {</div><div class='add'>+	SLang_Any_Type *any;</div><div class='add'>+</div><div class='add'>+	if ((-1 == _SLpush_slang_obj (obj))</div><div class='add'>+	    || (-1 == SLang_pop_anytype (&amp;any)))</div><div class='add'>+	  return -1;</div><div class='add'>+	</div><div class='add'>+	*(SLang_Any_Type **)dest_data = any;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   /* Optimize for scalar */</div><div class='add'>+   if (cl-&gt;cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+     {</div><div class='add'>+	sizeof_type = cl-&gt;cl_sizeof_type;</div><div class='add'>+	memcpy ((char *) dest_data, (char *)&amp;obj-&gt;v, sizeof_type);</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   src_data = _SLclass_get_ptr_to_value (cl, obj);</div><div class='add'>+</div><div class='add'>+   if (-1 == (*cl-&gt;cl_acopy) (cl-&gt;cl_data_type, src_data, dest_data))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void assoc_get_values (SLang_Assoc_Array_Type *a)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   int num;</div><div class='add'>+   unsigned int i, j;</div><div class='add'>+   char *dest_data;</div><div class='add'>+   unsigned char type;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+</div><div class='add'>+   /* Note: If support for threads is added, then we need to modify this</div><div class='add'>+    * algorithm to prevent another thread from modifying the array.</div><div class='add'>+    * However, that should be handled in inner_interp.</div><div class='add'>+    */</div><div class='add'>+   num = a-&gt;num_elements;</div><div class='add'>+   type = a-&gt;type;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   sizeof_type = cl-&gt;cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+   if (NULL == (at = SLang_create_array (type, 0, NULL, &amp;num, 1)))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   dest_data = (char *)at-&gt;data;</div><div class='add'>+</div><div class='add'>+   i = 0;</div><div class='add'>+   for (j = 0; j &lt; SLASSOC_HASH_TABLE_SIZE; j++)</div><div class='add'>+     {</div><div class='add'>+	_SLAssoc_Array_Element_Type *e;</div><div class='add'>+</div><div class='add'>+	e = a-&gt;elements[j];</div><div class='add'>+	while (e != NULL)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == transfer_element (cl, (VOID_STAR) dest_data, &amp;e-&gt;value))</div><div class='add'>+	       {</div><div class='add'>+		  SLang_free_array (at);</div><div class='add'>+		  return;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     dest_data += sizeof_type;</div><div class='add'>+	     e = e-&gt;next;</div><div class='add'>+	     i++;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   (void) SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int assoc_key_exists (SLang_Assoc_Array_Type *a, char *key)</div><div class='add'>+{</div><div class='add'>+   return (NULL != find_element (a, key, _SLcompute_string_hash (key)));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void assoc_delete_key (SLang_Assoc_Array_Type *a, char *key)</div><div class='add'>+{</div><div class='add'>+   unsigned int h;</div><div class='add'>+   _SLAssoc_Array_Element_Type *v, *v0;</div><div class='add'>+</div><div class='add'>+   h = (unsigned int) (_SLcompute_string_hash (key) % SLASSOC_HASH_TABLE_SIZE);</div><div class='add'>+</div><div class='add'>+   v0 = NULL;</div><div class='add'>+   v = a-&gt;elements[h];</div><div class='add'>+   while (v != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (v-&gt;key == key)</div><div class='add'>+	  {</div><div class='add'>+	     if (v0 != NULL)</div><div class='add'>+	       v0-&gt;next = v-&gt;next;</div><div class='add'>+	     else</div><div class='add'>+	       a-&gt;elements[h] = v-&gt;next;</div><div class='add'>+</div><div class='add'>+	     free_element (v);</div><div class='add'>+	     a-&gt;num_elements -= 1;</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+	v0 = v;</div><div class='add'>+	v = v-&gt;next;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* No such element.  Let it pass with no error. */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define A SLANG_ASSOC_TYPE</div><div class='add'>+#define S SLANG_STRING_TYPE</div><div class='add'>+static SLang_Intrin_Fun_Type Assoc_Table [] =</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_1("assoc_get_keys", assoc_get_keys, SLANG_VOID_TYPE, A),</div><div class='add'>+   MAKE_INTRINSIC_1("assoc_get_values", assoc_get_values, SLANG_VOID_TYPE, A),</div><div class='add'>+   MAKE_INTRINSIC_2("assoc_key_exists", assoc_key_exists, SLANG_INT_TYPE, A, S),</div><div class='add'>+   MAKE_INTRINSIC_2("assoc_delete_key", assoc_delete_key, SLANG_VOID_TYPE, A, S),</div><div class='add'>+</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+#undef A</div><div class='add'>+#undef S</div><div class='add'>+</div><div class='add'>+static int assoc_length (unsigned char type, VOID_STAR v, unsigned int *len)</div><div class='add'>+{</div><div class='add'>+   SLang_Assoc_Array_Type *a;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   a = (SLang_Assoc_Array_Type *) SLang_object_from_mmt (*(SLang_MMT_Type **)v);</div><div class='add'>+   *len = a-&gt;num_elements;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct _SLang_Foreach_Context_Type</div><div class='add'>+{</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+   SLang_Assoc_Array_Type *a;</div><div class='add'>+   unsigned int this_hash_index;</div><div class='add'>+   unsigned int next_same_hash_index;</div><div class='add'>+#define CTX_WRITE_KEYS		1</div><div class='add'>+#define CTX_WRITE_VALUES	2</div><div class='add'>+   unsigned char flags;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static SLang_Foreach_Context_Type *</div><div class='add'>+cl_foreach_open (unsigned char type, unsigned int num)</div><div class='add'>+{</div><div class='add'>+   SLang_Foreach_Context_Type *c;</div><div class='add'>+   unsigned char flags;</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   if (NULL == (mmt = SLang_pop_mmt (SLANG_ASSOC_TYPE)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   flags = 0;</div><div class='add'>+</div><div class='add'>+   while (num--)</div><div class='add'>+     {</div><div class='add'>+	char *s;</div><div class='add'>+</div><div class='add'>+	if (-1 == SLang_pop_slstring (&amp;s))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_mmt (mmt);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (0 == strcmp (s, "keys"))</div><div class='add'>+	  flags |= CTX_WRITE_KEYS;</div><div class='add'>+	else if (0 == strcmp (s, "values"))</div><div class='add'>+	  flags |= CTX_WRITE_VALUES;</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+			   "using '%s' not supported by SLassoc_Type",</div><div class='add'>+			   s);</div><div class='add'>+	     SLang_free_slstring (s);</div><div class='add'>+	     SLang_free_mmt (mmt);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	SLang_free_slstring (s);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (c = (SLang_Foreach_Context_Type *) SLmalloc (sizeof (SLang_Foreach_Context_Type))))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_mmt (mmt);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+</div><div class='add'>+   if (flags == 0) flags = CTX_WRITE_VALUES|CTX_WRITE_KEYS;</div><div class='add'>+</div><div class='add'>+   c-&gt;flags = flags;</div><div class='add'>+   c-&gt;mmt = mmt;</div><div class='add'>+   c-&gt;a = (SLang_Assoc_Array_Type *) SLang_object_from_mmt (mmt);</div><div class='add'>+</div><div class='add'>+   return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void cl_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   if (c == NULL) return;</div><div class='add'>+   SLang_free_mmt (c-&gt;mmt);</div><div class='add'>+   SLfree ((char *) c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int cl_foreach (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+   SLang_Assoc_Array_Type *a;</div><div class='add'>+   _SLAssoc_Array_Element_Type *e;</div><div class='add'>+   unsigned int i, j;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   if (c == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   a = c-&gt;a;</div><div class='add'>+</div><div class='add'>+   i = c-&gt;this_hash_index;</div><div class='add'>+   if (i &gt;= SLASSOC_HASH_TABLE_SIZE)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   e = a-&gt;elements[i];</div><div class='add'>+</div><div class='add'>+   j = c-&gt;next_same_hash_index;</div><div class='add'>+   c-&gt;next_same_hash_index = j + 1;</div><div class='add'>+</div><div class='add'>+   while ((j &gt; 0) &amp;&amp; (e != NULL))</div><div class='add'>+     {</div><div class='add'>+	j--;</div><div class='add'>+	e = e-&gt;next;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (e == NULL)</div><div class='add'>+     {</div><div class='add'>+	do</div><div class='add'>+	  {</div><div class='add'>+	     i++;</div><div class='add'>+	     if (i &gt;= SLASSOC_HASH_TABLE_SIZE)</div><div class='add'>+	       return 0;		       /* no more */</div><div class='add'>+	  }</div><div class='add'>+	while (a-&gt;elements [i] == NULL);</div><div class='add'>+</div><div class='add'>+	e = a-&gt;elements[i];</div><div class='add'>+	c-&gt;this_hash_index = i;</div><div class='add'>+	c-&gt;next_same_hash_index = 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((c-&gt;flags &amp; CTX_WRITE_KEYS)</div><div class='add'>+       &amp;&amp; (-1 == SLang_push_string (e-&gt;key)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((c-&gt;flags &amp; CTX_WRITE_VALUES)</div><div class='add'>+       &amp;&amp; (-1 == _SLpush_slang_obj (&amp;e-&gt;value)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* keep going */</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_init_slassoc (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (SLclass_is_class_defined (SLANG_ASSOC_TYPE))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("Assoc_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   (void) SLclass_set_destroy_function (cl, assoc_destroy);</div><div class='add'>+   (void) SLclass_set_aput_function (cl, assoc_aput);</div><div class='add'>+   (void) SLclass_set_aget_function (cl, assoc_aget);</div><div class='add'>+   (void) SLclass_set_anew_function (cl, assoc_anew);</div><div class='add'>+   cl-&gt;cl_length = assoc_length;</div><div class='add'>+   cl-&gt;cl_foreach_open = cl_foreach_open;</div><div class='add'>+   cl-&gt;cl_foreach_close = cl_foreach_close;</div><div class='add'>+   cl-&gt;cl_foreach = cl_foreach;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_ASSOC_TYPE, sizeof (SLang_Assoc_Array_Type), SLANG_CLASS_TYPE_MMT))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLadd_intrin_fun_table (Assoc_Table, "__SLASSOC__"))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slbstr.c b/mdk-stage1/slang/slbstr.c<br/>new file mode 100644<br/>index 000000000..b4b8c4c51<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slbstr.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slbstr.c</a></div><div class='hunk'>@@ -0,0 +1,615 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+struct _SLang_BString_Type</div><div class='add'>+{</div><div class='add'>+   unsigned int num_refs;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   int ptr_type;</div><div class='add'>+#define IS_SLSTRING		1</div><div class='add'>+#define IS_MALLOCED		2</div><div class='add'>+#define IS_NOT_TO_BE_FREED	3</div><div class='add'>+   union</div><div class='add'>+     {</div><div class='add'>+	unsigned char bytes[1];</div><div class='add'>+	unsigned char *ptr;</div><div class='add'>+     }</div><div class='add'>+   v;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#define BS_GET_POINTER(b) ((b)-&gt;ptr_type ? (b)-&gt;v.ptr : (b)-&gt;v.bytes)</div><div class='add'>+</div><div class='add'>+static SLang_BString_Type *create_bstring_of_type (char *bytes, unsigned int len, int type)</div><div class='add'>+{</div><div class='add'>+   SLang_BString_Type *b;</div><div class='add'>+   unsigned int size;</div><div class='add'>+</div><div class='add'>+   size = sizeof(SLang_BString_Type);</div><div class='add'>+   if (type == 0)</div><div class='add'>+     size += len;</div><div class='add'>+</div><div class='add'>+   if (NULL == (b = (SLang_BString_Type *)SLmalloc (size)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   b-&gt;len = len;</div><div class='add'>+   b-&gt;num_refs = 1;</div><div class='add'>+   b-&gt;ptr_type = type;</div><div class='add'>+</div><div class='add'>+   switch (type)</div><div class='add'>+     {</div><div class='add'>+      case 0:</div><div class='add'>+	if (bytes != NULL) memcpy ((char *) b-&gt;v.bytes, bytes, len);</div><div class='add'>+	/* Now \0 terminate it because we want to also use it as a C string</div><div class='add'>+	 * whenever possible.  Note that sizeof(SLang_BString_Type) includes</div><div class='add'>+	 * space for 1 character and we allocated len extra bytes.  Thus, it is</div><div class='add'>+	 * ok to add a \0 to the end.</div><div class='add'>+	 */</div><div class='add'>+	b-&gt;v.bytes[len] = 0;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case IS_SLSTRING:</div><div class='add'>+	if (NULL == (b-&gt;v.ptr = (unsigned char *)SLang_create_nslstring (bytes, len)))</div><div class='add'>+	  {</div><div class='add'>+	     SLfree ((char *) b);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case IS_MALLOCED:</div><div class='add'>+      case IS_NOT_TO_BE_FREED:</div><div class='add'>+	b-&gt;v.ptr = (unsigned char *)bytes;</div><div class='add'>+	bytes [len] = 0;	       /* NULL terminate */</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_BString_Type *</div><div class='add'>+SLbstring_create (unsigned char *bytes, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   return create_bstring_of_type ((char *)bytes, len, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note that ptr must be len + 1 bytes long for \0 termination */</div><div class='add'>+SLang_BString_Type *</div><div class='add'>+SLbstring_create_malloced (unsigned char *ptr, unsigned int len, int free_on_error)</div><div class='add'>+{</div><div class='add'>+   SLang_BString_Type *b;</div><div class='add'>+</div><div class='add'>+   if (ptr == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   if (NULL == (b = create_bstring_of_type ((char *)ptr, len, IS_MALLOCED)))</div><div class='add'>+     {</div><div class='add'>+	if (free_on_error)</div><div class='add'>+	  SLfree ((char *) ptr);</div><div class='add'>+     }</div><div class='add'>+   return b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_BString_Type *SLbstring_create_slstring (char *s)</div><div class='add'>+{</div><div class='add'>+   if (s == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   return create_bstring_of_type (s, strlen (s), IS_SLSTRING);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_BString_Type *SLbstring_dup (SLang_BString_Type *b)</div><div class='add'>+{</div><div class='add'>+   if (b != NULL)</div><div class='add'>+     b-&gt;num_refs += 1;</div><div class='add'>+</div><div class='add'>+   return b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned char *SLbstring_get_pointer (SLang_BString_Type *b, unsigned int *len)</div><div class='add'>+{</div><div class='add'>+   if (b == NULL)</div><div class='add'>+     {</div><div class='add'>+	*len = 0;</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   *len = b-&gt;len;</div><div class='add'>+   return BS_GET_POINTER(b);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLbstring_free (SLang_BString_Type *b)</div><div class='add'>+{</div><div class='add'>+   if (b == NULL)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (b-&gt;num_refs &gt; 1)</div><div class='add'>+     {</div><div class='add'>+	b-&gt;num_refs -= 1;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   switch (b-&gt;ptr_type)</div><div class='add'>+     {</div><div class='add'>+      case 0:</div><div class='add'>+      case IS_NOT_TO_BE_FREED:</div><div class='add'>+      default:</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case IS_SLSTRING:</div><div class='add'>+	SLang_free_slstring ((char *)b-&gt;v.ptr);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case IS_MALLOCED:</div><div class='add'>+	SLfree ((char *)b-&gt;v.ptr);</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLfree ((char *) b);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_bstring (SLang_BString_Type **b)</div><div class='add'>+{</div><div class='add'>+   return SLclass_pop_ptr_obj (SLANG_BSTRING_TYPE, (VOID_STAR *)b);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_bstring (SLang_BString_Type *b)</div><div class='add'>+{</div><div class='add'>+   if (b == NULL)</div><div class='add'>+     return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+   b-&gt;num_refs += 1;</div><div class='add'>+</div><div class='add'>+   if (0 == SLclass_push_ptr_obj (SLANG_BSTRING_TYPE, (VOID_STAR)b))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   b-&gt;num_refs -= 1;</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+bstring_bstring_bin_op_result (int op, unsigned char a, unsigned char b,</div><div class='add'>+			       unsigned char *c)</div><div class='add'>+{</div><div class='add'>+   (void) a;</div><div class='add'>+   (void) b;</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLANG_PLUS:</div><div class='add'>+	*c = SLANG_BSTRING_TYPE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_GT:</div><div class='add'>+      case SLANG_GE:</div><div class='add'>+      case SLANG_LT:</div><div class='add'>+      case SLANG_LE:</div><div class='add'>+      case SLANG_EQ:</div><div class='add'>+      case SLANG_NE:</div><div class='add'>+	*c = SLANG_CHAR_TYPE;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int compare_bstrings (SLang_BString_Type *a, SLang_BString_Type *b)</div><div class='add'>+{</div><div class='add'>+   unsigned int len;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   len = a-&gt;len;</div><div class='add'>+   if (b-&gt;len &lt; len) len = b-&gt;len;</div><div class='add'>+</div><div class='add'>+   ret = memcmp ((char *)BS_GET_POINTER(b), (char *)BS_GET_POINTER(a), len);</div><div class='add'>+   if (ret != 0)</div><div class='add'>+     return ret;</div><div class='add'>+</div><div class='add'>+   if (a-&gt;len &gt; b-&gt;len)</div><div class='add'>+     return 1;</div><div class='add'>+   if (a-&gt;len == b-&gt;len)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_BString_Type *</div><div class='add'>+concat_bstrings (SLang_BString_Type *a, SLang_BString_Type *b)</div><div class='add'>+{</div><div class='add'>+   unsigned int len;</div><div class='add'>+   SLang_BString_Type *c;</div><div class='add'>+   char *bytes;</div><div class='add'>+</div><div class='add'>+   len = a-&gt;len + b-&gt;len;</div><div class='add'>+</div><div class='add'>+   if (NULL == (c = SLbstring_create (NULL, len)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   bytes = (char *)BS_GET_POINTER(c);</div><div class='add'>+</div><div class='add'>+   memcpy (bytes, (char *)BS_GET_POINTER(a), a-&gt;len);</div><div class='add'>+   memcpy (bytes + a-&gt;len, (char *)BS_GET_POINTER(b), b-&gt;len);</div><div class='add'>+</div><div class='add'>+   return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_n_bstrings (SLang_BString_Type **a, unsigned int n)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   if (a == NULL) return;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; n; i++)</div><div class='add'>+     {</div><div class='add'>+	SLbstring_free (a[i]);</div><div class='add'>+	a[i] = NULL;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+bstring_bstring_bin_op (int op,</div><div class='add'>+			unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+			unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+			VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   char *ic;</div><div class='add'>+   SLang_BString_Type **a, **b, **c;</div><div class='add'>+   unsigned int n, n_max;</div><div class='add'>+   unsigned int da, db;</div><div class='add'>+</div><div class='add'>+   (void) a_type;</div><div class='add'>+   (void) b_type;</div><div class='add'>+</div><div class='add'>+   if (na == 1) da = 0; else da = 1;</div><div class='add'>+   if (nb == 1) db = 0; else db = 1;</div><div class='add'>+</div><div class='add'>+   if (na &gt; nb) n_max = na; else n_max = nb;</div><div class='add'>+</div><div class='add'>+   a = (SLang_BString_Type **) ap;</div><div class='add'>+   b = (SLang_BString_Type **) bp;</div><div class='add'>+   for (n = 0; n &lt; n_max; n++)</div><div class='add'>+     {</div><div class='add'>+	if ((*a == NULL) || (*b == NULL))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_VARIABLE_UNINITIALIZED,</div><div class='add'>+			   "Binary string element[%u] not initialized for binary operation", n);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	a += da; b += db;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   a = (SLang_BString_Type **) ap;</div><div class='add'>+   b = (SLang_BString_Type **) bp;</div><div class='add'>+   ic = (char *) cp;</div><div class='add'>+   c = NULL;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+       case SLANG_PLUS:</div><div class='add'>+	/* Concat */</div><div class='add'>+	c = (SLang_BString_Type **) cp;</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     if (NULL == (c[n] = concat_bstrings (*a, *b)))</div><div class='add'>+	       goto return_error;</div><div class='add'>+</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_NE:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     ic [n] = (0 != compare_bstrings (*a, *b));</div><div class='add'>+	     a += da;</div><div class='add'>+	     b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_GT:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     ic [n] = (compare_bstrings (*a, *b) &gt; 0);</div><div class='add'>+	     a += da;</div><div class='add'>+	     b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_GE:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     ic [n] = (compare_bstrings (*a, *b) &gt;= 0);</div><div class='add'>+	     a += da;</div><div class='add'>+	     b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_LT:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     ic [n] = (compare_bstrings (*a, *b) &lt; 0);</div><div class='add'>+	     a += da;</div><div class='add'>+	     b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_LE:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     ic [n] = (compare_bstrings (*a, *b) &lt;= 0);</div><div class='add'>+	     a += da;</div><div class='add'>+	     b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_EQ:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     ic [n] = (compare_bstrings (*a, *b) == 0);</div><div class='add'>+	     a += da;</div><div class='add'>+	     b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   if (c != NULL)</div><div class='add'>+     {</div><div class='add'>+	free_n_bstrings (c, n);</div><div class='add'>+	while (n &lt; n_max)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = NULL;</div><div class='add'>+	     n++;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* If preserve_ptr, then use a[i] as the bstring data.  See how this function</div><div class='add'>+ * is called by the binary op routines for why.</div><div class='add'>+ */</div><div class='add'>+static SLang_BString_Type **</div><div class='add'>+make_n_bstrings (SLang_BString_Type **b, char **a, unsigned int n, int ptr_type)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+   int malloc_flag;</div><div class='add'>+</div><div class='add'>+   malloc_flag = 0;</div><div class='add'>+   if (b == NULL)</div><div class='add'>+     {</div><div class='add'>+	b = (SLang_BString_Type **) SLmalloc ((n + 1) * sizeof (SLang_BString_Type *));</div><div class='add'>+	if (b == NULL)</div><div class='add'>+	  return NULL;</div><div class='add'>+	malloc_flag = 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; n; i++)</div><div class='add'>+     {</div><div class='add'>+	char *s = a[i];</div><div class='add'>+</div><div class='add'>+	if (s == NULL)</div><div class='add'>+	  {</div><div class='add'>+	     b[i] = NULL;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (NULL == (b[i] = create_bstring_of_type (s, strlen(s), ptr_type)))</div><div class='add'>+	  {</div><div class='add'>+	     free_n_bstrings (b, i);</div><div class='add'>+	     if (malloc_flag) SLfree ((char *) b);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+bstring_string_bin_op (int op,</div><div class='add'>+		       unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+		       unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+		       VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   SLang_BString_Type **b;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   if (NULL == (b = make_n_bstrings (NULL, (char **)bp, nb, IS_NOT_TO_BE_FREED)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   b_type = SLANG_BSTRING_TYPE;</div><div class='add'>+   ret = bstring_bstring_bin_op (op,</div><div class='add'>+				 a_type, ap, na,</div><div class='add'>+				 b_type, (VOID_STAR) b, nb,</div><div class='add'>+				 cp);</div><div class='add'>+   free_n_bstrings (b, nb);</div><div class='add'>+   SLfree ((char *) b);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+string_bstring_bin_op (int op,</div><div class='add'>+		       unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+		       unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+		       VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   SLang_BString_Type **a;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   if (NULL == (a = make_n_bstrings (NULL, (char **)ap, na, IS_NOT_TO_BE_FREED)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   a_type = SLANG_BSTRING_TYPE;</div><div class='add'>+   ret = bstring_bstring_bin_op (op,</div><div class='add'>+				 a_type, (VOID_STAR) a, na,</div><div class='add'>+				 b_type, bp, nb,</div><div class='add'>+				 cp);</div><div class='add'>+   free_n_bstrings (a, na);</div><div class='add'>+   SLfree ((char *) a);</div><div class='add'>+</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void bstring_destroy (unsigned char unused, VOID_STAR s)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+   SLbstring_free (*(SLang_BString_Type **) s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int bstring_push (unsigned char unused, VOID_STAR sptr)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+</div><div class='add'>+   return SLang_push_bstring (*(SLang_BString_Type **) sptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int string_to_bstring (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+			      unsigned char b_type, VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   char **s;</div><div class='add'>+   SLang_BString_Type **b;</div><div class='add'>+</div><div class='add'>+   (void) a_type;</div><div class='add'>+   (void) b_type;</div><div class='add'>+</div><div class='add'>+   s = (char **) ap;</div><div class='add'>+   b = (SLang_BString_Type **) bp;</div><div class='add'>+</div><div class='add'>+   if (NULL == make_n_bstrings (b, s, na, IS_SLSTRING))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int bstring_to_string (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+			      unsigned char b_type, VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   char **s;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   SLang_BString_Type **a;</div><div class='add'>+</div><div class='add'>+   (void) a_type;</div><div class='add'>+   (void) b_type;</div><div class='add'>+</div><div class='add'>+   s = (char **) bp;</div><div class='add'>+   a = (SLang_BString_Type **) ap;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; na; i++)</div><div class='add'>+     {</div><div class='add'>+	SLang_BString_Type *ai = a[i];</div><div class='add'>+</div><div class='add'>+	if (ai == NULL)</div><div class='add'>+	  {</div><div class='add'>+	     s[i] = NULL;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (NULL == (s[i] = SLang_create_slstring ((char *)BS_GET_POINTER(ai))))</div><div class='add'>+	  {</div><div class='add'>+	     while (i != 0)</div><div class='add'>+	       {</div><div class='add'>+		  i--;</div><div class='add'>+		  SLang_free_slstring (s[i]);</div><div class='add'>+		  s[i] = NULL;</div><div class='add'>+	       }</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *bstring_string (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   SLang_BString_Type *s;</div><div class='add'>+   unsigned char buf[128];</div><div class='add'>+   unsigned char *bytes, *bytes_max;</div><div class='add'>+   unsigned char *b, *bmax;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   s = *(SLang_BString_Type **) v;</div><div class='add'>+   bytes = BS_GET_POINTER(s);</div><div class='add'>+   bytes_max = bytes + s-&gt;len;</div><div class='add'>+</div><div class='add'>+   b = buf;</div><div class='add'>+   bmax = buf + (sizeof (buf) - 4);</div><div class='add'>+</div><div class='add'>+   while (bytes &lt; bytes_max)</div><div class='add'>+     {</div><div class='add'>+	unsigned char ch = *bytes;</div><div class='add'>+</div><div class='add'>+	if ((ch &lt; 32) || (ch &gt;= 127) || (ch == '\\'))</div><div class='add'>+	  {</div><div class='add'>+	     if (b + 4 &gt; bmax)</div><div class='add'>+	       break;</div><div class='add'>+</div><div class='add'>+	     sprintf ((char *) b, "\\%03o", ch);</div><div class='add'>+	     b += 4;</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     if (b == bmax)</div><div class='add'>+	       break;</div><div class='add'>+</div><div class='add'>+	     *b++ = ch;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	bytes++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (bytes &lt; bytes_max)</div><div class='add'>+     {</div><div class='add'>+	*b++ = '.';</div><div class='add'>+	*b++ = '.';</div><div class='add'>+	*b++ = '.';</div><div class='add'>+     }</div><div class='add'>+   *b = 0;</div><div class='add'>+</div><div class='add'>+   return SLmake_string ((char *)buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned int bstrlen_cmd (SLang_BString_Type *b)</div><div class='add'>+{</div><div class='add'>+   return b-&gt;len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type BString_Table [] = /*{{{*/</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_1("bstrlen",  bstrlen_cmd, SLANG_UINT_TYPE, SLANG_BSTRING_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("pack", _SLpack, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_2("unpack", _SLunpack, SLANG_VOID_TYPE, SLANG_STRING_TYPE, SLANG_BSTRING_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_1("pad_pack_format", _SLpack_pad_format, SLANG_VOID_TYPE, SLANG_STRING_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_1("sizeof_pack", _SLpack_compute_size, SLANG_UINT_TYPE, SLANG_STRING_TYPE),</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLang_init_bstring (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("BString_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+   (void) SLclass_set_destroy_function (cl, bstring_destroy);</div><div class='add'>+   (void) SLclass_set_push_function (cl, bstring_push);</div><div class='add'>+   (void) SLclass_set_string_function (cl, bstring_string);</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_BSTRING_TYPE, sizeof (char *),</div><div class='add'>+				     SLANG_CLASS_TYPE_PTR))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLclass_add_typecast (SLANG_BSTRING_TYPE, SLANG_STRING_TYPE, bstring_to_string, 1))</div><div class='add'>+       || (-1 == SLclass_add_typecast (SLANG_STRING_TYPE, SLANG_BSTRING_TYPE, string_to_bstring, 1))</div><div class='add'>+       || (-1 == SLclass_add_binary_op (SLANG_BSTRING_TYPE, SLANG_BSTRING_TYPE, bstring_bstring_bin_op, bstring_bstring_bin_op_result))</div><div class='add'>+       || (-1 == SLclass_add_binary_op (SLANG_STRING_TYPE, SLANG_BSTRING_TYPE, string_bstring_bin_op, bstring_bstring_bin_op_result))</div><div class='add'>+       || (-1 == SLclass_add_binary_op (SLANG_BSTRING_TYPE, SLANG_STRING_TYPE, bstring_string_bin_op, bstring_bstring_bin_op_result)))</div><div class='add'>+</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLadd_intrin_fun_table (BString_Table, NULL))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slclass.c b/mdk-stage1/slang/slclass.c<br/>new file mode 100644<br/>index 000000000..733888cb8<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slclass.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slclass.c</a></div><div class='hunk'>@@ -0,0 +1,1391 @@</div><div class='add'>+/* User defined objects */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+unsigned char _SLclass_Class_Type [256];</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_Class_Type *Registered_Types[256];</div><div class='add'>+SLang_Class_Type *_SLclass_get_class (unsigned char type)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = Registered_Types [type];</div><div class='add'>+   if (cl == NULL)</div><div class='add'>+     SLang_exit_error ("Application error: Type %d not registered", (int) type);</div><div class='add'>+</div><div class='add'>+   return cl;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_is_class_defined (unsigned char type)</div><div class='add'>+{</div><div class='add'>+   return (NULL != Registered_Types[type]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+VOID_STAR _SLclass_get_ptr_to_value (SLang_Class_Type *cl,</div><div class='add'>+				     SLang_Object_Type *obj)</div><div class='add'>+{</div><div class='add'>+   VOID_STAR p;</div><div class='add'>+</div><div class='add'>+   switch (cl-&gt;cl_class_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_CLASS_TYPE_MMT:</div><div class='add'>+      case SLANG_CLASS_TYPE_PTR:</div><div class='add'>+      case SLANG_CLASS_TYPE_SCALAR:</div><div class='add'>+	p = (VOID_STAR) &amp;obj-&gt;v;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_CLASS_TYPE_VECTOR:</div><div class='add'>+	p = obj-&gt;v.ptr_val;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	p = NULL;</div><div class='add'>+     }</div><div class='add'>+   return p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLclass_get_datatype_name (unsigned char stype)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (stype);</div><div class='add'>+   return cl-&gt;cl_name;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int method_undefined_error (unsigned char type, char *method, char *name)</div><div class='add'>+{</div><div class='add'>+   if (name == NULL) name = SLclass_get_datatype_name (type);</div><div class='add'>+</div><div class='add'>+   SLang_verror (SL_TYPE_MISMATCH, "%s method not defined for %s",</div><div class='add'>+		 method, name);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+scalar_vector_bin_op_result (int op, unsigned char a, unsigned char b,</div><div class='add'>+			     unsigned char *c)</div><div class='add'>+{</div><div class='add'>+   (void) a; (void) b;</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_NE:</div><div class='add'>+      case SLANG_EQ:</div><div class='add'>+	*c = SLANG_INT_TYPE;</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+scalar_vector_bin_op (int op,</div><div class='add'>+		      unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+		      unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+		      VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   int *c;</div><div class='add'>+   char *a, *b;</div><div class='add'>+   unsigned int da, db;</div><div class='add'>+   unsigned int n, n_max;</div><div class='add'>+   unsigned int data_type_len;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   (void) b_type;</div><div class='add'>+   cl = _SLclass_get_class (a_type);</div><div class='add'>+</div><div class='add'>+   data_type_len = cl-&gt;cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+   a = (char *) ap;</div><div class='add'>+   b = (char *) bp;</div><div class='add'>+   c = (int *) cp;</div><div class='add'>+</div><div class='add'>+   if (na == 1) da = 0; else da = data_type_len;</div><div class='add'>+   if (nb == 1) db = 0; else db = data_type_len;</div><div class='add'>+   if (na &gt; nb) n_max = na; else n_max = nb;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLANG_NE:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = (0 != SLMEMCMP(a, b, data_type_len));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_EQ:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = (0 == SLMEMCMP(a, b, data_type_len));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int scalar_fread (unsigned char type, FILE *fp, VOID_STAR ptr,</div><div class='add'>+			 unsigned int desired, unsigned int *actual)</div><div class='add'>+{</div><div class='add'>+   unsigned int n;</div><div class='add'>+</div><div class='add'>+   n = fread ((char *) ptr, _SLclass_get_class (type)-&gt;cl_sizeof_type,</div><div class='add'>+	      desired, fp);</div><div class='add'>+   *actual = n;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int scalar_fwrite (unsigned char type, FILE *fp, VOID_STAR ptr,</div><div class='add'>+			  unsigned int desired, unsigned int *actual)</div><div class='add'>+{</div><div class='add'>+   unsigned int n;</div><div class='add'>+</div><div class='add'>+   n = fwrite ((char *) ptr, _SLclass_get_class (type)-&gt;cl_sizeof_type,</div><div class='add'>+	       desired, fp);</div><div class='add'>+   *actual = n;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int vector_apush (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   return (*cl-&gt;cl_push)(type, (VOID_STAR) &amp;ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int vector_apop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   return (*cl-&gt;cl_pop)(type, (VOID_STAR) &amp;ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int default_push_mmt (unsigned char type_unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   SLang_MMT_Type *ref;</div><div class='add'>+</div><div class='add'>+   (void) type_unused;</div><div class='add'>+   ref = *(SLang_MMT_Type **) ptr;</div><div class='add'>+   return SLang_push_mmt (ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void default_destroy_simple (unsigned char type_unused, VOID_STAR ptr_unused)</div><div class='add'>+{</div><div class='add'>+   (void) type_unused;</div><div class='add'>+   (void) ptr_unused;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void default_destroy_user (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   SLang_free_mmt (*(SLang_MMT_Type **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int default_pop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   return SLclass_pop_ptr_obj (type, (VOID_STAR *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int default_datatype_deref (unsigned char type)</div><div class='add'>+{</div><div class='add'>+   return method_undefined_error (type, "datatype_deref", NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int default_acopy (unsigned char type, VOID_STAR from, VOID_STAR to)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   if (-1 == (*cl-&gt;cl_apush) (type, from))</div><div class='add'>+     return -1;</div><div class='add'>+   return (*cl-&gt;cl_apop) (type, to);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int default_dereference_object (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) ptr;</div><div class='add'>+   return method_undefined_error (type, "dereference", NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *default_string (unsigned char stype, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   char buf [256];</div><div class='add'>+   char *s;</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+   double *cplx;</div><div class='add'>+#endif</div><div class='add'>+   s = buf;</div><div class='add'>+</div><div class='add'>+   switch (stype)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_STRING_TYPE:</div><div class='add'>+	s = *(char **) v;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_NULL_TYPE:</div><div class='add'>+	s = "NULL";</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_DATATYPE_TYPE:</div><div class='add'>+	s = SLclass_get_datatype_name ((unsigned char) *(int *)v);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+      case SLANG_COMPLEX_TYPE:</div><div class='add'>+	cplx = *(double **) v;</div><div class='add'>+	if (cplx[1] &lt; 0)</div><div class='add'>+	  sprintf (s, "(%g - %gi)", cplx [0], -cplx [1]);</div><div class='add'>+	else</div><div class='add'>+	  sprintf (s, "(%g + %gi)", cplx [0], cplx [1]);</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+      default:</div><div class='add'>+	s = SLclass_get_datatype_name (stype);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return SLmake_string (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+use_cmp_bin_op_result (int op, unsigned char a, unsigned char b,</div><div class='add'>+		       unsigned char *c)</div><div class='add'>+{</div><div class='add'>+   if (a != b)</div><div class='add'>+     return 0;</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_NE:</div><div class='add'>+      case SLANG_EQ:</div><div class='add'>+      case SLANG_LT:</div><div class='add'>+      case SLANG_LE:</div><div class='add'>+      case SLANG_GT:</div><div class='add'>+      case SLANG_GE:</div><div class='add'>+	*c = SLANG_INT_TYPE;</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+use_cmp_bin_op (int op,</div><div class='add'>+		unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+		unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+		VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   int *c;</div><div class='add'>+   char *a, *b;</div><div class='add'>+   unsigned int da, db;</div><div class='add'>+   unsigned int n, n_max;</div><div class='add'>+   unsigned int data_type_len;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   int (*cmp)(unsigned char, VOID_STAR, VOID_STAR, int *);</div><div class='add'>+</div><div class='add'>+   (void) b_type;</div><div class='add'>+   cl = _SLclass_get_class (a_type);</div><div class='add'>+   cmp = cl-&gt;cl_cmp;</div><div class='add'>+   data_type_len = cl-&gt;cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+   a = (char *) ap;</div><div class='add'>+   b = (char *) bp;</div><div class='add'>+   c = (int *) cp;</div><div class='add'>+</div><div class='add'>+   if (na == 1) da = 0; else da = data_type_len;</div><div class='add'>+   if (nb == 1) db = 0; else db = data_type_len;</div><div class='add'>+   if (na &gt; nb) n_max = na; else n_max = nb;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+	int result;</div><div class='add'>+	</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLANG_NE:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &amp;result))</div><div class='add'>+	       return -1;</div><div class='add'>+	     c[n] = (result != 0);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_EQ:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &amp;result))</div><div class='add'>+	       return -1;</div><div class='add'>+	     c[n] = (result == 0);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_GT:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &amp;result))</div><div class='add'>+	       return -1;</div><div class='add'>+	     c[n] = (result &gt; 0);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_GE:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &amp;result))</div><div class='add'>+	       return -1;</div><div class='add'>+	     c[n] = (result &gt;= 0);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_LT:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &amp;result))</div><div class='add'>+	       return -1;</div><div class='add'>+	     c[n] = (result &lt; 0);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_LE:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &amp;result))</div><div class='add'>+	       return -1;</div><div class='add'>+	     c[n] = (result &lt;= 0);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+int SLclass_get_class_id (SLang_Class_Type *cl)</div><div class='add'>+{</div><div class='add'>+   if (cl == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+   return (int) cl-&gt;cl_data_type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Class_Type *SLclass_allocate_class (char *name)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; 256; i++)</div><div class='add'>+     {</div><div class='add'>+	cl = Registered_Types [i];</div><div class='add'>+	if ((cl != NULL)</div><div class='add'>+	    &amp;&amp; (0 == strcmp (cl-&gt;cl_name, name)))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_DUPLICATE_DEFINITION, "Type name %s already exists", name);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   cl = (SLang_Class_Type *) SLmalloc (sizeof (SLang_Class_Type));</div><div class='add'>+   if (cl == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+   SLMEMSET ((char *) cl, 0, sizeof (SLang_Class_Type));</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl-&gt;cl_name = SLang_create_slstring (name)))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) cl);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return cl;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int DataType_Ids [256];</div><div class='add'>+</div><div class='add'>+int _SLang_push_datatype (unsigned char data_type)</div><div class='add'>+{</div><div class='add'>+   /* This data type could be a copy of another type, e.g., short and</div><div class='add'>+    * int if they are the same size (Int16 == Short).  So, make sure</div><div class='add'>+    * we push the original and not the copy. </div><div class='add'>+    */</div><div class='add'>+   data_type = _SLclass_get_class (data_type)-&gt;cl_data_type;</div><div class='add'>+   return SLclass_push_int_obj (SLANG_DATATYPE_TYPE, (int) data_type);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int datatype_deref (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   /* The parser generated code for this as if a function call were to be</div><div class='add'>+    * made.  However, we are calling the deref object routine</div><div class='add'>+    * instead of the function call.  So, I must simulate the function call.</div><div class='add'>+    */</div><div class='add'>+   if (-1 == _SL_increment_frame_pointer ())</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   type = (unsigned char) *(int *) ptr;</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   status = (*cl-&gt;cl_datatype_deref) (type);</div><div class='add'>+</div><div class='add'>+   (void) _SL_decrement_frame_pointer ();</div><div class='add'>+   return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int datatype_push (unsigned char type_unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) type_unused;</div><div class='add'>+   return _SLang_push_datatype (*(int *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_pop_datatype (unsigned char *type)</div><div class='add'>+{</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_pop_int_obj (SLANG_DATATYPE_TYPE, &amp;i))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   *type = (unsigned char) i;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int datatype_pop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   if (-1 == _SLang_pop_datatype (&amp;type))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   *(int *) ptr = type;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLclass_init (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   /* First initialize the container classes.  This is so binary operations</div><div class='add'>+    * added later will work with them.</div><div class='add'>+    */</div><div class='add'>+   if (-1 == _SLarray_init_slarray ())</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* DataType_Type */</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("DataType_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+   cl-&gt;cl_pop = datatype_pop;</div><div class='add'>+   cl-&gt;cl_push = datatype_push;</div><div class='add'>+   cl-&gt;cl_dereference = datatype_deref;</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_DATATYPE_TYPE, sizeof(int),</div><div class='add'>+				     SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int register_new_datatype (char *name, unsigned char type)</div><div class='add'>+{</div><div class='add'>+   DataType_Ids [type] = type;</div><div class='add'>+   return SLadd_intrinsic_variable (name, (VOID_STAR) (DataType_Ids + type),</div><div class='add'>+				    SLANG_DATATYPE_TYPE, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_create_synonym (char *name, unsigned char type)</div><div class='add'>+{</div><div class='add'>+   if (NULL == _SLclass_get_class (type))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return register_new_datatype (name, type);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLclass_copy_class (unsigned char to, unsigned char from)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl = _SLclass_get_class (from);</div><div class='add'>+</div><div class='add'>+   if (Registered_Types[to] != NULL)</div><div class='add'>+     SLang_exit_error ("Application error: Class already exists");</div><div class='add'>+</div><div class='add'>+   Registered_Types[to] = cl;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (to != SLANG_UNDEFINED_TYPE)</div><div class='add'>+     _SLclass_Class_Type [to] = cl-&gt;cl_class_type;</div><div class='add'>+#endif</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_register_class (SLang_Class_Type *cl, unsigned char type, unsigned int type_size, unsigned char class_type)</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   int can_binop = 1;		       /* scalar_vector_bin_op should work</div><div class='add'>+					* for all data types.</div><div class='add'>+					*/</div><div class='add'>+</div><div class='add'>+   if (type == SLANG_VOID_TYPE) for (i = 0; i &lt; 256; i++)</div><div class='add'>+     {</div><div class='add'>+	if ((Registered_Types[i] == NULL)</div><div class='add'>+	    &amp;&amp; (i != SLANG_VOID_TYPE))</div><div class='add'>+	  {</div><div class='add'>+	     type = (unsigned char) i;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((NULL != Registered_Types [type])</div><div class='add'>+       || (type == SLANG_VOID_TYPE))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_APPLICATION_ERROR, "Class type %d already in use", (int) type);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_data_type = type;</div><div class='add'>+   cl-&gt;cl_class_type = class_type;</div><div class='add'>+   name = cl-&gt;cl_name;</div><div class='add'>+</div><div class='add'>+   switch (class_type)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_CLASS_TYPE_MMT:</div><div class='add'>+	if (cl-&gt;cl_push == NULL) cl-&gt;cl_push = default_push_mmt;</div><div class='add'>+	if (cl-&gt;cl_destroy == NULL)</div><div class='add'>+	  return method_undefined_error (type, "destroy", name);</div><div class='add'>+	cl-&gt;cl_user_destroy_fun = cl-&gt;cl_destroy;</div><div class='add'>+	cl-&gt;cl_destroy = default_destroy_user;</div><div class='add'>+	type_size = sizeof (VOID_STAR);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_CLASS_TYPE_SCALAR:</div><div class='add'>+	if (cl-&gt;cl_destroy == NULL) cl-&gt;cl_destroy = default_destroy_simple;</div><div class='add'>+	if ((type_size == 0)</div><div class='add'>+	    || (type_size &gt; sizeof (_SL_Object_Union_Type)))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_INVALID_PARM,</div><div class='add'>+			   "Type size for %s not appropriate for SCALAR type",</div><div class='add'>+			   name);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	if (cl-&gt;cl_pop == NULL)</div><div class='add'>+	  return method_undefined_error (type, "pop", name);</div><div class='add'>+	if (cl-&gt;cl_fread == NULL) cl-&gt;cl_fread = scalar_fread;</div><div class='add'>+	if (cl-&gt;cl_fwrite == NULL) cl-&gt;cl_fwrite = scalar_fwrite;</div><div class='add'>+</div><div class='add'>+	can_binop = 1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_CLASS_TYPE_PTR:</div><div class='add'>+	if (cl-&gt;cl_destroy == NULL)</div><div class='add'>+	  return method_undefined_error (type, "destroy", name);</div><div class='add'>+	type_size = sizeof (VOID_STAR);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_CLASS_TYPE_VECTOR:</div><div class='add'>+	if (cl-&gt;cl_destroy == NULL)</div><div class='add'>+	  return method_undefined_error (type, "destroy", name);</div><div class='add'>+	if (cl-&gt;cl_pop == NULL)</div><div class='add'>+	  return method_undefined_error (type, "pop", name);</div><div class='add'>+	cl-&gt;cl_apop = vector_apop;</div><div class='add'>+	cl-&gt;cl_apush = vector_apush;</div><div class='add'>+	cl-&gt;cl_adestroy = default_destroy_simple;</div><div class='add'>+	if (cl-&gt;cl_fread == NULL) cl-&gt;cl_fread = scalar_fread;</div><div class='add'>+	if (cl-&gt;cl_fwrite == NULL) cl-&gt;cl_fwrite = scalar_fwrite;</div><div class='add'>+	can_binop = 1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "%s: unknown class type (%d)", name, class_type);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (type != SLANG_UNDEFINED_TYPE)</div><div class='add'>+     _SLclass_Class_Type [type] = class_type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (type_size == 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "type size must be non-zero for %s", name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (cl-&gt;cl_string == NULL) cl-&gt;cl_string = default_string;</div><div class='add'>+   if (cl-&gt;cl_acopy == NULL) cl-&gt;cl_acopy = default_acopy;</div><div class='add'>+   if (cl-&gt;cl_datatype_deref == NULL) cl-&gt;cl_datatype_deref = default_datatype_deref;</div><div class='add'>+</div><div class='add'>+   if (cl-&gt;cl_pop == NULL) cl-&gt;cl_pop = default_pop;</div><div class='add'>+</div><div class='add'>+   if (cl-&gt;cl_push == NULL)</div><div class='add'>+     return method_undefined_error (type, "push", name);</div><div class='add'>+</div><div class='add'>+   if (cl-&gt;cl_byte_code_destroy == NULL)</div><div class='add'>+     cl-&gt;cl_byte_code_destroy = cl-&gt;cl_destroy;</div><div class='add'>+   if (cl-&gt;cl_push_literal == NULL)</div><div class='add'>+     cl-&gt;cl_push_literal = cl-&gt;cl_push;</div><div class='add'>+</div><div class='add'>+   if (cl-&gt;cl_dereference == NULL)</div><div class='add'>+     cl-&gt;cl_dereference = default_dereference_object;</div><div class='add'>+</div><div class='add'>+   if (cl-&gt;cl_apop == NULL) cl-&gt;cl_apop = cl-&gt;cl_pop;</div><div class='add'>+   if (cl-&gt;cl_apush == NULL) cl-&gt;cl_apush = cl-&gt;cl_push;</div><div class='add'>+   if (cl-&gt;cl_adestroy == NULL) cl-&gt;cl_adestroy = cl-&gt;cl_destroy;</div><div class='add'>+   if (cl-&gt;cl_push_intrinsic == NULL) cl-&gt;cl_push_intrinsic = cl-&gt;cl_push;</div><div class='add'>+</div><div class='add'>+   if ((cl-&gt;cl_foreach == NULL)</div><div class='add'>+       || (cl-&gt;cl_foreach_open == NULL)</div><div class='add'>+       || (cl-&gt;cl_foreach_close == NULL))</div><div class='add'>+     {</div><div class='add'>+	cl-&gt;cl_foreach = _SLarray_cl_foreach;</div><div class='add'>+	cl-&gt;cl_foreach_open = _SLarray_cl_foreach_open;</div><div class='add'>+	cl-&gt;cl_foreach_close = _SLarray_cl_foreach_close;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_sizeof_type = type_size;</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl-&gt;cl_transfer_buf = (VOID_STAR) SLmalloc (type_size)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   Registered_Types[type] = cl;</div><div class='add'>+</div><div class='add'>+   if (-1 == register_new_datatype (name, type))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (cl-&gt;cl_cmp != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLclass_add_binary_op (type, type, use_cmp_bin_op, use_cmp_bin_op_result))</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+   else if (can_binop</div><div class='add'>+	    &amp;&amp; (-1 == SLclass_add_binary_op (type, type, scalar_vector_bin_op, scalar_vector_bin_op_result)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_anytype_typecast = _SLanytype_typecast;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_add_math_op (unsigned char type,</div><div class='add'>+			 int (*handler)(int,</div><div class='add'>+					unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+					VOID_STAR),</div><div class='add'>+			 int (*result) (int, unsigned char, unsigned char *))</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_math_op = handler;</div><div class='add'>+   cl-&gt;cl_math_op_result_type = result;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_add_binary_op (unsigned char a, unsigned char b,</div><div class='add'>+			   int (*f) (int,</div><div class='add'>+				     unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+				     unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+				     VOID_STAR),</div><div class='add'>+			   int (*r) (int, unsigned char, unsigned char, unsigned char *))</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   SL_OOBinary_Type *ab;</div><div class='add'>+</div><div class='add'>+   if ((f == NULL) || (r == NULL))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "SLclass_add_binary_op");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (a);</div><div class='add'>+   (void) _SLclass_get_class (b);</div><div class='add'>+</div><div class='add'>+   if (NULL == (ab = (SL_OOBinary_Type *) SLmalloc (sizeof(SL_OOBinary_Type))))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   ab-&gt;data_type = b;</div><div class='add'>+   ab-&gt;binary_function = f;</div><div class='add'>+   ab-&gt;binary_result = r;</div><div class='add'>+   ab-&gt;next = cl-&gt;cl_binary_ops;</div><div class='add'>+   cl-&gt;cl_binary_ops = ab;</div><div class='add'>+</div><div class='add'>+   if ((a != SLANG_ARRAY_TYPE)</div><div class='add'>+       &amp;&amp; (b != SLANG_ARRAY_TYPE))</div><div class='add'>+     {</div><div class='add'>+	if ((-1 == _SLarray_add_bin_op (a))</div><div class='add'>+	    || (-1 == _SLarray_add_bin_op (b)))</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_add_unary_op (unsigned char type,</div><div class='add'>+			  int (*f)(int,</div><div class='add'>+				   unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+				   VOID_STAR),</div><div class='add'>+			  int (*r)(int, unsigned char, unsigned char *))</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   if ((f == NULL) || (r == NULL))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "SLclass_add_unary_op");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_unary_op = f;</div><div class='add'>+   cl-&gt;cl_unary_op_result_type = r;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_add_app_unary_op (unsigned char type,</div><div class='add'>+			      int (*f)(int,</div><div class='add'>+				       unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+				       VOID_STAR),</div><div class='add'>+			      int (*r)(int, unsigned char, unsigned char *))</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   if ((f == NULL) || (r == NULL))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "SLclass_add_app_unary_op");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_app_unary_op = f;</div><div class='add'>+   cl-&gt;cl_app_unary_op_result_type = r;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_pop_function (SLang_Class_Type *cl, int (*f)(unsigned char, VOID_STAR))</div><div class='add'>+{</div><div class='add'>+   if (cl == NULL) return -1;</div><div class='add'>+   cl-&gt;cl_pop = f;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_push_function (SLang_Class_Type *cl, int (*f)(unsigned char, VOID_STAR))</div><div class='add'>+{</div><div class='add'>+   if (cl == NULL) return -1;</div><div class='add'>+   cl-&gt;cl_push = f;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_string_function (SLang_Class_Type *cl, char *(*f)(unsigned char, VOID_STAR))</div><div class='add'>+{</div><div class='add'>+   if (cl == NULL) return -1;</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_string = f;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_destroy_function (SLang_Class_Type *cl, void (*f)(unsigned char, VOID_STAR))</div><div class='add'>+{</div><div class='add'>+   if (cl == NULL) return -1;</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_destroy = f;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_sget_function (SLang_Class_Type *cl, int (*f)(unsigned char, char *))</div><div class='add'>+{</div><div class='add'>+   if (cl == NULL) return -1;</div><div class='add'>+   cl-&gt;cl_sget = f;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_sput_function (SLang_Class_Type *cl, int (*f)(unsigned char, char *))</div><div class='add'>+{</div><div class='add'>+   if (cl == NULL) return -1;</div><div class='add'>+   cl-&gt;cl_sput = f;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_aget_function (SLang_Class_Type *cl, int (*f)(unsigned char, unsigned int))</div><div class='add'>+{</div><div class='add'>+   if (cl == NULL) return -1;</div><div class='add'>+   cl-&gt;cl_aget = f;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_aput_function (SLang_Class_Type *cl, int (*f)(unsigned char, unsigned int))</div><div class='add'>+{</div><div class='add'>+   if (cl == NULL) return -1;</div><div class='add'>+   cl-&gt;cl_aput = f;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_set_anew_function (SLang_Class_Type *cl, int (*f)(unsigned char, unsigned int))</div><div class='add'>+{</div><div class='add'>+   if (cl == NULL) return -1;</div><div class='add'>+   cl-&gt;cl_anew = f;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Misc */</div><div class='add'>+void _SLclass_type_mismatch_error (unsigned char a, unsigned char b)</div><div class='add'>+{</div><div class='add'>+   SLang_verror (SL_TYPE_MISMATCH, "Expecting %s, found %s",</div><div class='add'>+		 SLclass_get_datatype_name (a),</div><div class='add'>+		 SLclass_get_datatype_name (b));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* */</div><div class='add'>+</div><div class='add'>+static int null_binary_fun (int op,</div><div class='add'>+			    unsigned char a, VOID_STAR ap, unsigned int na,</div><div class='add'>+			    unsigned char b, VOID_STAR bp, unsigned int nb,</div><div class='add'>+			    VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   int *ic;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   int c;</div><div class='add'>+</div><div class='add'>+   (void) ap; (void) bp;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_EQ:</div><div class='add'>+	c = (a == b);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_NE:</div><div class='add'>+	c = (a != b);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (na &gt; nb) nb = na;</div><div class='add'>+   ic = (int *) cp;</div><div class='add'>+   for (i = 0; i &lt; nb; i++)</div><div class='add'>+     ic[i] = c;</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *get_binary_op_string (int op)</div><div class='add'>+{</div><div class='add'>+   static char *ops[SLANG_MOD] =</div><div class='add'>+     {</div><div class='add'>+	"+", "=", "*", "/", "==", "!=", "&gt;", "&gt;=", "&lt;", "&lt;=", "^",</div><div class='add'>+	"or", "and", "&amp;", "|", "xor", "shl", "shr", "mod"</div><div class='add'>+     };</div><div class='add'>+</div><div class='add'>+   if ((op &gt; SLANG_MOD) || (op &lt;= 0))</div><div class='add'>+     return "??";</div><div class='add'>+   return ops[op - 1];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int (*_SLclass_get_binary_fun (int op,</div><div class='add'>+			       SLang_Class_Type *a_cl, SLang_Class_Type *b_cl,</div><div class='add'>+			       SLang_Class_Type **c_cl, int do_error))</div><div class='add'>+(int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ VOID_STAR)</div><div class='add'>+{</div><div class='add'>+   SL_OOBinary_Type *bt;</div><div class='add'>+   unsigned char a, b, c;</div><div class='add'>+</div><div class='add'>+   a = a_cl-&gt;cl_data_type;</div><div class='add'>+   b = b_cl-&gt;cl_data_type;</div><div class='add'>+</div><div class='add'>+   if ((a == SLANG_NULL_TYPE) || (b == SLANG_NULL_TYPE))</div><div class='add'>+     {</div><div class='add'>+	*c_cl = _SLclass_get_class (SLANG_INT_TYPE);</div><div class='add'>+	return null_binary_fun;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   bt = a_cl-&gt;cl_binary_ops;</div><div class='add'>+</div><div class='add'>+   while (bt != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (bt-&gt;data_type == b)</div><div class='add'>+	  {</div><div class='add'>+	     if (1 != (*bt-&gt;binary_result)(op, a, b, &amp;c))</div><div class='add'>+	       break;</div><div class='add'>+</div><div class='add'>+	     if (c == a) *c_cl = a_cl;</div><div class='add'>+	     else if (c == b) *c_cl = b_cl;</div><div class='add'>+	     else *c_cl = _SLclass_get_class (c);</div><div class='add'>+</div><div class='add'>+	     return bt-&gt;binary_function;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	bt = bt-&gt;next;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (do_error)</div><div class='add'>+     SLang_verror (SL_TYPE_MISMATCH, "%s %s %s is not possible",</div><div class='add'>+		   a_cl-&gt;cl_name, get_binary_op_string (op), b_cl-&gt;cl_name);</div><div class='add'>+</div><div class='add'>+   *c_cl = NULL;</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int (*_SLclass_get_unary_fun (int op,</div><div class='add'>+			      SLang_Class_Type *a_cl,</div><div class='add'>+			      SLang_Class_Type **b_cl,</div><div class='add'>+			      int utype))</div><div class='add'>+(int, unsigned char, VOID_STAR, unsigned int, VOID_STAR)</div><div class='add'>+{</div><div class='add'>+   int (*f)(int, unsigned char, VOID_STAR, unsigned int, VOID_STAR);</div><div class='add'>+   int (*r)(int, unsigned char, unsigned char *);</div><div class='add'>+   unsigned char a;</div><div class='add'>+   unsigned char b;</div><div class='add'>+</div><div class='add'>+   switch (utype)</div><div class='add'>+     {</div><div class='add'>+      case _SLANG_BC_UNARY:</div><div class='add'>+	f = a_cl-&gt;cl_unary_op;</div><div class='add'>+	r = a_cl-&gt;cl_unary_op_result_type;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BC_MATH_UNARY:</div><div class='add'>+	f = a_cl-&gt;cl_math_op;</div><div class='add'>+	r = a_cl-&gt;cl_math_op_result_type;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _SLANG_BC_APP_UNARY:</div><div class='add'>+	f = a_cl-&gt;cl_app_unary_op;</div><div class='add'>+	r = a_cl-&gt;cl_app_unary_op_result_type;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	f = NULL;</div><div class='add'>+	r = NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   a = a_cl-&gt;cl_data_type;</div><div class='add'>+   if ((f != NULL) &amp;&amp; (r != NULL) &amp;&amp; (1 == (*r) (op, a, &amp;b)))</div><div class='add'>+     {</div><div class='add'>+	if (a == b)</div><div class='add'>+	  *b_cl = a_cl;</div><div class='add'>+	else</div><div class='add'>+	  *b_cl = _SLclass_get_class (b);</div><div class='add'>+	return f;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_verror (SL_TYPE_MISMATCH, "undefined unary operation/function on %s",</div><div class='add'>+		 a_cl-&gt;cl_name);</div><div class='add'>+</div><div class='add'>+   *b_cl = NULL;</div><div class='add'>+</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+SLclass_typecast (unsigned char to_type, int is_implicit, int allow_array)</div><div class='add'>+{</div><div class='add'>+   unsigned char from_type;</div><div class='add'>+   SLang_Class_Type *cl_to, *cl_from;</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   VOID_STAR ap;</div><div class='add'>+   VOID_STAR bp;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop (&amp;obj))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   from_type = obj.data_type;</div><div class='add'>+   if (from_type == to_type)</div><div class='add'>+     {</div><div class='add'>+	SLang_push (&amp;obj);</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   cl_from = _SLclass_get_class (from_type);</div><div class='add'>+   </div><div class='add'>+   /* Since the typecast functions are designed to work on arrays, </div><div class='add'>+    * get the pointer to the value instead of just &amp;obj.v.</div><div class='add'>+    */</div><div class='add'>+   ap = _SLclass_get_ptr_to_value (cl_from, &amp;obj);</div><div class='add'>+</div><div class='add'>+   if ((from_type == SLANG_ARRAY_TYPE)</div><div class='add'>+       &amp;&amp; (allow_array || (to_type != SLANG_ANY_TYPE)))</div><div class='add'>+     {</div><div class='add'>+	if (allow_array == 0)</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	cl_to = _SLclass_get_class (SLANG_ARRAY_TYPE);</div><div class='add'>+	bp = cl_to-&gt;cl_transfer_buf;</div><div class='add'>+	status = _SLarray_typecast (from_type, ap, 1, to_type, bp, is_implicit);</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	int (*t) (unsigned char, VOID_STAR, unsigned int, unsigned char, VOID_STAR);</div><div class='add'>+</div><div class='add'>+	if (NULL == (t = _SLclass_get_typecast (from_type, to_type, is_implicit)))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_object (&amp;obj);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	cl_to = _SLclass_get_class (to_type);</div><div class='add'>+	bp = cl_to-&gt;cl_transfer_buf;</div><div class='add'>+	status = (*t) (from_type, ap, 1, to_type, bp);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (1 == status)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == (*cl_to-&gt;cl_apush)(to_type, bp))</div><div class='add'>+	  {</div><div class='add'>+	     (*cl_to-&gt;cl_adestroy) (to_type, bp);</div><div class='add'>+	     SLang_free_object (&amp;obj);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* cl_apush will push a copy, so destry this one */</div><div class='add'>+	(*cl_to-&gt;cl_adestroy) (to_type, bp);</div><div class='add'>+	SLang_free_object (&amp;obj);</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+</div><div class='add'>+   SLang_verror (SL_TYPE_MISMATCH, "Unable to typecast %s to %s",</div><div class='add'>+		 cl_from-&gt;cl_name,</div><div class='add'>+		 SLclass_get_datatype_name (to_type));</div><div class='add'>+   SLang_free_object (&amp;obj);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int (*_SLclass_get_typecast (unsigned char from, unsigned char to, int is_implicit))</div><div class='add'>+(unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+ unsigned char, VOID_STAR)</div><div class='add'>+{</div><div class='add'>+   SL_Typecast_Type *t;</div><div class='add'>+   SLang_Class_Type *cl_from;</div><div class='add'>+</div><div class='add'>+   cl_from = _SLclass_get_class (from);</div><div class='add'>+</div><div class='add'>+   t = cl_from-&gt;cl_typecast_funs;</div><div class='add'>+   while (t != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (t-&gt;data_type != to)</div><div class='add'>+	  {</div><div class='add'>+	     t = t-&gt;next;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (is_implicit &amp;&amp; (t-&gt;allow_implicit == 0))</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	return t-&gt;typecast;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (to == SLANG_ANY_TYPE)</div><div class='add'>+     return _SLanytype_typecast;</div><div class='add'>+</div><div class='add'>+   if ((is_implicit == 0)</div><div class='add'>+       &amp;&amp; (cl_from-&gt;cl_void_typecast != NULL))</div><div class='add'>+     return cl_from-&gt;cl_void_typecast;</div><div class='add'>+</div><div class='add'>+   SLang_verror (SL_TYPE_MISMATCH, "Unable to typecast %s to %s",</div><div class='add'>+		 cl_from-&gt;cl_name,</div><div class='add'>+		 SLclass_get_datatype_name (to));</div><div class='add'>+</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int</div><div class='add'>+SLclass_add_typecast (unsigned char from, unsigned char to,</div><div class='add'>+		      int (*f)_PROTO((unsigned char, VOID_STAR, unsigned int,</div><div class='add'>+				      unsigned char, VOID_STAR)),</div><div class='add'>+		      int allow_implicit)</div><div class='add'>+{</div><div class='add'>+   SL_Typecast_Type *t;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (from);</div><div class='add'>+   if (to == SLANG_VOID_TYPE)</div><div class='add'>+     {</div><div class='add'>+	cl-&gt;cl_void_typecast = f;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   (void) _SLclass_get_class (to);</div><div class='add'>+</div><div class='add'>+   if (NULL == (t = (SL_Typecast_Type *) SLmalloc (sizeof (SL_Typecast_Type))))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   SLMEMSET((char *) t, 0, sizeof(SL_Typecast_Type));</div><div class='add'>+   t-&gt;data_type = to;</div><div class='add'>+   t-&gt;next = cl-&gt;cl_typecast_funs;</div><div class='add'>+   t-&gt;typecast = f;</div><div class='add'>+   t-&gt;allow_implicit = allow_implicit;</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_typecast_funs = t;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_MMT_Type *SLang_pop_mmt (unsigned char type) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_pop_ptr_obj (type, (VOID_STAR *) &amp;mmt))</div><div class='add'>+     mmt = NULL;</div><div class='add'>+   return mmt;</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (_SLang_pop_object_of_type (type, &amp;obj))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   if ((cl-&gt;cl_class_type == SLANG_CLASS_TYPE_MMT)</div><div class='add'>+       &amp;&amp; (obj.data_type == type))</div><div class='add'>+     {</div><div class='add'>+	return obj.v.ref;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   _SLclass_type_mismatch_error (type, obj.data_type);</div><div class='add'>+   SLang_free_object (&amp;obj);</div><div class='add'>+   return NULL;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int SLang_push_mmt (SLang_MMT_Type *ref) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   if (ref == NULL)</div><div class='add'>+     return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+   ref-&gt;count += 1;</div><div class='add'>+</div><div class='add'>+   if (0 == SLclass_push_ptr_obj (ref-&gt;data_type, (VOID_STAR) ref))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   ref-&gt;count -= 1;</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+void SLang_inc_mmt (SLang_MMT_Type *ref)</div><div class='add'>+{</div><div class='add'>+   if (ref != NULL)</div><div class='add'>+     ref-&gt;count += 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+VOID_STAR SLang_object_from_mmt (SLang_MMT_Type *ref)</div><div class='add'>+{</div><div class='add'>+   if (ref == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   return ref-&gt;user_data;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_MMT_Type *SLang_create_mmt (unsigned char t, VOID_STAR p)</div><div class='add'>+{</div><div class='add'>+   SLang_MMT_Type *ref;</div><div class='add'>+</div><div class='add'>+   (void) _SLclass_get_class (t);      /* check to see if it is registered */</div><div class='add'>+</div><div class='add'>+   if (NULL == (ref = (SLang_MMT_Type *) SLmalloc (sizeof (SLang_MMT_Type))))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   SLMEMSET ((char *) ref, 0, sizeof (SLang_MMT_Type));</div><div class='add'>+</div><div class='add'>+   ref-&gt;data_type = t;</div><div class='add'>+   ref-&gt;user_data = p;</div><div class='add'>+   /* FIXME!!  To be consistent with other types, the reference count should </div><div class='add'>+    * be set to 1 here.  However, doing so will require other code changes</div><div class='add'>+    * involving the use of MMTs.  For instance, SLang_free_mmt would have</div><div class='add'>+    * to be called after every push of the MMT.</div><div class='add'>+    */</div><div class='add'>+   return ref;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_free_mmt (SLang_MMT_Type *ref)</div><div class='add'>+{</div><div class='add'>+   unsigned char type;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (ref == NULL)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   /* This can be zero if SLang_create_mmt is called followed</div><div class='add'>+    * by this routine before anything gets a chance to attach itself</div><div class='add'>+    * to it.</div><div class='add'>+    */</div><div class='add'>+   if (ref-&gt;count &gt; 1)</div><div class='add'>+     {</div><div class='add'>+	ref-&gt;count -= 1;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   type = ref-&gt;data_type;</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   (*cl-&gt;cl_user_destroy_fun) (type, ref-&gt;user_data);</div><div class='add'>+   SLfree ((char *)ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_value (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   return (*cl-&gt;cl_apush)(type, v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_value (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   return (*cl-&gt;cl_apop)(type, v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_free_value (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   (*cl-&gt;cl_adestroy) (type, v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* These routines are very low-level and are designed for application data</div><div class='add'>+ * types to access the stack from their push/pop methods.  The int and</div><div class='add'>+ * pointer versions are in slang.c</div><div class='add'>+ */</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+int SLclass_push_double_obj (unsigned char type, double x)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   obj.data_type = type;</div><div class='add'>+   obj.v.double_val = x;</div><div class='add'>+   return SLang_push (&amp;obj);</div><div class='add'>+}</div><div class='add'>+int SLclass_push_float_obj (unsigned char type, float x)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   obj.data_type = type;</div><div class='add'>+   obj.v.float_val = x;</div><div class='add'>+   return SLang_push (&amp;obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLclass_push_long_obj (unsigned char type, long x)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   obj.data_type = type;</div><div class='add'>+   obj.v.long_val = x;</div><div class='add'>+   return SLang_push (&amp;obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_push_short_obj (unsigned char type, short x)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   obj.data_type = type;</div><div class='add'>+   obj.v.short_val = x;</div><div class='add'>+   return SLang_push (&amp;obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_push_char_obj (unsigned char type, char x)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   obj.data_type = type;</div><div class='add'>+   obj.v.char_val = x;</div><div class='add'>+   return SLang_push (&amp;obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+int SLclass_pop_double_obj (unsigned char type, double *x)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_object_of_type (type, &amp;obj, 0))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   *x = obj.v.double_val;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_pop_float_obj (unsigned char type, float *x)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_object_of_type (type, &amp;obj, 0))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   *x = obj.v.float_val;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLclass_pop_long_obj (unsigned char type, long *x)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_object_of_type (type, &amp;obj, 0))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   *x = obj.v.long_val;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_pop_int_obj (unsigned char type, int *x)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_object_of_type (type, &amp;obj, 0))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   *x = obj.v.int_val;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_pop_short_obj (unsigned char type, short *x)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_object_of_type (type, &amp;obj, 0))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   *x = obj.v.short_val;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_pop_char_obj (unsigned char type, char *x)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_object_of_type (type, &amp;obj, 0))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   *x = obj.v.char_val;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLclass_pop_ptr_obj (unsigned char type, VOID_STAR *s)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_object_of_type (type, &amp;obj, 0))</div><div class='add'>+     {</div><div class='add'>+	*s = (VOID_STAR) NULL;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   *s = obj.v.ptr_val;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slcmd.c b/mdk-stage1/slang/slcmd.c<br/>new file mode 100644<br/>index 000000000..4a00a90fc<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slcmd.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcmd.c</a></div><div class='hunk'>@@ -0,0 +1,351 @@</div><div class='add'>+/* cmd line facility for slang */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+# include &lt;math.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_STDLIB_H</div><div class='add'>+/* Oh dear.  Where is the prototype for atof?  If not in stdlib, then</div><div class='add'>+ * I do not know where.  Not in math.h onsome systems either.</div><div class='add'>+ */</div><div class='add'>+extern double atof ();</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLcmd_Cmd_Type *SLcmd_find_command (char *s, SLcmd_Cmd_Type *cmd)</div><div class='add'>+{</div><div class='add'>+   char *cmdstr;</div><div class='add'>+   char chs = *s++, ch;</div><div class='add'>+</div><div class='add'>+   while ((cmd-&gt;cmdfun != NULL)</div><div class='add'>+	  &amp;&amp; (NULL != (cmdstr = cmd-&gt;cmd))</div><div class='add'>+	  &amp;&amp; (0 != (ch = *cmdstr++)))</div><div class='add'>+     {</div><div class='add'>+	if ((ch == chs) &amp;&amp; !strcmp (s, cmdstr)) return cmd;</div><div class='add'>+	cmd++;</div><div class='add'>+     }</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int extract_token (char **strptr, char *buf)</div><div class='add'>+{</div><div class='add'>+   char *s, *b;</div><div class='add'>+   char ch, quote;</div><div class='add'>+</div><div class='add'>+   *buf = 0;</div><div class='add'>+</div><div class='add'>+   s = *strptr;</div><div class='add'>+   while (((ch = *s) != 0)</div><div class='add'>+	  &amp;&amp; ((ch == ' ') || (ch == '\t') || (ch == '\n')))</div><div class='add'>+     s++;</div><div class='add'>+</div><div class='add'>+   *strptr = s;</div><div class='add'>+</div><div class='add'>+   if (ch == 0) return 0;</div><div class='add'>+   if (ch == '%') return 0;</div><div class='add'>+</div><div class='add'>+   b = buf;</div><div class='add'>+</div><div class='add'>+   *b++ = ch;</div><div class='add'>+   s++;</div><div class='add'>+</div><div class='add'>+   if ((ch == '\'') || (ch == '"'))</div><div class='add'>+     {</div><div class='add'>+	quote = ch;</div><div class='add'>+	while ((ch = *s) != 0)</div><div class='add'>+	  {</div><div class='add'>+	     s++;</div><div class='add'>+	     *b++ = ch;</div><div class='add'>+	     if (ch == quote)</div><div class='add'>+	       break;</div><div class='add'>+</div><div class='add'>+	     if (ch == '\\')</div><div class='add'>+	       {</div><div class='add'>+		  if (0 == (ch = *s))</div><div class='add'>+		    break;</div><div class='add'>+		  *b++ = ch;</div><div class='add'>+		  s++;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	*strptr = s;</div><div class='add'>+	*b = 0;</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (((ch = *s) != 0)</div><div class='add'>+	  &amp;&amp; (ch != ' ')</div><div class='add'>+	  &amp;&amp; (ch != '\t')</div><div class='add'>+	  &amp;&amp; (ch != '\n')</div><div class='add'>+	  &amp;&amp; (ch != '%'))</div><div class='add'>+     *b++ = *s++;</div><div class='add'>+</div><div class='add'>+   *strptr = s;</div><div class='add'>+   *b = 0;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int allocate_arg_space (SLcmd_Cmd_Table_Type *table, int argc, unsigned int *space_ptr)</div><div class='add'>+{</div><div class='add'>+   unsigned int space = *space_ptr;</div><div class='add'>+   char *p;</div><div class='add'>+</div><div class='add'>+   if (argc + 1 &lt; (int) space)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   if (space &gt; 128)</div><div class='add'>+     {</div><div class='add'>+	if (space &gt; 1024) space += 1024;</div><div class='add'>+	else space += 128;</div><div class='add'>+     }</div><div class='add'>+   else space += 32;</div><div class='add'>+</div><div class='add'>+   if (NULL == (p = SLrealloc ((char *)table-&gt;string_args, space * sizeof (char *))))</div><div class='add'>+     return -1;</div><div class='add'>+   table-&gt;string_args = (char **)p;</div><div class='add'>+   table-&gt;string_args [argc] = NULL;</div><div class='add'>+</div><div class='add'>+   if (NULL == (p = SLrealloc ((char *)table-&gt;int_args, space * sizeof (int))))</div><div class='add'>+     return -1;</div><div class='add'>+   table-&gt;int_args = (int *)p;</div><div class='add'>+</div><div class='add'>+   if (NULL == (p = SLrealloc ((char *)table-&gt;double_args, space * sizeof (double))))</div><div class='add'>+     return -1;</div><div class='add'>+   table-&gt;double_args = (double *)p;</div><div class='add'>+</div><div class='add'>+   if (NULL == (p = SLrealloc ((char *)table-&gt;arg_type, space * sizeof (unsigned char))))</div><div class='add'>+     return -1;</div><div class='add'>+   table-&gt;arg_type = (unsigned char *)p;</div><div class='add'>+</div><div class='add'>+   *space_ptr = space;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcmd_execute_string (char *str, SLcmd_Cmd_Table_Type *table)</div><div class='add'>+{</div><div class='add'>+   char *s, *b = NULL, *arg_type, *last_str, *cmd_name;</div><div class='add'>+   SLcmd_Cmd_Type *cmd;</div><div class='add'>+   char *buf;</div><div class='add'>+   int token_present;</div><div class='add'>+   int i;</div><div class='add'>+   int status;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   int argc;</div><div class='add'>+   unsigned int space;</div><div class='add'>+</div><div class='add'>+   table-&gt;argc = 0;</div><div class='add'>+   table-&gt;string_args = NULL;</div><div class='add'>+   table-&gt;int_args = NULL;</div><div class='add'>+   table-&gt;double_args = NULL;</div><div class='add'>+   table-&gt;arg_type = NULL;</div><div class='add'>+</div><div class='add'>+   buf = SLmake_string (str);</div><div class='add'>+   if (buf == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   status = extract_token (&amp;str, buf);</div><div class='add'>+   if (status &lt;= 0)</div><div class='add'>+     {</div><div class='add'>+	SLfree (buf);</div><div class='add'>+	return status;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (((len = strlen (buf)) &gt;= 32)</div><div class='add'>+       || (NULL == (cmd = SLcmd_find_command (buf, table-&gt;table))))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_UNDEFINED_NAME,"%s: invalid command", buf);</div><div class='add'>+	SLfree (buf);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (cmd_name = SLmake_string (buf)))</div><div class='add'>+     {</div><div class='add'>+	SLfree (buf);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   space = 0;</div><div class='add'>+   argc = 0;</div><div class='add'>+   if (-1 == allocate_arg_space (table, argc, &amp;space))</div><div class='add'>+     {</div><div class='add'>+	SLfree (buf);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   table-&gt;arg_type[argc] = SLANG_STRING_TYPE;</div><div class='add'>+   table-&gt;string_args[argc++] = cmd_name;</div><div class='add'>+</div><div class='add'>+   arg_type = cmd-&gt;arg_type;</div><div class='add'>+   status = -1;</div><div class='add'>+   while (*arg_type)</div><div class='add'>+     {</div><div class='add'>+	int guess_type = 0;</div><div class='add'>+</div><div class='add'>+	last_str = str;</div><div class='add'>+</div><div class='add'>+	if (-1 == allocate_arg_space (table, argc, &amp;space))</div><div class='add'>+	  goto error;</div><div class='add'>+</div><div class='add'>+	if (-1 == (token_present = extract_token (&amp;str, buf)))</div><div class='add'>+	  goto error;</div><div class='add'>+</div><div class='add'>+	table-&gt;string_args[argc] = NULL;</div><div class='add'>+</div><div class='add'>+	if (token_present)</div><div class='add'>+	  {</div><div class='add'>+	     b = buf;</div><div class='add'>+	     len = strlen (b);</div><div class='add'>+</div><div class='add'>+	     if ((*b == '"') &amp;&amp; (len &gt; 1))</div><div class='add'>+	       {</div><div class='add'>+		  b++;</div><div class='add'>+		  len -= 2;</div><div class='add'>+		  b[len] = 0;</div><div class='add'>+		  guess_type = SLANG_STRING_TYPE;</div><div class='add'>+		  SLexpand_escaped_string (buf, b, b + len);</div><div class='add'>+		  len = strlen (buf);</div><div class='add'>+	       }</div><div class='add'>+	     else if ((*b == '\'') &amp;&amp; (len &gt; 1))</div><div class='add'>+	       {</div><div class='add'>+		  char ch;</div><div class='add'>+		  b++;</div><div class='add'>+		  len -= 2;</div><div class='add'>+		  b[len] = 0;</div><div class='add'>+		  guess_type = SLANG_INT_TYPE;</div><div class='add'>+		  ch = *b;</div><div class='add'>+		  if (ch == '\\')</div><div class='add'>+		    (void) _SLexpand_escaped_char (b, &amp;ch);</div><div class='add'>+		  sprintf (buf, "%d", (unsigned char) ch);</div><div class='add'>+		  len = strlen (buf);</div><div class='add'>+	       }</div><div class='add'>+	     else guess_type = SLang_guess_type (buf);</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	switch (*arg_type++)</div><div class='add'>+	  {</div><div class='add'>+	     /* variable argument number */</div><div class='add'>+	   case 'v':</div><div class='add'>+	     if (token_present == 0) break;</div><div class='add'>+	   case 'V':</div><div class='add'>+	     if (token_present == 0)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_verror (SL_INVALID_PARM, "%s: Expecting argument", cmd_name);</div><div class='add'>+		  goto error;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     while (*last_str == ' ') last_str++;</div><div class='add'>+	     len = strlen (last_str);</div><div class='add'>+	     str = last_str + len;</div><div class='add'>+</div><div class='add'>+	     s = SLmake_nstring (last_str, len);</div><div class='add'>+	     if (s == NULL) goto error;</div><div class='add'>+</div><div class='add'>+	     table-&gt;arg_type[argc] = SLANG_STRING_TYPE;</div><div class='add'>+	     table-&gt;string_args[argc++] = s;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 's':</div><div class='add'>+	     if (token_present == 0) break;</div><div class='add'>+	   case 'S':</div><div class='add'>+	     if (token_present == 0)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting string argument", cmd_name);</div><div class='add'>+		  goto error;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     s = SLmake_nstring (buf, len);</div><div class='add'>+	     if (s == NULL) goto error;</div><div class='add'>+	     table-&gt;arg_type[argc] = SLANG_STRING_TYPE;</div><div class='add'>+	     table-&gt;string_args[argc++] = s;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	     /* integer argument */</div><div class='add'>+	   case 'i':</div><div class='add'>+	     if (token_present == 0) break;</div><div class='add'>+	   case 'I':</div><div class='add'>+	     if ((token_present == 0) || (SLANG_INT_TYPE != guess_type))</div><div class='add'>+	       {</div><div class='add'>+		  SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting integer argument", cmd_name);</div><div class='add'>+		  goto error;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     table-&gt;arg_type[argc] = SLANG_INT_TYPE;</div><div class='add'>+	     table-&gt;int_args[argc++] = SLatoi((unsigned char *) buf);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	     /* floating point arg */</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	   case 'f':</div><div class='add'>+	     if (token_present == 0) break;</div><div class='add'>+	   case 'F':</div><div class='add'>+	     if ((token_present == 0) || (SLANG_STRING_TYPE == guess_type))</div><div class='add'>+	       {</div><div class='add'>+		  SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting double argument", cmd_name);</div><div class='add'>+		  goto error;</div><div class='add'>+	       }</div><div class='add'>+	     table-&gt;arg_type[argc] = SLANG_DOUBLE_TYPE;</div><div class='add'>+	     table-&gt;double_args[argc++] = atof(buf);</div><div class='add'>+	     break;</div><div class='add'>+#endif</div><div class='add'>+	     /* Generic type */</div><div class='add'>+	   case 'g':</div><div class='add'>+	     if (token_present == 0) break;</div><div class='add'>+	   case 'G':</div><div class='add'>+	     if (token_present == 0)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting argument", cmd_name);</div><div class='add'>+		  goto error;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     switch (guess_type)</div><div class='add'>+	       {</div><div class='add'>+		case SLANG_INT_TYPE:</div><div class='add'>+		  table-&gt;arg_type[argc] = SLANG_INT_TYPE;</div><div class='add'>+		  table-&gt;int_args[argc++] = SLatoi((unsigned char *) buf);</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case SLANG_STRING_TYPE:</div><div class='add'>+		  s = SLmake_nstring (buf, len);</div><div class='add'>+		  if (s == NULL) goto error;</div><div class='add'>+</div><div class='add'>+		  table-&gt;arg_type[argc] = SLANG_STRING_TYPE;</div><div class='add'>+		  table-&gt;string_args[argc++] = s;</div><div class='add'>+		  break;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+		case SLANG_DOUBLE_TYPE:</div><div class='add'>+		  table-&gt;arg_type[argc] = SLANG_DOUBLE_TYPE;</div><div class='add'>+		  table-&gt;double_args[argc++] = atof(buf);</div><div class='add'>+#endif</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /*                 call function */</div><div class='add'>+   status = (*cmd-&gt;cmdfun)(argc, table);</div><div class='add'>+</div><div class='add'>+   error:</div><div class='add'>+   if (table-&gt;string_args != NULL) for (i = 0; i &lt; argc; i++)</div><div class='add'>+     {</div><div class='add'>+	if (NULL != table-&gt;string_args[i])</div><div class='add'>+	  {</div><div class='add'>+	     SLfree (table-&gt;string_args[i]);</div><div class='add'>+	     table-&gt;string_args[i] = NULL;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   SLfree ((char *)table-&gt;string_args); table-&gt;string_args = NULL;</div><div class='add'>+   SLfree ((char *)table-&gt;double_args); table-&gt;double_args = NULL;</div><div class='add'>+   SLfree ((char *)table-&gt;int_args); table-&gt;int_args = NULL;</div><div class='add'>+   SLfree ((char *)table-&gt;arg_type); table-&gt;arg_type = NULL;</div><div class='add'>+</div><div class='add'>+   SLfree (buf);</div><div class='add'>+   return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slcmplex.c b/mdk-stage1/slang/slcmplex.c<br/>new file mode 100644<br/>index 000000000..b210dfc04<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slcmplex.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcmplex.c</a></div><div class='hunk'>@@ -0,0 +1,1142 @@</div><div class='add'>+/* Complex Data Type definition for S-Lang */</div><div class='add'>+/* Copyright (c) 1997, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* The rest of the file is enclosed in this #if */</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+# include &lt;math.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef PI</div><div class='add'>+# undef PI</div><div class='add'>+#endif</div><div class='add'>+#define PI 3.14159265358979323846</div><div class='add'>+</div><div class='add'>+int SLang_pop_complex (double *r, double *i)</div><div class='add'>+{</div><div class='add'>+   double *c;</div><div class='add'>+</div><div class='add'>+   switch (SLang_peek_at_stack ())</div><div class='add'>+     {</div><div class='add'>+      case SLANG_COMPLEX_TYPE:</div><div class='add'>+	if (-1 == SLclass_pop_ptr_obj (SLANG_COMPLEX_TYPE, (VOID_STAR *)&amp;c))</div><div class='add'>+	  return -1;</div><div class='add'>+	*r = c[0];</div><div class='add'>+	*i = c[1];</div><div class='add'>+	SLfree ((char *) c);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	*i = 0.0;</div><div class='add'>+	if (-1 == SLang_pop_double (r, NULL, NULL))</div><div class='add'>+	  return -1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case -1:</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_complex (double r, double i)</div><div class='add'>+{</div><div class='add'>+   double *c;</div><div class='add'>+</div><div class='add'>+   c = (double *) SLmalloc (2 * sizeof (double));</div><div class='add'>+   if (c == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   c[0] = r;</div><div class='add'>+   c[1] = i;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_push_ptr_obj (SLANG_COMPLEX_TYPE, (VOID_STAR) c))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) c);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_times (double *c, double *a, double *b)</div><div class='add'>+{</div><div class='add'>+   double a_real, b_real, a_imag, b_imag;</div><div class='add'>+</div><div class='add'>+   a_real = a[0];</div><div class='add'>+   b_real = b[0];</div><div class='add'>+   a_imag = a[1];</div><div class='add'>+   b_imag = b[1];</div><div class='add'>+</div><div class='add'>+   c[0] = a_real * b_real - a_imag * b_imag;</div><div class='add'>+   c[1] = a_imag * b_real + a_real * b_imag;</div><div class='add'>+</div><div class='add'>+   return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_divide (double *c, double *a, double *b)</div><div class='add'>+{</div><div class='add'>+   double a_real, b_real, a_imag, b_imag;</div><div class='add'>+   double ratio, invden;</div><div class='add'>+</div><div class='add'>+   a_real = a[0];</div><div class='add'>+   b_real = b[0];</div><div class='add'>+   a_imag = a[1];</div><div class='add'>+   b_imag = b[1];</div><div class='add'>+</div><div class='add'>+   /* Do it this way to avoid overflow in the denom */</div><div class='add'>+   if (fabs(b_real) &gt; fabs(b_imag))</div><div class='add'>+     {</div><div class='add'>+	ratio = b_imag / b_real;</div><div class='add'>+	invden = 1.0 / (b_real + b_imag * ratio);</div><div class='add'>+	c[0] = (a_real + ratio * a_imag) * invden;</div><div class='add'>+	c[1] = (a_imag - a_real * ratio) * invden;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	ratio = b_real / b_imag;</div><div class='add'>+	invden = 1.0 / (b_real * ratio + b_imag);</div><div class='add'>+	c[0] = (a_real * ratio + a_imag) * invden;</div><div class='add'>+	c[1] = (a_imag * ratio - a_real) * invden;</div><div class='add'>+     }</div><div class='add'>+   return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* a^b = exp (b log a); */</div><div class='add'>+double *SLcomplex_pow (double *c, double *a, double *b)</div><div class='add'>+{</div><div class='add'>+   return SLcomplex_exp (c, SLcomplex_times (c, b, SLcomplex_log (c, a)));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static double *complex_dpow (double *c, double *a, double b)</div><div class='add'>+{</div><div class='add'>+   SLcomplex_log (c, a);</div><div class='add'>+   c[0] *= b;</div><div class='add'>+   c[1] *= b;</div><div class='add'>+   return SLcomplex_exp (c, c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static double *dcomplex_pow (double *c, double a, double *b)</div><div class='add'>+{</div><div class='add'>+   a = log (a);</div><div class='add'>+   c[0] = a * b[0];</div><div class='add'>+   c[1] = a * b[1];</div><div class='add'>+   return SLcomplex_exp (c, c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double SLcomplex_abs (double *z)</div><div class='add'>+{</div><div class='add'>+   return SLmath_hypot (z[0], z[1]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* It appears that FORTRAN assumes that the branch cut for the log function</div><div class='add'>+ * is along the -x axis.  So, use this for atan2:</div><div class='add'>+ */</div><div class='add'>+static double my_atan2 (double y, double x)</div><div class='add'>+{</div><div class='add'>+   double val;</div><div class='add'>+</div><div class='add'>+   val = atan (y/x);</div><div class='add'>+</div><div class='add'>+   if (x &gt;= 0)</div><div class='add'>+     return val;		       /* I, IV */</div><div class='add'>+</div><div class='add'>+   if (y &lt;= 0)			       /* III */</div><div class='add'>+     return val - PI;</div><div class='add'>+</div><div class='add'>+   return PI + val;		       /* II */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void polar_form (double *r, double *theta, double *z)</div><div class='add'>+{</div><div class='add'>+   double x, y;</div><div class='add'>+</div><div class='add'>+   *r = SLcomplex_abs (z);</div><div class='add'>+</div><div class='add'>+   x = z[0];</div><div class='add'>+   y = z[1];</div><div class='add'>+</div><div class='add'>+   if (x == 0.0)</div><div class='add'>+     {</div><div class='add'>+	if (y &gt;= 0)</div><div class='add'>+	  *theta = 0.5 * PI;</div><div class='add'>+	else</div><div class='add'>+	  *theta = 1.5 * PI;</div><div class='add'>+     }</div><div class='add'>+   else *theta = my_atan2 (y, x);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_sin (double *sinz, double *z)</div><div class='add'>+{</div><div class='add'>+   double x, y;</div><div class='add'>+</div><div class='add'>+   x = z[0]; y = z[1];</div><div class='add'>+   sinz[0] = sin (x) * cosh (y);</div><div class='add'>+   sinz[1] = cos (x) * sinh (y);</div><div class='add'>+   return sinz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_cos (double *cosz, double *z)</div><div class='add'>+{</div><div class='add'>+   double x, y;</div><div class='add'>+</div><div class='add'>+   x = z[0]; y = z[1];</div><div class='add'>+   cosz[0] = cos (x) * cosh (y);</div><div class='add'>+   cosz[1] = -sin (x) * sinh (y);</div><div class='add'>+   return cosz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_exp (double *expz, double *z)</div><div class='add'>+{</div><div class='add'>+   double r, i;</div><div class='add'>+</div><div class='add'>+   r = exp (z[0]);</div><div class='add'>+   i = z[1];</div><div class='add'>+   expz[0] = r * cos (i);</div><div class='add'>+   expz[1] = r * sin (i);</div><div class='add'>+   return expz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_log (double *logz, double *z)</div><div class='add'>+{</div><div class='add'>+   double r, theta;</div><div class='add'>+</div><div class='add'>+   polar_form (&amp;r, &amp;theta, z);	       /* log R.e^(ix) = log R + ix */</div><div class='add'>+   logz[0] = log(r);</div><div class='add'>+   logz[1] = theta;</div><div class='add'>+   return logz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_log10 (double *log10z, double *z)</div><div class='add'>+{</div><div class='add'>+   double l10 = log (10.0);</div><div class='add'>+   (void) SLcomplex_log (log10z, z);</div><div class='add'>+   log10z[0] = log10z[0] / l10;</div><div class='add'>+   log10z[1] = log10z[1] / l10;</div><div class='add'>+   return log10z;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_sqrt (double *sqrtz, double *z)</div><div class='add'>+{</div><div class='add'>+   double r, x, y;</div><div class='add'>+</div><div class='add'>+   x = z[0];</div><div class='add'>+   y = z[1];</div><div class='add'>+</div><div class='add'>+   r = SLmath_hypot (x, y);</div><div class='add'>+</div><div class='add'>+   if (r == 0.0)</div><div class='add'>+     {</div><div class='add'>+	sqrtz [0] = sqrtz [1] = 0.0;</div><div class='add'>+	return sqrtz;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (x &gt;= 0.0)</div><div class='add'>+     {</div><div class='add'>+	x = sqrt (0.5 * (r + x));</div><div class='add'>+	y = 0.5 * y / x;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	r = sqrt (0.5 * (r - x));</div><div class='add'>+	x = 0.5 * y / r;</div><div class='add'>+	y = r;</div><div class='add'>+</div><div class='add'>+	if (x &lt; 0.0)</div><div class='add'>+	  {</div><div class='add'>+	     x = -x;</div><div class='add'>+	     y = -y;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   sqrtz[0] = x;</div><div class='add'>+   sqrtz[1] = y;</div><div class='add'>+</div><div class='add'>+   return sqrtz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_tan (double *tanz, double *z)</div><div class='add'>+{</div><div class='add'>+   double x, y, invden;</div><div class='add'>+</div><div class='add'>+   x = 2 * z[0];</div><div class='add'>+   y = 2 * z[1];</div><div class='add'>+   invden = 1.0 / (cos (x) + cosh (y));</div><div class='add'>+   tanz[0] = invden * sin (x);</div><div class='add'>+   tanz[1] = invden * sinh (y);</div><div class='add'>+   return tanz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Utility Function */</div><div class='add'>+static void compute_alpha_beta (double *z, double *alpha, double *beta)</div><div class='add'>+{</div><div class='add'>+   double x, y, a, b;</div><div class='add'>+</div><div class='add'>+   x = z[0];</div><div class='add'>+   y = z[1];</div><div class='add'>+   a = 0.5 * SLmath_hypot (x + 1, y);</div><div class='add'>+   b = 0.5 * SLmath_hypot (x - 1, y);</div><div class='add'>+</div><div class='add'>+   *alpha = a + b;</div><div class='add'>+   *beta = a - b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_asin (double *asinz, double *z)</div><div class='add'>+{</div><div class='add'>+   double alpha, beta;</div><div class='add'>+</div><div class='add'>+   compute_alpha_beta (z, &amp;alpha, &amp;beta);</div><div class='add'>+   asinz[0] = asin (beta);</div><div class='add'>+   asinz[1] = log (alpha + sqrt (alpha * alpha - 1));</div><div class='add'>+   return asinz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_acos (double *acosz, double *z)</div><div class='add'>+{</div><div class='add'>+   double alpha, beta;</div><div class='add'>+</div><div class='add'>+   compute_alpha_beta (z, &amp;alpha, &amp;beta);</div><div class='add'>+   acosz[0] = acos (beta);</div><div class='add'>+   acosz[1] = -log (alpha + sqrt (alpha * alpha - 1));</div><div class='add'>+   return acosz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_atan (double *atanz, double *z)</div><div class='add'>+{</div><div class='add'>+   double x, y;</div><div class='add'>+   double z1[2], z2[2];</div><div class='add'>+</div><div class='add'>+   x = z[0]; y = z[1];</div><div class='add'>+   z1[0] = x;</div><div class='add'>+   z1[1] = 1 + y;</div><div class='add'>+   z2[0] = -x;</div><div class='add'>+   z2[1] = 1 - y;</div><div class='add'>+</div><div class='add'>+   SLcomplex_log (z1, SLcomplex_divide (z2, z1, z2));</div><div class='add'>+   atanz[0] = -0.5 * z1[1];</div><div class='add'>+   atanz[1] = 0.5 * z1[0];</div><div class='add'>+</div><div class='add'>+   return atanz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_sinh (double *sinhz, double *z)</div><div class='add'>+{</div><div class='add'>+   double x, y;</div><div class='add'>+   x = z[0]; y = z[1];</div><div class='add'>+   sinhz[0] = sinh (x) * cos (y);</div><div class='add'>+   sinhz[1] = cosh (x) * sin (y);</div><div class='add'>+   return sinhz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_cosh (double *coshz, double *z)</div><div class='add'>+{</div><div class='add'>+   double x, y;</div><div class='add'>+   x = z[0]; y = z[1];</div><div class='add'>+   coshz[0] = cosh (x) * cos (y);</div><div class='add'>+   coshz[1] = sinh (x) * sin (y);</div><div class='add'>+   return coshz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+double *SLcomplex_tanh (double *tanhz, double *z)</div><div class='add'>+{</div><div class='add'>+   double x, y, invden;</div><div class='add'>+   x = 2 * z[0];</div><div class='add'>+   y = 2 * z[1];</div><div class='add'>+   invden = 1.0 / (cosh (x) + cos (y));</div><div class='add'>+   tanhz[0] = invden * sinh (x);</div><div class='add'>+   tanhz[1] = invden * sin (y);</div><div class='add'>+   return tanhz;</div><div class='add'>+}</div><div class='add'>+#if 0</div><div class='add'>+static double *not_implemented (char *fun, double *p)</div><div class='add'>+{</div><div class='add'>+   SLang_verror (SL_NOT_IMPLEMENTED, "%s for complex numbers has not been implemented",</div><div class='add'>+		 fun);</div><div class='add'>+   *p = -1.0;</div><div class='add'>+   return p;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+/* Use: asinh(z) = -i asin(iz) */</div><div class='add'>+double *SLcomplex_asinh (double *asinhz, double *z)</div><div class='add'>+{</div><div class='add'>+   double iz[2];</div><div class='add'>+   </div><div class='add'>+   iz[0] = -z[1];</div><div class='add'>+   iz[1] = z[0];</div><div class='add'>+   </div><div class='add'>+   (void) SLcomplex_asin (iz, iz);</div><div class='add'>+   asinhz[0] = iz[1];</div><div class='add'>+   asinhz[1] = -iz[0];</div><div class='add'>+   </div><div class='add'>+   return asinhz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Use: acosh (z) = i acos(z) */</div><div class='add'>+double *SLcomplex_acosh (double *acoshz, double *z)</div><div class='add'>+{</div><div class='add'>+   double iz[2];</div><div class='add'>+   </div><div class='add'>+   (void) SLcomplex_acos (iz, z);</div><div class='add'>+   acoshz[0] = -iz[1];</div><div class='add'>+   acoshz[1] = iz[0];</div><div class='add'>+</div><div class='add'>+   return acoshz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Use: atanh(z) = -i atan(iz) */</div><div class='add'>+double *SLcomplex_atanh (double *atanhz, double *z)</div><div class='add'>+{</div><div class='add'>+   double iz[2];</div><div class='add'>+   </div><div class='add'>+   iz[0] = -z[1];</div><div class='add'>+   iz[1] = z[0];</div><div class='add'>+   </div><div class='add'>+   (void) SLcomplex_atan (iz, iz);</div><div class='add'>+   atanhz[0] = iz[1];</div><div class='add'>+   atanhz[1] = -iz[0];</div><div class='add'>+   </div><div class='add'>+   return atanhz;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_binary_result (int op, unsigned char a, unsigned char b,</div><div class='add'>+				  unsigned char *c)</div><div class='add'>+{</div><div class='add'>+   (void) a; (void) b;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+      case SLANG_POW:</div><div class='add'>+      case SLANG_PLUS:</div><div class='add'>+      case SLANG_MINUS:</div><div class='add'>+      case SLANG_TIMES:</div><div class='add'>+      case SLANG_DIVIDE:</div><div class='add'>+	*c = SLANG_COMPLEX_TYPE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_EQ:</div><div class='add'>+      case SLANG_NE:</div><div class='add'>+	*c = SLANG_CHAR_TYPE;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_complex_binary (int op,</div><div class='add'>+				   unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+				   unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+				   VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   char *ic;</div><div class='add'>+   double *a, *b, *c;</div><div class='add'>+   unsigned int n, n_max;</div><div class='add'>+   unsigned int da, db;</div><div class='add'>+</div><div class='add'>+   (void) a_type;</div><div class='add'>+   (void) b_type;</div><div class='add'>+</div><div class='add'>+   a = (double *) ap;</div><div class='add'>+   b = (double *) bp;</div><div class='add'>+   c = (double *) cp;</div><div class='add'>+   ic = (char *) cp;</div><div class='add'>+</div><div class='add'>+   if (na == 1) da = 0; else da = 2;</div><div class='add'>+   if (nb == 1) db = 0; else db = 2;</div><div class='add'>+</div><div class='add'>+   if (na &gt; nb) n_max = na; else n_max = nb;</div><div class='add'>+   n_max = 2 * n_max;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLANG_PLUS:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = a[0] + b[0];</div><div class='add'>+	     c[n + 1] = a[1] + b[1];</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_MINUS:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = a[0] - b[0];</div><div class='add'>+	     c[n + 1] = a[1] - b[1];</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_TIMES:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     SLcomplex_times (c + n, a, b);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_DIVIDE:	       /* / */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     if ((b[0] == 0.0) &amp;&amp; (b[1] == 0.0))</div><div class='add'>+	       {</div><div class='add'>+		  SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		  return -1;</div><div class='add'>+	       }</div><div class='add'>+	     SLcomplex_divide (c + n, a, b);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_EQ: 		       /* == */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     ic[n/2] = ((a[0] == b[0]) &amp;&amp; (a[1] == b[1]));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_NE:		       /* != */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     ic[n/2] = ((a[0] != b[0]) || (a[1] != b[1]));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_POW:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     SLcomplex_pow (c + n, a, b);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_double_binary (int op,</div><div class='add'>+				  unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+				  unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+				  VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   char *ic;</div><div class='add'>+   double *a, *b, *c;</div><div class='add'>+   unsigned int n, n_max;</div><div class='add'>+   unsigned int da, db;</div><div class='add'>+</div><div class='add'>+   (void) a_type;</div><div class='add'>+   (void) b_type;</div><div class='add'>+</div><div class='add'>+   a = (double *) ap;</div><div class='add'>+   b = (double *) bp;</div><div class='add'>+   c = (double *) cp;</div><div class='add'>+   ic = (char *) cp;</div><div class='add'>+</div><div class='add'>+   if (na == 1) da = 0; else da = 2;</div><div class='add'>+   if (nb == 1) db = 0; else db = 1;</div><div class='add'>+</div><div class='add'>+   if (na &gt; nb) n_max = na; else n_max = nb;</div><div class='add'>+   n_max = 2 * n_max;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLANG_PLUS:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = a[0] + b[0];</div><div class='add'>+	     c[n + 1] = a[1];</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_MINUS:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = a[0] - b[0];</div><div class='add'>+	     c[n + 1] = a[1];</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_TIMES:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     double b0 = b[0];</div><div class='add'>+	     c[n] = a[0] * b0;</div><div class='add'>+	     c[n + 1] = a[1] * b0;</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_DIVIDE:	       /* / */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     double b0 = b[0];</div><div class='add'>+	     if (b0 == 0.0)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		  return -1;</div><div class='add'>+	       }</div><div class='add'>+	     c[n] = a[0] / b0;</div><div class='add'>+	     c[n + 1] = a[1] / b0;</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_EQ: 		       /* == */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     ic[n/2] = ((a[0] == b[0]) &amp;&amp; (a[1] == 0.0));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_NE:		       /* != */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     ic[n/2] = ((a[0] != b[0]) || (a[1] != 0.0));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_POW:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     complex_dpow (c + n, a, b[0]);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int double_complex_binary (int op,</div><div class='add'>+				  unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+				  unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+				  VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   char *ic;</div><div class='add'>+   double *a, *b, *c;</div><div class='add'>+   unsigned int n, n_max;</div><div class='add'>+   unsigned int da, db;</div><div class='add'>+</div><div class='add'>+   (void) a_type;</div><div class='add'>+   (void) b_type;</div><div class='add'>+</div><div class='add'>+   a = (double *) ap;</div><div class='add'>+   b = (double *) bp;</div><div class='add'>+   c = (double *) cp;</div><div class='add'>+   ic = (char *) cp;</div><div class='add'>+</div><div class='add'>+   if (na == 1) da = 0; else da = 1;</div><div class='add'>+   if (nb == 1) db = 0; else db = 2;</div><div class='add'>+</div><div class='add'>+   if (na &gt; nb) n_max = na; else n_max = nb;</div><div class='add'>+   n_max = 2 * n_max;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLANG_PLUS:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = a[0] + b[0];</div><div class='add'>+	     c[n + 1] = b[1];</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_MINUS:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = a[0] - b[0];</div><div class='add'>+	     c[n + 1] = -b[1];</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_TIMES:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     double a0 = a[0];</div><div class='add'>+	     c[n] = a0 * b[0];</div><div class='add'>+	     c[n + 1] = a0 * b[1];</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_DIVIDE:	       /* / */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     double z[2];</div><div class='add'>+	     if ((b[0] == 0.0) &amp;&amp; (b[1] == 0.0))</div><div class='add'>+	       {</div><div class='add'>+		  SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		  return -1;</div><div class='add'>+	       }</div><div class='add'>+	     z[0] = a[0];</div><div class='add'>+	     z[1] = 0.0;</div><div class='add'>+	     SLcomplex_divide (c + n, z, b);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_EQ: 		       /* == */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     ic[n/2] = ((a[0] == b[0]) &amp;&amp; (0.0 == b[1]));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_NE:		       /* != */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     ic[n/2] = ((a[0] != b[0]) || (0.0 != b[1]));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_POW:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     dcomplex_pow (c + n, a[0], b);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_generic_binary (int op,</div><div class='add'>+				   unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+				   unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+				   VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   char *ic;</div><div class='add'>+   char *b;</div><div class='add'>+   double *a, *c;</div><div class='add'>+   unsigned int n, n_max;</div><div class='add'>+   unsigned int da, db;</div><div class='add'>+   unsigned int sizeof_b;</div><div class='add'>+   SLang_To_Double_Fun_Type to_double;</div><div class='add'>+</div><div class='add'>+   if (NULL == (to_double = SLarith_get_to_double_fun (b_type, &amp;sizeof_b)))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   (void) a_type;</div><div class='add'>+</div><div class='add'>+   a = (double *) ap;</div><div class='add'>+   b = (char *) bp;</div><div class='add'>+   c = (double *) cp;</div><div class='add'>+   ic = (char *) cp;</div><div class='add'>+</div><div class='add'>+   if (na == 1) da = 0; else da = 2;</div><div class='add'>+   if (nb == 1) db = 0; else db = sizeof_b;</div><div class='add'>+</div><div class='add'>+   if (na &gt; nb) n_max = na; else n_max = nb;</div><div class='add'>+   n_max = 2 * n_max;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLANG_POW:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     complex_dpow (c + n, a, to_double((VOID_STAR)b));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_PLUS:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = a[0] + to_double((VOID_STAR)b);</div><div class='add'>+	     c[n + 1] = a[1];</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_MINUS:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = a[0] - to_double((VOID_STAR)b);</div><div class='add'>+	     c[n + 1] = a[1];</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_TIMES:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     double b0 = to_double((VOID_STAR)b);</div><div class='add'>+	     c[n] = a[0] * b0;</div><div class='add'>+	     c[n + 1] = a[1] * b0;</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_DIVIDE:	       /* / */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     double b0 = to_double((VOID_STAR)b);</div><div class='add'>+	     if (b0 == 0)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		  return -1;</div><div class='add'>+	       }</div><div class='add'>+	     c[n] = a[0] / b0;</div><div class='add'>+	     c[n + 1] = a[1] / b0;</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_EQ: 		       /* == */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     ic[n/2] = ((a[0] == to_double((VOID_STAR)b)) &amp;&amp; (a[1] == 0.0));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_NE:		       /* != */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     ic[n/2] = ((a[0] != to_double((VOID_STAR)b)) || (a[1] != 0.0));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int generic_complex_binary (int op,</div><div class='add'>+				   unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+				   unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+				   VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   double *b, *c;</div><div class='add'>+   char *a, *ic;</div><div class='add'>+   unsigned int n, n_max;</div><div class='add'>+   unsigned int da, db;</div><div class='add'>+   unsigned int sizeof_a;</div><div class='add'>+   SLang_To_Double_Fun_Type to_double;</div><div class='add'>+</div><div class='add'>+   if (NULL == (to_double = SLarith_get_to_double_fun (a_type, &amp;sizeof_a)))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   (void) b_type;</div><div class='add'>+</div><div class='add'>+   a = (char *) ap;</div><div class='add'>+   b = (double *) bp;</div><div class='add'>+   c = (double *) cp;</div><div class='add'>+   ic = (char *) cp;</div><div class='add'>+</div><div class='add'>+   if (na == 1) da = 0; else da = sizeof_a;</div><div class='add'>+   if (nb == 1) db = 0; else db = 2;</div><div class='add'>+</div><div class='add'>+   if (na &gt; nb) n_max = na; else n_max = nb;</div><div class='add'>+   n_max = 2 * n_max;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+      case SLANG_POW:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     dcomplex_pow (c + n, to_double((VOID_STAR)a), b);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_PLUS:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = to_double((VOID_STAR)a) + b[0];</div><div class='add'>+	     c[n + 1] = b[1];</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_MINUS:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     c[n] = to_double((VOID_STAR)a) - b[0];</div><div class='add'>+	     c[n + 1] = -b[1];</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_TIMES:</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     double a0 = to_double((VOID_STAR)a);</div><div class='add'>+	     c[n] = a0 * b[0];</div><div class='add'>+	     c[n + 1] = a0 * b[1];</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_DIVIDE:	       /* / */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     double z[2];</div><div class='add'>+	     if ((b[0] == 0.0) &amp;&amp; (b[1] == 0.0))</div><div class='add'>+	       {</div><div class='add'>+		  SLang_Error = SL_DIVIDE_ERROR;</div><div class='add'>+		  return -1;</div><div class='add'>+	       }</div><div class='add'>+	     z[0] = to_double((VOID_STAR)a);</div><div class='add'>+	     z[1] = 0.0;</div><div class='add'>+	     SLcomplex_divide (c + n, z, b);</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_EQ: 		       /* == */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     ic[n/2] = ((to_double((VOID_STAR)a) == b[0]) &amp;&amp; (0.0 == b[1]));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_NE:		       /* != */</div><div class='add'>+	for (n = 0; n &lt; n_max; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     ic[n/2] = ((to_double((VOID_STAR)a) != b[0]) || (0.0 != b[1]));</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_unary_result (int op, unsigned char a, unsigned char *b)</div><div class='add'>+{</div><div class='add'>+   (void) a;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLANG_PLUSPLUS:</div><div class='add'>+      case SLANG_MINUSMINUS:</div><div class='add'>+      case SLANG_CHS:</div><div class='add'>+      case SLANG_MUL2:</div><div class='add'>+	*b = SLANG_COMPLEX_TYPE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_SQR:		       /* |Real|^2 + |Imag|^2 ==&gt; double */</div><div class='add'>+      case SLANG_ABS:		       /* |z| ==&gt; double */</div><div class='add'>+	*b = SLANG_DOUBLE_TYPE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_SIGN:</div><div class='add'>+	*b = SLANG_INT_TYPE;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_unary (int op,</div><div class='add'>+			  unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+			  VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   unsigned int n;</div><div class='add'>+   double *a, *b;</div><div class='add'>+   int *ic;</div><div class='add'>+</div><div class='add'>+   (void) a_type;</div><div class='add'>+</div><div class='add'>+   a = (double *) ap;</div><div class='add'>+   b = (double *) bp;</div><div class='add'>+   ic = (int *) bp;</div><div class='add'>+</div><div class='add'>+   na = 2 * na;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLANG_PLUSPLUS:</div><div class='add'>+	for (n = 0; n &lt; na; n += 2) b[n] = (a[n] + 1);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_MINUSMINUS:</div><div class='add'>+	for (n = 0; n &lt; na; n += 2) b[n] = (a[n] - 1);</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_CHS:</div><div class='add'>+	for (n = 0; n &lt; na; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     b[n] = -(a[n]);</div><div class='add'>+	     b[n + 1] = -(a[n + 1]);</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_SQR:		       /* |Real|^2 + |Imag|^2 ==&gt; double */</div><div class='add'>+	for (n = 0; n &lt; na; n += 2)</div><div class='add'>+	  b[n/2] = (a[n] * a[n] + a[n + 1] * a[n + 1]);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_MUL2:</div><div class='add'>+	for (n = 0; n &lt; na; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     b[n] = (2 * a[n]);</div><div class='add'>+	     b[n + 1] = (2 * a[n + 1]);</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_ABS:		       /* |z| ==&gt; double */</div><div class='add'>+	for (n = 0; n &lt; na; n += 2)</div><div class='add'>+	  b[n/2] = SLcomplex_abs (a + n);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_SIGN:</div><div class='add'>+	/* Another creative extension.  Lets return an integer which indicates</div><div class='add'>+	 * whether the complex number is in the upperhalf plane or not.</div><div class='add'>+	 */</div><div class='add'>+	for (n = 0; n &lt; na; n += 2)</div><div class='add'>+	  {</div><div class='add'>+	     if (a[n + 1] &lt; 0.0) ic[n/2] = -1;</div><div class='add'>+	     else if (a[n + 1] &gt; 0.0) ic[n/2] = 1;</div><div class='add'>+	     else ic[n/2] = 0;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+complex_typecast (unsigned char from_type, VOID_STAR from, unsigned int num,</div><div class='add'>+		  unsigned char to_type, VOID_STAR to)</div><div class='add'>+{</div><div class='add'>+   double *z;</div><div class='add'>+   double *d;</div><div class='add'>+   char *i;</div><div class='add'>+   unsigned int n;</div><div class='add'>+   unsigned int sizeof_i;</div><div class='add'>+   SLang_To_Double_Fun_Type to_double;</div><div class='add'>+</div><div class='add'>+   (void) to_type;</div><div class='add'>+</div><div class='add'>+   z = (double *) to;</div><div class='add'>+</div><div class='add'>+   switch (from_type)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	if (NULL == (to_double = SLarith_get_to_double_fun (from_type, &amp;sizeof_i)))</div><div class='add'>+	  return 0;</div><div class='add'>+	i = (char *) from;</div><div class='add'>+	for (n = 0; n &lt; num; n++)</div><div class='add'>+	  {</div><div class='add'>+	     *z++ = to_double ((VOID_STAR) i);</div><div class='add'>+	     *z++ = 0.0;</div><div class='add'>+</div><div class='add'>+	     i += sizeof_i;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_DOUBLE_TYPE:</div><div class='add'>+	d = (double *) from;</div><div class='add'>+	for (n = 0; n &lt; num; n++)</div><div class='add'>+	  {</div><div class='add'>+	     *z++ = d[n];</div><div class='add'>+	     *z++ = 0.0;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void complex_destroy (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   SLfree ((char *)*(double **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_push (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   double *z;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   z = *(double **) ptr;</div><div class='add'>+   return SLang_push_complex (z[0], z[1]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_pop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   double *z;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   z = *(double **) ptr;</div><div class='add'>+   return SLang_pop_complex (&amp;z[0], &amp;z[1]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLinit_slcomplex (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   unsigned char *types;</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("Complex_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   (void) SLclass_set_destroy_function (cl, complex_destroy);</div><div class='add'>+   (void) SLclass_set_push_function (cl, complex_push);</div><div class='add'>+   (void) SLclass_set_pop_function (cl, complex_pop);</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_COMPLEX_TYPE, 2 * sizeof (double),</div><div class='add'>+				     SLANG_CLASS_TYPE_VECTOR))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   types = _SLarith_Arith_Types;</div><div class='add'>+   while (*types != SLANG_DOUBLE_TYPE)</div><div class='add'>+     {</div><div class='add'>+	unsigned char t = *types++;</div><div class='add'>+</div><div class='add'>+	if ((-1 == SLclass_add_binary_op (t, SLANG_COMPLEX_TYPE, generic_complex_binary, complex_binary_result))</div><div class='add'>+	    || (-1 == SLclass_add_binary_op (SLANG_COMPLEX_TYPE, t, complex_generic_binary, complex_binary_result))</div><div class='add'>+	    || (-1 == (SLclass_add_typecast (t, SLANG_COMPLEX_TYPE, complex_typecast, 1))))</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((-1 == (SLclass_add_binary_op (SLANG_COMPLEX_TYPE, SLANG_COMPLEX_TYPE, complex_complex_binary, complex_binary_result)))</div><div class='add'>+       || (-1 == (SLclass_add_binary_op (SLANG_COMPLEX_TYPE, SLANG_DOUBLE_TYPE, complex_double_binary, complex_binary_result)))</div><div class='add'>+       || (-1 == (SLclass_add_binary_op (SLANG_DOUBLE_TYPE, SLANG_COMPLEX_TYPE, double_complex_binary, complex_binary_result)))</div><div class='add'>+       || (-1 == (SLclass_add_unary_op (SLANG_COMPLEX_TYPE, complex_unary, complex_unary_result)))</div><div class='add'>+       || (-1 == (SLclass_add_typecast (SLANG_DOUBLE_TYPE, SLANG_COMPLEX_TYPE, complex_typecast, 1))))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif				       /* if SLANG_HAS_COMPLEX */</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slcompat.c b/mdk-stage1/slang/slcompat.c<br/>new file mode 100644<br/>index 000000000..5aa122483<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slcompat.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcompat.c</a></div><div class='hunk'>@@ -0,0 +1,34 @@</div><div class='add'>+/* These functions are provided for backward compatibility and are obsolete.</div><div class='add'>+ * Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* Compatibility */</div><div class='add'>+int SLang_init_slunix (void)</div><div class='add'>+{</div><div class='add'>+   if ((-1 == SLang_init_posix_dir ())</div><div class='add'>+       || (-1 == SLang_init_posix_process ())</div><div class='add'>+       || (-1 == SLdefine_for_ifdef ("__SLUNIX__")))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_init_slfile (void)</div><div class='add'>+{</div><div class='add'>+   if ((-1 == SLang_init_stdio ())</div><div class='add'>+       || (-1 == SLang_init_posix_dir ())</div><div class='add'>+       || (-1 == SLdefine_for_ifdef("__SLFILE__")))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slcurses.c b/mdk-stage1/slang/slcurses.c<br/>new file mode 100644<br/>index 000000000..f1212afc8<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slcurses.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcurses.c</a></div><div class='hunk'>@@ -0,0 +1,972 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+#include "slcurses.h"</div><div class='add'>+</div><div class='add'>+/* This file is meant to implement a primitive curses implementation in</div><div class='add'>+ * terms of SLsmg calls.  The fact is that the interfaces are sufficiently</div><div class='add'>+ * different that a 100% emulation is not possible.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+SLcurses_Window_Type *SLcurses_Stdscr;</div><div class='add'>+int SLcurses_Esc_Delay = 150;	       /* 0.15 seconds */</div><div class='add'>+SLtt_Char_Type SLcurses_Acs_Map [128];</div><div class='add'>+int SLcurses_Is_Endwin = 1;</div><div class='add'>+int SLcurses_Num_Colors = 8;</div><div class='add'>+</div><div class='add'>+static void blank_line (SLsmg_Char_Type *b, unsigned int len, SLsmg_Char_Type color)</div><div class='add'>+{</div><div class='add'>+   SLsmg_Char_Type *bmax;</div><div class='add'>+</div><div class='add'>+   bmax = b + len;</div><div class='add'>+   color = SLSMG_BUILD_CHAR(' ', color);</div><div class='add'>+</div><div class='add'>+   while (b &lt; bmax) *b++ = color;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int va_mvprintw (SLcurses_Window_Type *w, int r, int c, int do_move,</div><div class='add'>+			char *fmt, va_list ap)</div><div class='add'>+{</div><div class='add'>+   char buf[1024];</div><div class='add'>+</div><div class='add'>+   if (do_move) SLcurses_wmove (w, r, c);</div><div class='add'>+</div><div class='add'>+   (void) _SLvsnprintf (buf, sizeof(buf), fmt, ap);</div><div class='add'>+</div><div class='add'>+   SLcurses_waddnstr (w, buf, -1);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_mvprintw (int r, int c, char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+   va_list ap;</div><div class='add'>+</div><div class='add'>+   va_start(ap, fmt);</div><div class='add'>+   va_mvprintw (SLcurses_Stdscr, r, c, 1, fmt, ap);</div><div class='add'>+   va_end(ap);</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_mvwprintw (SLcurses_Window_Type *w, int r, int c, char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+   va_list ap;</div><div class='add'>+</div><div class='add'>+   va_start(ap, fmt);</div><div class='add'>+   va_mvprintw (w, r, c, 1, fmt, ap);</div><div class='add'>+   va_end(ap);</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wprintw (SLcurses_Window_Type *w, char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+   va_list ap;</div><div class='add'>+</div><div class='add'>+   va_start(ap, fmt);</div><div class='add'>+   va_mvprintw (w, 0, 0, 0, fmt, ap);</div><div class='add'>+   va_end(ap);</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_printw (char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+   va_list ap;</div><div class='add'>+</div><div class='add'>+   va_start(ap, fmt);</div><div class='add'>+   va_mvprintw (SLcurses_Stdscr, 0, 0, 0, fmt, ap);</div><div class='add'>+   va_end(ap);</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_nil (void)</div><div class='add'>+{</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_has_colors(void)</div><div class='add'>+{</div><div class='add'>+   return SLtt_Use_Ansi_Colors;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_nodelay (SLcurses_Window_Type *w, int onoff)</div><div class='add'>+{</div><div class='add'>+   w-&gt;delay_off = (onoff ? 0 : -1);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wgetch (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+   if (w == NULL)</div><div class='add'>+     return ERR;</div><div class='add'>+</div><div class='add'>+   SLcurses_wrefresh (w);</div><div class='add'>+</div><div class='add'>+   if ((w-&gt;delay_off == -1) ||</div><div class='add'>+       SLang_input_pending (w-&gt;delay_off))</div><div class='add'>+     {</div><div class='add'>+	if (w-&gt;use_keypad)</div><div class='add'>+	  {</div><div class='add'>+	     int ch = SLang_getkey ();</div><div class='add'>+	     if (ch == '\033')</div><div class='add'>+	       {</div><div class='add'>+		  if (0 == SLang_input_pending (ESCDELAY / 100))</div><div class='add'>+		    return ch;</div><div class='add'>+	       }</div><div class='add'>+	     else if (ch == 0xFFFF) return ERR;</div><div class='add'>+	     SLang_ungetkey (ch);</div><div class='add'>+	     return SLkp_getkey ();</div><div class='add'>+	  }</div><div class='add'>+	return SLang_getkey ();</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return ERR;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_getch (void)</div><div class='add'>+{</div><div class='add'>+   return SLcurses_wgetch (SLcurses_Stdscr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is a super hack.  That fact is that SLsmg and curses</div><div class='add'>+ * are incompatible.</div><div class='add'>+ */</div><div class='add'>+static unsigned char Color_Objects[256];</div><div class='add'>+</div><div class='add'>+static unsigned int map_attr_to_object (SLtt_Char_Type attr)</div><div class='add'>+{</div><div class='add'>+   unsigned int obj;</div><div class='add'>+   SLtt_Char_Type at;</div><div class='add'>+</div><div class='add'>+   obj = (attr &gt;&gt; 8) &amp; 0xFF;</div><div class='add'>+</div><div class='add'>+   if (SLtt_Use_Ansi_Colors)</div><div class='add'>+     {</div><div class='add'>+	if (Color_Objects[obj] != 0) return obj;</div><div class='add'>+</div><div class='add'>+	at = SLtt_get_color_object (obj &amp; 0xF);</div><div class='add'>+</div><div class='add'>+	if (attr &amp; A_BOLD) at |= SLTT_BOLD_MASK;</div><div class='add'>+	if (attr &amp; A_UNDERLINE) at |= SLTT_ULINE_MASK;</div><div class='add'>+	if (attr &amp; A_REVERSE) at |= SLTT_REV_MASK;</div><div class='add'>+</div><div class='add'>+	SLtt_set_color_object (obj, at);</div><div class='add'>+</div><div class='add'>+	Color_Objects[obj] = 1;</div><div class='add'>+     }</div><div class='add'>+   else obj = obj &amp; 0xF0;</div><div class='add'>+</div><div class='add'>+   return obj;</div><div class='add'>+</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_start_color (void)</div><div class='add'>+{</div><div class='add'>+   int f, b;</div><div class='add'>+   int obj;</div><div class='add'>+</div><div class='add'>+   if (SLtt_Use_Ansi_Colors == 0) return -1;</div><div class='add'>+</div><div class='add'>+   obj = 0;</div><div class='add'>+   for (f = 0; f &lt; 16; f++)</div><div class='add'>+     {</div><div class='add'>+	for (b = 0; b &lt; 16; b++)</div><div class='add'>+	  {</div><div class='add'>+	     obj++;</div><div class='add'>+	     SLtt_set_color_fgbg (obj, f, b);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef SIGINT</div><div class='add'>+static void sigint_handler (int sig)</div><div class='add'>+{</div><div class='add'>+   SLang_reset_tty ();</div><div class='add'>+   SLsmg_reset_smg ();</div><div class='add'>+   exit (sig);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Values are assumed to be 0, 1, 2.  This fact is exploited */</div><div class='add'>+static int TTY_State;</div><div class='add'>+</div><div class='add'>+static int init_tty (int suspend_ok)</div><div class='add'>+{</div><div class='add'>+   if (-1 == SLang_init_tty (-1, 1, 0))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+   if (suspend_ok) SLtty_set_suspend_state (1);</div><div class='add'>+#endif</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_raw (void)</div><div class='add'>+{</div><div class='add'>+   TTY_State = 1;</div><div class='add'>+   return init_tty (0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_cbreak (void)</div><div class='add'>+{</div><div class='add'>+   TTY_State = 2;</div><div class='add'>+   return init_tty (1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if defined(SIGTSTP) &amp;&amp; defined(SIGSTOP)</div><div class='add'>+static void sigtstp_handler (int sig)</div><div class='add'>+{</div><div class='add'>+   sig = errno;</div><div class='add'>+</div><div class='add'>+   SLsmg_suspend_smg ();</div><div class='add'>+</div><div class='add'>+   if (TTY_State)</div><div class='add'>+     SLang_reset_tty ();</div><div class='add'>+</div><div class='add'>+   kill(getpid(),SIGSTOP);</div><div class='add'>+</div><div class='add'>+   SLsmg_resume_smg ();</div><div class='add'>+</div><div class='add'>+   if (TTY_State) init_tty (TTY_State - 1);</div><div class='add'>+</div><div class='add'>+   signal (SIGTSTP, sigtstp_handler);</div><div class='add'>+   errno = sig;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+SLcurses_Window_Type *SLcurses_initscr (void)</div><div class='add'>+{</div><div class='add'>+   SLcurses_Is_Endwin = 0;</div><div class='add'>+   SLsmg_Newline_Behavior = SLSMG_NEWLINE_MOVES;</div><div class='add'>+   SLtt_get_terminfo ();</div><div class='add'>+</div><div class='add'>+#if !defined(IBMPC_SYSTEM) &amp;&amp; !defined(VMS)</div><div class='add'>+   if (-1 == (SLcurses_Num_Colors = SLtt_tgetnum ("Co")))</div><div class='add'>+#endif</div><div class='add'>+     SLcurses_Num_Colors = 8;</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLkp_init ())</div><div class='add'>+       || (-1 == SLcurses_cbreak ())</div><div class='add'>+       || (NULL == (SLcurses_Stdscr = SLcurses_newwin (0, 0, 0, 0)))</div><div class='add'>+       || (-1 == SLsmg_init_smg ()))</div><div class='add'>+     {</div><div class='add'>+	SLang_doerror (NULL);</div><div class='add'>+	SLang_exit_error ("SLcurses_initscr: init failed\n");</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#ifdef SIGINT</div><div class='add'>+   signal (SIGINT, sigint_handler);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(SIGTSTP) &amp;&amp; defined(SIGSTOP)</div><div class='add'>+   signal (SIGTSTP, sigtstp_handler);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   SLtt_set_mono (A_BOLD &gt;&gt; 8, NULL, SLTT_BOLD_MASK);</div><div class='add'>+   SLtt_set_mono (A_UNDERLINE &gt;&gt; 8, NULL, SLTT_ULINE_MASK);</div><div class='add'>+   SLtt_set_mono (A_REVERSE &gt;&gt; 8, NULL, SLTT_REV_MASK);</div><div class='add'>+   /* SLtt_set_mono (A_BLINK &gt;&gt; 8, NULL, SLTT_BLINK_MASK); */</div><div class='add'>+   SLtt_set_mono ((A_BOLD|A_UNDERLINE) &gt;&gt; 8, NULL, SLTT_ULINE_MASK|SLTT_BOLD_MASK);</div><div class='add'>+   SLtt_set_mono ((A_REVERSE|A_UNDERLINE) &gt;&gt; 8, NULL, SLTT_ULINE_MASK|SLTT_REV_MASK);</div><div class='add'>+</div><div class='add'>+   if (SLtt_Has_Alt_Charset)</div><div class='add'>+     {</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_ULCORN_CHAR] = SLSMG_ULCORN_CHAR | A_ALTCHARSET;</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_URCORN_CHAR] = SLSMG_URCORN_CHAR | A_ALTCHARSET;</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_LLCORN_CHAR] = SLSMG_LLCORN_CHAR | A_ALTCHARSET;</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_LRCORN_CHAR] = SLSMG_LRCORN_CHAR | A_ALTCHARSET;</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_UTEE_CHAR] = SLSMG_UTEE_CHAR | A_ALTCHARSET;</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_DTEE_CHAR] = SLSMG_DTEE_CHAR | A_ALTCHARSET;</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_LTEE_CHAR] = SLSMG_LTEE_CHAR | A_ALTCHARSET;</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_RTEE_CHAR] = SLSMG_RTEE_CHAR | A_ALTCHARSET;</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_VLINE_CHAR] = SLSMG_VLINE_CHAR | A_ALTCHARSET;</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_HLINE_CHAR] = SLSMG_HLINE_CHAR | A_ALTCHARSET;</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_PLUS_CHAR] = SLSMG_PLUS_CHAR | A_ALTCHARSET;</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_CKBRD_CHAR] = SLSMG_CKBRD_CHAR | A_ALTCHARSET;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+       /* ugly defaults to use on terminals which don't support graphics */</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_ULCORN_CHAR] = '+';</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_URCORN_CHAR] = '+';</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_LLCORN_CHAR] = '+';</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_LRCORN_CHAR] = '+';</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_UTEE_CHAR] = '+';</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_DTEE_CHAR] = '+';</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_LTEE_CHAR] = '+';</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_RTEE_CHAR] = '+';</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_VLINE_CHAR] = '|';</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_HLINE_CHAR] = '-';</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_PLUS_CHAR] = '+';</div><div class='add'>+       SLcurses_Acs_Map[SLSMG_CKBRD_CHAR] = '#';</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return SLcurses_Stdscr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wattrset (SLcurses_Window_Type *w, SLtt_Char_Type ch)</div><div class='add'>+{</div><div class='add'>+   unsigned int obj;</div><div class='add'>+</div><div class='add'>+   obj = map_attr_to_object (ch);</div><div class='add'>+   w-&gt;color = obj;</div><div class='add'>+   w-&gt;attr = ch;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wattroff (SLcurses_Window_Type *w, SLtt_Char_Type ch)</div><div class='add'>+{</div><div class='add'>+   if (SLtt_Use_Ansi_Colors)</div><div class='add'>+     return SLcurses_wattrset (w, 0);</div><div class='add'>+</div><div class='add'>+   w-&gt;attr &amp;= ~ch;</div><div class='add'>+   return SLcurses_wattrset (w, w-&gt;attr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wattron (SLcurses_Window_Type *w, SLtt_Char_Type ch)</div><div class='add'>+{</div><div class='add'>+   if (SLtt_Use_Ansi_Colors)</div><div class='add'>+     return SLcurses_wattrset (w, ch);</div><div class='add'>+</div><div class='add'>+   w-&gt;attr |= ch;</div><div class='add'>+   return SLcurses_wattrset (w, w-&gt;attr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_delwin (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+   if (w == NULL) return 0;</div><div class='add'>+   if (w-&gt;lines != NULL)</div><div class='add'>+     {</div><div class='add'>+	SLsmg_Char_Type **lines = w-&gt;lines;</div><div class='add'>+	if (w-&gt;is_subwin == 0)</div><div class='add'>+	  {</div><div class='add'>+	     unsigned int r, rmax;</div><div class='add'>+</div><div class='add'>+	     rmax = w-&gt;nrows;</div><div class='add'>+	     for (r = 0; r &lt; rmax; r++)</div><div class='add'>+	       {</div><div class='add'>+		  SLfree ((char *)lines[r]);</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	SLfree ((char *)lines);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLfree ((char *)w);</div><div class='add'>+   if (w == SLcurses_Stdscr)</div><div class='add'>+     SLcurses_Stdscr = NULL;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLcurses_Window_Type *SLcurses_newwin (unsigned int nrows, unsigned int ncols,</div><div class='add'>+				       unsigned int r, unsigned int c)</div><div class='add'>+{</div><div class='add'>+   SLcurses_Window_Type *win;</div><div class='add'>+   SLsmg_Char_Type **lines;</div><div class='add'>+</div><div class='add'>+   if (r &gt;= (unsigned int) SLtt_Screen_Rows)</div><div class='add'>+     return NULL;</div><div class='add'>+   if (c &gt;= (unsigned int) SLtt_Screen_Cols)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   if (NULL == (win = (SLcurses_Window_Type *) SLmalloc (sizeof (SLcurses_Window_Type))))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   SLMEMSET ((char *) win, 0, sizeof (SLcurses_Window_Type));</div><div class='add'>+</div><div class='add'>+   if (nrows == 0)</div><div class='add'>+     nrows = (unsigned int) SLtt_Screen_Rows - r;</div><div class='add'>+   if (ncols == 0)</div><div class='add'>+     ncols = (unsigned int) SLtt_Screen_Cols - c;</div><div class='add'>+</div><div class='add'>+   lines = (SLsmg_Char_Type **) SLmalloc (nrows * sizeof (SLsmg_Char_Type *));</div><div class='add'>+   if (lines == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLcurses_delwin (win);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLMEMSET ((char *) lines, 0, nrows * sizeof (SLsmg_Char_Type *));</div><div class='add'>+</div><div class='add'>+   win-&gt;lines = lines;</div><div class='add'>+   win-&gt;scroll_max = win-&gt;nrows = nrows;</div><div class='add'>+   win-&gt;ncols = ncols;</div><div class='add'>+   win-&gt;_begy = r;</div><div class='add'>+   win-&gt;_begx = c;</div><div class='add'>+   win-&gt;_maxx = (c + ncols) - 1;</div><div class='add'>+   win-&gt;_maxy = (r + nrows) - 1;</div><div class='add'>+   win-&gt;modified = 1;</div><div class='add'>+   win-&gt;delay_off = -1;</div><div class='add'>+</div><div class='add'>+   for (r = 0; r &lt; nrows; r++)</div><div class='add'>+     {</div><div class='add'>+	SLsmg_Char_Type *b;</div><div class='add'>+</div><div class='add'>+	b = (SLsmg_Char_Type *) SLmalloc (ncols * sizeof (SLsmg_Char_Type));</div><div class='add'>+	if (b == NULL)</div><div class='add'>+	  {</div><div class='add'>+	     SLcurses_delwin (win);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+	lines [r] = b;</div><div class='add'>+	blank_line (b, ncols, 0);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return win;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wmove (SLcurses_Window_Type *win, unsigned int r, unsigned int c)</div><div class='add'>+{</div><div class='add'>+   if (win == NULL) return -1;</div><div class='add'>+   win-&gt;_cury = r;</div><div class='add'>+   win-&gt;_curx = c;</div><div class='add'>+   win-&gt;modified = 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int do_newline (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+   w-&gt;_curx = 0;</div><div class='add'>+   w-&gt;_cury += 1;</div><div class='add'>+   if (w-&gt;_cury &gt;= w-&gt;scroll_max)</div><div class='add'>+     {</div><div class='add'>+	w-&gt;_cury = w-&gt;scroll_max - 1;</div><div class='add'>+	if (w-&gt;scroll_ok)</div><div class='add'>+	  SLcurses_wscrl (w, 1);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_waddch (SLcurses_Window_Type *win, SLtt_Char_Type attr)</div><div class='add'>+{</div><div class='add'>+   SLsmg_Char_Type *b, ch;</div><div class='add'>+   SLsmg_Char_Type color;</div><div class='add'>+</div><div class='add'>+   if (win == NULL) return -1;</div><div class='add'>+</div><div class='add'>+   if (win-&gt;_cury &gt;= win-&gt;nrows)</div><div class='add'>+     {</div><div class='add'>+	/* Curses seems to move current postion to top of window. */</div><div class='add'>+	win-&gt;_cury = win-&gt;_curx = 0;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   win-&gt;modified = 1;</div><div class='add'>+</div><div class='add'>+   ch = SLSMG_EXTRACT_CHAR(attr);</div><div class='add'>+</div><div class='add'>+   if (attr == ch)</div><div class='add'>+     color = win-&gt;color;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	/* hack to pick up the default color for graphics chars */</div><div class='add'>+	if (((attr &amp; A_COLOR) == 0) &amp;&amp; ((attr &amp; A_ALTCHARSET) != 0))</div><div class='add'>+	  {</div><div class='add'>+	     /* FIXME: priority=medium: Use SLSMG_?? instead of &lt;&lt; */</div><div class='add'>+	     attr |= win-&gt;color &lt;&lt; 8;</div><div class='add'>+	  }</div><div class='add'>+	color = map_attr_to_object (attr);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (ch &lt; ' ')</div><div class='add'>+     {</div><div class='add'>+	if (ch == '\n')</div><div class='add'>+	  {</div><div class='add'>+	     SLcurses_wclrtoeol (win);</div><div class='add'>+	     return do_newline (win);</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (ch == '\r')</div><div class='add'>+	  {</div><div class='add'>+	     win-&gt;_curx = 0;</div><div class='add'>+	     return 0;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (ch == '\b')</div><div class='add'>+	  {</div><div class='add'>+	     if (win-&gt;_curx &gt; 0)</div><div class='add'>+	       win-&gt;_curx--;</div><div class='add'>+</div><div class='add'>+	     return 0;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* HACK HACK!!!! */</div><div class='add'>+	if (ch == '\t') ch = ' ';</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (win-&gt;_curx &gt;= win-&gt;ncols)</div><div class='add'>+     do_newline (win);</div><div class='add'>+</div><div class='add'>+   b = win-&gt;lines[win-&gt;_cury] + win-&gt;_curx;</div><div class='add'>+   *b = SLSMG_BUILD_CHAR(ch,color);</div><div class='add'>+   win-&gt;_curx++;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wnoutrefresh (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+   unsigned int len;</div><div class='add'>+   unsigned int r, c;</div><div class='add'>+   unsigned int i, imax;</div><div class='add'>+</div><div class='add'>+   if (SLcurses_Is_Endwin)</div><div class='add'>+     {</div><div class='add'>+	if (TTY_State) init_tty (TTY_State - 1);</div><div class='add'>+       	SLsmg_resume_smg ();</div><div class='add'>+	SLcurses_Is_Endwin = 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (w == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLsmg_refresh ();</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (w-&gt;modified == 0)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   r = w-&gt;_begy;</div><div class='add'>+   c = w-&gt;_begx;</div><div class='add'>+</div><div class='add'>+   len = w-&gt;ncols;</div><div class='add'>+   imax = w-&gt;nrows;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; imax; i++)</div><div class='add'>+     {</div><div class='add'>+	SLsmg_gotorc (r, c);</div><div class='add'>+	SLsmg_write_color_chars (w-&gt;lines[i], len);</div><div class='add'>+	r++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (w-&gt;has_box)</div><div class='add'>+     SLsmg_draw_box(w-&gt;_begy, w-&gt;_begx, w-&gt;nrows, w-&gt;ncols);</div><div class='add'>+</div><div class='add'>+   SLsmg_gotorc (w-&gt;_begy + w-&gt;_cury, w-&gt;_begx + w-&gt;_curx);</div><div class='add'>+   w-&gt;modified = 0;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wrefresh (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+   if (w == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (w-&gt;modified == 0)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   SLcurses_wnoutrefresh (w);</div><div class='add'>+   SLsmg_refresh ();</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wclrtoeol (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+   SLsmg_Char_Type *b, *bmax;</div><div class='add'>+   SLsmg_Char_Type blank;</div><div class='add'>+</div><div class='add'>+   if (w == NULL) return -1;</div><div class='add'>+   if (w-&gt;_cury &gt;= w-&gt;nrows)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   w-&gt;modified = 1;</div><div class='add'>+</div><div class='add'>+   blank = SLSMG_BUILD_CHAR(' ',w-&gt;color);</div><div class='add'>+</div><div class='add'>+   b = w-&gt;lines[w-&gt;_cury];</div><div class='add'>+   bmax = b + w-&gt;ncols;</div><div class='add'>+   b += w-&gt;_curx;</div><div class='add'>+</div><div class='add'>+   while (b &lt; bmax) *b++ = blank;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wclrtobot (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+   SLsmg_Char_Type *b, *bmax;</div><div class='add'>+   SLsmg_Char_Type blank;</div><div class='add'>+   unsigned int r;</div><div class='add'>+</div><div class='add'>+   if (w == NULL) return -1;</div><div class='add'>+</div><div class='add'>+   w-&gt;modified = 1;</div><div class='add'>+   blank = SLSMG_BUILD_CHAR(' ',w-&gt;color);</div><div class='add'>+   SLcurses_wclrtoeol (w);</div><div class='add'>+   for (r = w-&gt;_cury + 1; r &lt; w-&gt;nrows; r++)</div><div class='add'>+     {</div><div class='add'>+	b = w-&gt;lines [r];</div><div class='add'>+	bmax = b + w-&gt;ncols;</div><div class='add'>+</div><div class='add'>+	while (b &lt; bmax) *b++ = blank;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wscrl (SLcurses_Window_Type *w, int n)</div><div class='add'>+{</div><div class='add'>+   SLsmg_Char_Type **lines;</div><div class='add'>+   unsigned int r, rmax, rmin, ncols;</div><div class='add'>+   SLsmg_Char_Type color;</div><div class='add'>+</div><div class='add'>+   if ((w == NULL) || (w-&gt;scroll_ok == 0))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   w-&gt;modified = 1;</div><div class='add'>+#if 0</div><div class='add'>+   if (w-&gt;is_subwin)</div><div class='add'>+     {</div><div class='add'>+	SLang_reset_tty ();</div><div class='add'>+	SLsmg_reset_smg ();</div><div class='add'>+	fprintf (stderr, "\rAttempt to scroll a subwindow\n");</div><div class='add'>+	exit (1);</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   color = w-&gt;color;</div><div class='add'>+   ncols = w-&gt;ncols;</div><div class='add'>+   lines = w-&gt;lines;</div><div class='add'>+   rmax = w-&gt;scroll_max;</div><div class='add'>+   rmin = w-&gt;scroll_min;</div><div class='add'>+   if (rmax &gt; w-&gt;nrows)</div><div class='add'>+     rmax = w-&gt;nrows;</div><div class='add'>+   if (rmin &gt;= rmax)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   while (n &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	for (r = rmin + 1; r &lt; rmax; r++)</div><div class='add'>+	  {</div><div class='add'>+	     /* lines[r - 1] = lines[r]; */</div><div class='add'>+	     memcpy ((char *)lines[r - 1], (char *)lines[r],</div><div class='add'>+		     sizeof (SLsmg_Char_Type) * ncols);</div><div class='add'>+	  }</div><div class='add'>+	blank_line (lines[rmax - 1], ncols, color);</div><div class='add'>+	n--;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   rmax--;</div><div class='add'>+   while (n &lt; 0)</div><div class='add'>+     {</div><div class='add'>+	for (r = rmax; r &gt; rmin; r--)</div><div class='add'>+	  {</div><div class='add'>+	     memcpy ((char *)lines[r], (char *)lines[r - 1],</div><div class='add'>+		     sizeof (SLsmg_Char_Type) * ncols);</div><div class='add'>+	  }</div><div class='add'>+	blank_line (lines[rmin], ncols, color);</div><div class='add'>+	n++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* wmove (w, w-&gt;nrows - 1, 0); */</div><div class='add'>+   /* wclrtobot (w); */</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note: if len is &lt; 0, entire string will be used.</div><div class='add'>+ */</div><div class='add'>+int SLcurses_waddnstr (SLcurses_Window_Type *w, char *str, int len)</div><div class='add'>+{</div><div class='add'>+   SLsmg_Char_Type *b;</div><div class='add'>+   SLsmg_Char_Type color;</div><div class='add'>+   unsigned char ch;</div><div class='add'>+   unsigned int nrows, ncols, crow, ccol;</div><div class='add'>+</div><div class='add'>+   if ((w == NULL)</div><div class='add'>+       || (str == NULL))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   w-&gt;modified = 1;</div><div class='add'>+   nrows = w-&gt;nrows;</div><div class='add'>+   ncols = w-&gt;ncols;</div><div class='add'>+   crow = w-&gt;_cury;</div><div class='add'>+   ccol = w-&gt;_curx;</div><div class='add'>+   color = w-&gt;color;</div><div class='add'>+</div><div class='add'>+   if (w-&gt;scroll_max &lt;= nrows)</div><div class='add'>+     nrows = w-&gt;scroll_max;</div><div class='add'>+</div><div class='add'>+   if (crow &gt;= nrows)</div><div class='add'>+     crow = 0;			       /* wrap back to top */</div><div class='add'>+</div><div class='add'>+   b = w-&gt;lines [crow] + ccol;</div><div class='add'>+</div><div class='add'>+   while (len &amp;&amp; ((ch = (unsigned char) *str++) != 0))</div><div class='add'>+     {</div><div class='add'>+	len--;</div><div class='add'>+</div><div class='add'>+	if (ch == '\n')</div><div class='add'>+	  {</div><div class='add'>+	     w-&gt;_cury = crow;</div><div class='add'>+	     w-&gt;_curx = ccol;</div><div class='add'>+	     SLcurses_wclrtoeol (w);</div><div class='add'>+	     do_newline (w);</div><div class='add'>+	     crow = w-&gt;_cury;</div><div class='add'>+	     ccol = w-&gt;_curx;</div><div class='add'>+	     b = w-&gt;lines[crow];</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (ccol &gt;= ncols)</div><div class='add'>+	  {</div><div class='add'>+	     ccol = 0;</div><div class='add'>+	     crow++;</div><div class='add'>+	     if (crow &gt;= nrows)</div><div class='add'>+	       {</div><div class='add'>+		  w-&gt;_curx = 0;</div><div class='add'>+		  w-&gt;_cury = crow;</div><div class='add'>+		  do_newline (w);</div><div class='add'>+		  crow = w-&gt;_cury;</div><div class='add'>+		  ccol = w-&gt;_curx;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     b = w-&gt;lines [crow];</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (ch == '\t')</div><div class='add'>+	  {</div><div class='add'>+	     unsigned int n = ccol;</div><div class='add'>+	     n += SLsmg_Tab_Width;</div><div class='add'>+	     n = SLsmg_Tab_Width - (n % SLsmg_Tab_Width);</div><div class='add'>+	     if (ccol + n &gt; ncols) n = ncols - len;</div><div class='add'>+	     ccol += n;</div><div class='add'>+	     while (n--)</div><div class='add'>+	       *b++ = SLSMG_BUILD_CHAR(' ',color);</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	*b++ = SLSMG_BUILD_CHAR(ch, color);</div><div class='add'>+	ccol++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   w-&gt;_curx = ccol;</div><div class='add'>+   w-&gt;_cury = crow;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This routine IS NOT CORRECT.  It needs to compute the proper overlap</div><div class='add'>+ * and copy accordingly.  Here, I just assume windows are same size.</div><div class='add'>+ */</div><div class='add'>+#if 0</div><div class='add'>+int SLcurses_overlay (SLcurses_Window_Type *swin, SLcurses_Window_Type *dwin)</div><div class='add'>+{</div><div class='add'>+   SLsmg_Char_Type *s, *smax, *d, *dmax;</div><div class='add'>+</div><div class='add'>+   if ((swin == NULL) || (dwin == NULL))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   s = swin-&gt;buf;</div><div class='add'>+   smax = swin-&gt;bufmax;</div><div class='add'>+   d = dwin-&gt;buf;</div><div class='add'>+   dmax = dwin-&gt;bufmax;</div><div class='add'>+</div><div class='add'>+   while ((s &lt; smax) &amp;&amp; (d &lt; dmax))</div><div class='add'>+     {</div><div class='add'>+	SLsmg_Char_Type ch = *s++;</div><div class='add'>+	if (SLSMG_EXTRACT_CHAR(ch) != ' ')</div><div class='add'>+	  *d = ch;</div><div class='add'>+	d++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return -1;			       /* not implemented */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+SLcurses_Window_Type *SLcurses_subwin (SLcurses_Window_Type *orig,</div><div class='add'>+				       unsigned int nlines, unsigned int ncols,</div><div class='add'>+				       unsigned int begin_y, unsigned int begin_x)</div><div class='add'>+{</div><div class='add'>+   SLcurses_Window_Type *sw;</div><div class='add'>+   int r, c;</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   if (orig == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   sw = (SLcurses_Window_Type *) SLmalloc (sizeof (SLcurses_Window_Type));</div><div class='add'>+   if (sw == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   SLMEMSET ((char *)sw, 0, sizeof (SLcurses_Window_Type));</div><div class='add'>+#if 1</div><div class='add'>+   r = begin_y - orig-&gt;_begy;</div><div class='add'>+#else</div><div class='add'>+   r = 1 + ((int)orig-&gt;nrows - (int)nlines) / 2;</div><div class='add'>+#endif</div><div class='add'>+   if (r &lt; 0) r = 0;</div><div class='add'>+   if (r + nlines &gt; orig-&gt;nrows) nlines = orig-&gt;nrows - r;</div><div class='add'>+</div><div class='add'>+   c = ((int)orig-&gt;ncols - (int)ncols) / 2;</div><div class='add'>+   if (c &lt; 0) c = 0;</div><div class='add'>+   if (c + ncols &gt; orig-&gt;ncols) ncols = orig-&gt;ncols - c;</div><div class='add'>+</div><div class='add'>+   sw-&gt;scroll_min = 0;</div><div class='add'>+   sw-&gt;scroll_max = sw-&gt;nrows = nlines;</div><div class='add'>+   sw-&gt;ncols = ncols;</div><div class='add'>+   sw-&gt;_begy = begin_y;</div><div class='add'>+   sw-&gt;_begx = begin_x;</div><div class='add'>+   sw-&gt;_maxx = (begin_x + ncols) - 1;</div><div class='add'>+   sw-&gt;_maxy = (begin_y + nlines) - 1;</div><div class='add'>+</div><div class='add'>+   sw-&gt;lines = (SLsmg_Char_Type **) SLmalloc (nlines * sizeof (SLsmg_Char_Type *));</div><div class='add'>+   if (sw-&gt;lines == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLcurses_delwin (sw);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; nlines; i++)</div><div class='add'>+     {</div><div class='add'>+	sw-&gt;lines [i] = orig-&gt;lines [r + i] + c;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   sw-&gt;is_subwin = 1;</div><div class='add'>+   return sw;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wclear (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   if (w != NULL) w-&gt;modified = 1;</div><div class='add'>+   for (i=0; i &lt; w-&gt;nrows; i++)</div><div class='add'>+     blank_line (w-&gt;lines[i], w-&gt;ncols, w-&gt;color);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wdelch (SLcurses_Window_Type *w)</div><div class='add'>+{</div><div class='add'>+   SLsmg_Char_Type *p, *p1, *pmax;</div><div class='add'>+</div><div class='add'>+   p = w-&gt;lines[w-&gt;_cury];</div><div class='add'>+   pmax = p + w-&gt;ncols;</div><div class='add'>+   p += w-&gt;_curx;</div><div class='add'>+   p1 = p + 1;</div><div class='add'>+</div><div class='add'>+   while (p1 &lt; pmax)</div><div class='add'>+     {</div><div class='add'>+	*p = *p1;</div><div class='add'>+	p = p1;</div><div class='add'>+	p1++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (p &lt; pmax)</div><div class='add'>+     *p = SLSMG_BUILD_CHAR(' ',w-&gt;color);</div><div class='add'>+</div><div class='add'>+   w-&gt;modified = 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_winsch (SLcurses_Window_Type *w, int ch)</div><div class='add'>+{</div><div class='add'>+   SLsmg_Char_Type *p, *p1, *pmax;</div><div class='add'>+</div><div class='add'>+   p = w-&gt;lines[w-&gt;_cury];</div><div class='add'>+   pmax = p + w-&gt;ncols;</div><div class='add'>+   p += w-&gt;_curx;</div><div class='add'>+   p1 = pmax - 1;</div><div class='add'>+</div><div class='add'>+   while (pmax &gt; p)</div><div class='add'>+     {</div><div class='add'>+	*pmax = *p1;</div><div class='add'>+	pmax = p1;</div><div class='add'>+	p1--;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (p &lt; pmax)</div><div class='add'>+     *p = SLSMG_BUILD_CHAR(ch, w-&gt;color);</div><div class='add'>+</div><div class='add'>+   w-&gt;modified = 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_endwin (void)</div><div class='add'>+{</div><div class='add'>+   SLcurses_Is_Endwin = 1;</div><div class='add'>+   SLsmg_suspend_smg ();</div><div class='add'>+   SLang_reset_tty ();</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+int SLcurses_mvwscanw (SLcurses_Window_Type *w, unsigned int r, unsigned int c,</div><div class='add'>+		       char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+#if HAVE_VFSCANF</div><div class='add'>+   int ret;</div><div class='add'>+   va_list ap;</div><div class='add'>+</div><div class='add'>+   SLcurses_wmove (w, r, c);</div><div class='add'>+   SLcurses_wrefresh (w);</div><div class='add'>+</div><div class='add'>+   va_start(ap, fmt);</div><div class='add'>+   ret = vfscanf (stdin, fmt, ap);</div><div class='add'>+   va_end(ap);</div><div class='add'>+   return ret;</div><div class='add'>+#else</div><div class='add'>+   return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_wscanw (SLcurses_Window_Type *w, char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+#if HAVE_VFSCANF</div><div class='add'>+  va_list ap;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   SLcurses_wrefresh (w);</div><div class='add'>+</div><div class='add'>+   va_start(ap, fmt);</div><div class='add'>+   ret = vfscanf (stdin, fmt, ap);</div><div class='add'>+   va_end(ap);</div><div class='add'>+</div><div class='add'>+   return ret;</div><div class='add'>+#else</div><div class='add'>+   return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLcurses_scanw (char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_VFSCANF</div><div class='add'>+   va_list ap;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   SLcurses_wrefresh (SLcurses_Stdscr);</div><div class='add'>+</div><div class='add'>+   va_start(ap, fmt);</div><div class='add'>+   ret = vfscanf (stdin, fmt, ap);</div><div class='add'>+   va_end(ap);</div><div class='add'>+</div><div class='add'>+   return ret;</div><div class='add'>+#else</div><div class='add'>+   return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLcurses_clearok (SLcurses_Window_Type *w, int bf)</div><div class='add'>+{</div><div class='add'>+   if (bf)</div><div class='add'>+     {</div><div class='add'>+	SLsmg_cls ();</div><div class='add'>+	w-&gt;modified = 1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slcurses.h b/mdk-stage1/slang/slcurses.h<br/>new file mode 100644<br/>index 000000000..fa082304f<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slcurses.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slcurses.h</a></div><div class='hunk'>@@ -0,0 +1,353 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef SLANG_VERSION</div><div class='add'>+# include &lt;slang.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* This is a temporary hack until lynx is fixed to not include this file. */</div><div class='add'>+#ifndef LYCURSES_H</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   unsigned int _begy, _begx, _maxy, _maxx;</div><div class='add'>+   unsigned int _curx, _cury;</div><div class='add'>+   unsigned int nrows, ncols;</div><div class='add'>+   unsigned int scroll_min, scroll_max;</div><div class='add'>+   SLsmg_Char_Type **lines;</div><div class='add'>+   SLsmg_Char_Type color;</div><div class='add'>+   int is_subwin;</div><div class='add'>+   SLtt_Char_Type attr;</div><div class='add'>+   int delay_off;</div><div class='add'>+   int scroll_ok;</div><div class='add'>+   int modified;</div><div class='add'>+   int has_box;</div><div class='add'>+   int use_keypad;</div><div class='add'>+}</div><div class='add'>+SLcurses_Window_Type;</div><div class='add'>+</div><div class='add'>+extern int SLcurses_wclrtobot (SLcurses_Window_Type *);</div><div class='add'>+extern int SLcurses_wscrl (SLcurses_Window_Type *, int);</div><div class='add'>+extern int SLcurses_wrefresh (SLcurses_Window_Type *);</div><div class='add'>+extern int SLcurses_delwin (SLcurses_Window_Type *);</div><div class='add'>+extern int SLcurses_wprintw (SLcurses_Window_Type *, char *, ...);</div><div class='add'>+extern SLcurses_Window_Type *SLcurses_newwin (unsigned int, unsigned int,</div><div class='add'>+					      unsigned int, unsigned int);</div><div class='add'>+</div><div class='add'>+extern SLcurses_Window_Type *SLcurses_subwin (SLcurses_Window_Type *,</div><div class='add'>+					      unsigned int, unsigned int,</div><div class='add'>+					      unsigned int, unsigned int);</div><div class='add'>+</div><div class='add'>+extern int SLcurses_wnoutrefresh (SLcurses_Window_Type *);</div><div class='add'>+extern int SLcurses_wclrtoeol (SLcurses_Window_Type *);</div><div class='add'>+</div><div class='add'>+extern int SLcurses_wmove (SLcurses_Window_Type *, unsigned int, unsigned int);</div><div class='add'>+extern int SLcurses_waddch (SLcurses_Window_Type *, SLtt_Char_Type);</div><div class='add'>+extern int SLcurses_waddnstr (SLcurses_Window_Type *, char *, int);</div><div class='add'>+</div><div class='add'>+#define waddnstr		SLcurses_waddnstr</div><div class='add'>+#define waddch			SLcurses_waddch</div><div class='add'>+#define waddstr(w,s)		waddnstr((w),(s),-1)</div><div class='add'>+#define addstr(x)		waddstr(stdscr, (x))</div><div class='add'>+#define addnstr(s,n)		waddnstr(stdscr,(s),(n))</div><div class='add'>+#define addch(ch)      		waddch(stdscr,(ch))</div><div class='add'>+</div><div class='add'>+#define mvwaddnstr(w,y,x,s,n) \</div><div class='add'>+  (-1 == wmove((w),(y),(x)) ? -1 : waddnstr((w),(s),(n)))</div><div class='add'>+#define mvwaddstr(w,y,x,s) \</div><div class='add'>+  (-1 == wmove((w),(y),(x)) ? -1 : waddnstr((w),(s), -1))</div><div class='add'>+#define mvaddnstr(y,x,s,n)	mvwaddnstr(stdscr,(y),(x),(s),(n))</div><div class='add'>+#define mvaddstr(y,x,s)       	mvwaddstr(stdscr,(y),(x),(s))</div><div class='add'>+#define mvwaddch(w,y,x,c) \</div><div class='add'>+  ((-1 == wmove((w),(y),(x))) ? -1 : waddch((w),(c)))</div><div class='add'>+#define mvaddch(y,x,c)         	mvwaddch(stdscr,(y),(x),(c))</div><div class='add'>+</div><div class='add'>+extern int SLcurses_wclear (SLcurses_Window_Type *w);</div><div class='add'>+extern int SLcurses_printw (char *, ...);</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+/* Why are these functions part of curses??? */</div><div class='add'>+extern int SLcurses_mvwscanw (SLcurses_Window_Type *, unsigned int, unsigned int,</div><div class='add'>+			      char *, ...);</div><div class='add'>+extern int SLcurses_wscanw (SLcurses_Window_Type *, char *, ...);</div><div class='add'>+extern int SLcurses_scanw (char *, ...);</div><div class='add'>+#define mvwscanw SLcurses_mvwscanw</div><div class='add'>+#define wscanw SLcurses_wscanw</div><div class='add'>+#define scanw SLcurses_scanw</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+extern SLcurses_Window_Type *SLcurses_Stdscr;</div><div class='add'>+#define WINDOW SLcurses_Window_Type</div><div class='add'>+#define stdscr SLcurses_Stdscr</div><div class='add'>+</div><div class='add'>+#define subwin		SLcurses_subwin</div><div class='add'>+#define wclrtobot	SLcurses_wclrtobot</div><div class='add'>+#define wscrl		SLcurses_wscrl</div><div class='add'>+#define scrl(n)		wscrl(stdscr,(n))</div><div class='add'>+#define scroll(w)	wscrl((w),1)</div><div class='add'>+#define wrefresh	SLcurses_wrefresh</div><div class='add'>+#define delwin		SLcurses_delwin</div><div class='add'>+#define wmove		SLcurses_wmove</div><div class='add'>+#define newwin		SLcurses_newwin</div><div class='add'>+#define wnoutrefresh	SLcurses_wnoutrefresh</div><div class='add'>+#define werase(w)	SLcurses_wmove((w),0,0); SLcurses_wclrtobot(w)</div><div class='add'>+#define wclear(w)	SLcurses_wmove((w),0,0); SLcurses_wclrtobot(w)</div><div class='add'>+#define wprintw		SLcurses_wprintw</div><div class='add'>+#define mvwprintw	SLcurses_mvwprintw</div><div class='add'>+</div><div class='add'>+#define winch(w) \</div><div class='add'>+    ((((w)-&gt;_cury &lt; (w)-&gt;nrows) &amp;&amp; ((w)-&gt;_curx &lt; (w)-&gt;ncols)) \</div><div class='add'>+       ? ((w)-&gt;lines[(w)-&gt;_cury][(w)-&gt;_curx]) : 0)</div><div class='add'>+</div><div class='add'>+#define inch() winch(stdscr)</div><div class='add'>+#define mvwinch(w,x,y) \</div><div class='add'>+    ((-1 != wmove((w),(x),(y))) ? winch(w) : (-1))</div><div class='add'>+#define doupdate SLsmg_refresh</div><div class='add'>+</div><div class='add'>+#define mvwin(w,a,b) ((w)-&gt;_begy = (a), (w)-&gt;_begx = (b))</div><div class='add'>+</div><div class='add'>+extern int SLcurses_mvprintw (int, int, char *, ...);</div><div class='add'>+extern int SLcurses_mvwprintw (SLcurses_Window_Type *, int, int, char *, ...);</div><div class='add'>+extern int SLcurses_has_colors(void);</div><div class='add'>+extern int SLcurses_nil (void);</div><div class='add'>+extern int SLcurses_wgetch (SLcurses_Window_Type *);</div><div class='add'>+extern int SLcurses_getch (void);</div><div class='add'>+</div><div class='add'>+extern int SLcurses_wattrset (SLcurses_Window_Type *, SLtt_Char_Type);</div><div class='add'>+extern int SLcurses_wattron (SLcurses_Window_Type *, SLtt_Char_Type);</div><div class='add'>+extern int SLcurses_wattroff (SLcurses_Window_Type *, SLtt_Char_Type);</div><div class='add'>+#define attrset(x) SLcurses_wattrset(stdscr, (x))</div><div class='add'>+#define attron(x) SLcurses_wattron(stdscr, (x))</div><div class='add'>+#define attroff(x) SLcurses_wattroff(stdscr, (x))</div><div class='add'>+#define wattrset(w, x) SLcurses_wattrset((w), (x))</div><div class='add'>+#define wattron(w, x) SLcurses_wattron((w), (x))</div><div class='add'>+#define wattroff(w, x) SLcurses_wattroff((w), (x))</div><div class='add'>+#define wattr_get(w) ((w)-&gt;color &lt;&lt; 8)</div><div class='add'>+#define attr_get() wattr_get(stdscr)</div><div class='add'>+</div><div class='add'>+#define COLOR_PAIR(x) ((x) &lt;&lt; 8)</div><div class='add'>+</div><div class='add'>+extern int SLcurses_start_color (void);</div><div class='add'>+#define start_color SLcurses_start_color</div><div class='add'>+</div><div class='add'>+#define ERR 0xFFFF</div><div class='add'>+#define wgetch SLcurses_wgetch</div><div class='add'>+#define getch SLcurses_getch</div><div class='add'>+</div><div class='add'>+extern int SLcurses_nodelay (SLcurses_Window_Type *, int);</div><div class='add'>+extern SLcurses_Window_Type *SLcurses_initscr (void);</div><div class='add'>+#define initscr SLcurses_initscr</div><div class='add'>+</div><div class='add'>+extern int SLcurses_cbreak (void);</div><div class='add'>+extern int SLcurses_raw (void);</div><div class='add'>+#define cbreak SLcurses_cbreak</div><div class='add'>+#define crmode SLcurses_cbreak</div><div class='add'>+#define raw SLcurses_raw</div><div class='add'>+#define noraw SLang_reset_tty</div><div class='add'>+#define nocbreak SLang_reset_tty</div><div class='add'>+</div><div class='add'>+#define mvprintw SLcurses_mvprintw</div><div class='add'>+#define has_colors SLcurses_has_colors</div><div class='add'>+#define nodelay SLcurses_nodelay</div><div class='add'>+</div><div class='add'>+#define ungetch SLang_ungetkey</div><div class='add'>+</div><div class='add'>+#define COLS SLtt_Screen_Cols</div><div class='add'>+#define LINES SLtt_Screen_Rows</div><div class='add'>+</div><div class='add'>+#define move(x,y) SLcurses_wmove(stdscr, (x), (y))</div><div class='add'>+#define wclrtoeol SLcurses_wclrtoeol</div><div class='add'>+#define clrtoeol() SLcurses_wclrtoeol(stdscr)</div><div class='add'>+#define clrtobot() SLcurses_wclrtobot(stdscr)</div><div class='add'>+</div><div class='add'>+#define printw SLcurses_printw</div><div class='add'>+#define mvprintw SLcurses_mvprintw</div><div class='add'>+#define wstandout(w) SLcurses_wattrset((w),A_STANDOUT)</div><div class='add'>+#define wstandend(w) SLcurses_wattrset((w),A_NORMAL)</div><div class='add'>+#define standout() SLcurses_wattrset(stdscr,A_STANDOUT)</div><div class='add'>+#define standend() SLcurses_wattrset(stdscr,A_NORMAL)</div><div class='add'>+</div><div class='add'>+#define refresh() SLcurses_wrefresh(stdscr)</div><div class='add'>+#define clear() SLcurses_wclear(stdscr)</div><div class='add'>+#define erase() werase(stdscr)</div><div class='add'>+#define touchline SLsmg_touch_lines</div><div class='add'>+#define resetterm SLang_reset_tty</div><div class='add'>+</div><div class='add'>+extern int SLcurses_endwin (void);</div><div class='add'>+#define endwin SLcurses_endwin</div><div class='add'>+extern int SLcurses_Is_Endwin;</div><div class='add'>+#define isendwin() SLcurses_Is_Endwin</div><div class='add'>+</div><div class='add'>+#define keypad(w,x) ((w)-&gt;use_keypad = (x))</div><div class='add'>+</div><div class='add'>+#define KEY_MIN		SL_KEY_UP</div><div class='add'>+#define KEY_DOWN	SL_KEY_DOWN</div><div class='add'>+#define KEY_UP		SL_KEY_UP</div><div class='add'>+#define KEY_LEFT	SL_KEY_LEFT</div><div class='add'>+#define KEY_RIGHT	SL_KEY_RIGHT</div><div class='add'>+#define KEY_A1		SL_KEY_A1</div><div class='add'>+#define KEY_B1		SL_KEY_B1</div><div class='add'>+#define KEY_C1		SL_KEY_C1</div><div class='add'>+#define KEY_A2		SL_KEY_A2</div><div class='add'>+#define KEY_B2		SL_KEY_B2</div><div class='add'>+#define KEY_C2		SL_KEY_C2</div><div class='add'>+#define KEY_A3		SL_KEY_A3</div><div class='add'>+#define KEY_B3		SL_KEY_B3</div><div class='add'>+#define KEY_C3		SL_KEY_C3</div><div class='add'>+#define KEY_REDO	SL_KEY_REDO</div><div class='add'>+#define KEY_UNDO	SL_KEY_UNDO</div><div class='add'>+#define KEY_BACKSPACE	SL_KEY_BACKSPACE</div><div class='add'>+#define KEY_PPAGE	SL_KEY_PPAGE</div><div class='add'>+#define KEY_NPAGE	SL_KEY_NPAGE</div><div class='add'>+#define KEY_HOME	SL_KEY_HOME</div><div class='add'>+#define KEY_END		SL_KEY_END</div><div class='add'>+#define KEY_F0		SL_KEY_F0</div><div class='add'>+#define KEY_F		SL_KEY_F</div><div class='add'>+#define KEY_ENTER	SL_KEY_ENTER</div><div class='add'>+#define KEY_MAX		0xFFFF</div><div class='add'>+</div><div class='add'>+/* Ugly Hacks that may not work */</div><div class='add'>+#define flushinp SLcurses_nil</div><div class='add'>+#define winsertln(w) \</div><div class='add'>+  ((w)-&gt;scroll_min=(w)-&gt;_cury, \</div><div class='add'>+   (w)-&gt;scroll_max=(w)-&gt;nrows, \</div><div class='add'>+   wscrl((w), -1))</div><div class='add'>+</div><div class='add'>+extern SLtt_Char_Type SLcurses_Acs_Map [128];</div><div class='add'>+#define acs_map SLcurses_Acs_Map</div><div class='add'>+</div><div class='add'>+#define ACS_ULCORNER (acs_map[SLSMG_ULCORN_CHAR])</div><div class='add'>+#define ACS_URCORNER (acs_map[SLSMG_URCORN_CHAR])</div><div class='add'>+#define ACS_LRCORNER (acs_map[SLSMG_LRCORN_CHAR])</div><div class='add'>+#define ACS_LLCORNER (acs_map[SLSMG_LLCORN_CHAR])</div><div class='add'>+#define ACS_TTEE (acs_map[SLSMG_UTEE_CHAR])</div><div class='add'>+#define ACS_LTEE (acs_map[SLSMG_LTEE_CHAR])</div><div class='add'>+#define ACS_RTEE (acs_map[SLSMG_RTEE_CHAR])</div><div class='add'>+#define ACS_BTEE (acs_map[SLSMG_DTEE_CHAR])</div><div class='add'>+#define ACS_PLUS (acs_map[SLSMG_PLUS_CHAR])</div><div class='add'>+#define ACS_VLINE (acs_map[SLSMG_VLINE_CHAR])</div><div class='add'>+#define ACS_HLINE (acs_map[SLSMG_HLINE_CHAR])</div><div class='add'>+#define ACS_S1		'-'</div><div class='add'>+#define ACS_S9		'-'</div><div class='add'>+#define ACS_DIAMOND		'&amp;'</div><div class='add'>+#define ACS_CKBOARD		(acs_map[SLSMG_CKBRD_CHAR])</div><div class='add'>+#define ACS_DEGREE		'o'</div><div class='add'>+#define ACS_PLMINUS		'+'</div><div class='add'>+#define ACS_BULLET		'*'</div><div class='add'>+#define ACS_LARROW		'&lt;'</div><div class='add'>+#define ACS_RARROW		'&gt;'</div><div class='add'>+#define ACS_DARROW		'v'</div><div class='add'>+#define ACS_UARROW		'^'</div><div class='add'>+#define ACS_BOARD		'#'</div><div class='add'>+#define ACS_LANTERN		'#'</div><div class='add'>+#define ACS_BLOCK		'#'</div><div class='add'>+</div><div class='add'>+#if 1</div><div class='add'>+#define hline(x,y) SLcurses_nil ()</div><div class='add'>+#define vline(x,y) SLcurses_nil ()</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define A_CHARTEXT	0x00FF</div><div class='add'>+#define A_NORMAL 0</div><div class='add'>+#define A_BOLD		0x1000</div><div class='add'>+#define A_REVERSE	0x2000</div><div class='add'>+#define A_STANDOUT	A_REVERSE</div><div class='add'>+#define A_UNDERLINE	0x4000</div><div class='add'>+#define A_BLINK		0</div><div class='add'>+#define A_COLOR		0x0700</div><div class='add'>+#define A_ALTCHARSET	0x8000</div><div class='add'>+#define A_DIM		0</div><div class='add'>+#define A_PROTECT	0</div><div class='add'>+#define A_INVIS		0</div><div class='add'>+</div><div class='add'>+#define COLOR_BLACK	SLSMG_COLOR_BLACK</div><div class='add'>+#define COLOR_RED	SLSMG_COLOR_RED</div><div class='add'>+#define COLOR_GREEN	SLSMG_COLOR_GREEN</div><div class='add'>+#define COLOR_YELLOW	SLSMG_COLOR_BROWN</div><div class='add'>+#define COLOR_BLUE	SLSMG_COLOR_BLUE</div><div class='add'>+#define COLOR_MAGENTA	SLSMG_COLOR_MAGENTA</div><div class='add'>+#define COLOR_CYAN	SLSMG_COLOR_CYAN</div><div class='add'>+#define COLOR_WHITE	SLSMG_COLOR_LGRAY</div><div class='add'>+</div><div class='add'>+extern int SLcurses_Num_Colors;</div><div class='add'>+#define COLORS		SLcurses_Num_Colors</div><div class='add'>+#define COLOR_PAIRS	(SLcurses_Num_Colors*SLcurses_Num_Colors)</div><div class='add'>+</div><div class='add'>+#define init_pair(_x,_f,_b) \</div><div class='add'>+ SLtt_set_color_object((_x), ((_f) == (_b) ? 0x0700 : ((_f) | ((_b) &lt;&lt; 8)) &lt;&lt; 8))</div><div class='add'>+</div><div class='add'>+#define scrollok(a,b) ((a)-&gt;scroll_ok = (b))</div><div class='add'>+#define getyx(a,y,x)  (y=(a)-&gt;_cury, x=(a)-&gt;_curx)</div><div class='add'>+#define getmaxyx(a,y,x)  (y=(a)-&gt;nrows, x=(a)-&gt;ncols)</div><div class='add'>+#define napms(x) usleep(1000 * (x))</div><div class='add'>+typedef SLtt_Char_Type chtype;</div><div class='add'>+#define beep SLtt_beep</div><div class='add'>+#define curs_set(x) SLtt_set_cursor_visibility(x)</div><div class='add'>+#define touchwin(x) SLsmg_touch_lines((x)-&gt;_begy, (x)-&gt;nrows)</div><div class='add'>+#define flash SLtt_beep</div><div class='add'>+</div><div class='add'>+#define wsetscrreg(w,a,b)	((w)-&gt;scroll_min = (a), (w)-&gt;scroll_max = (b))</div><div class='add'>+</div><div class='add'>+#define wtimeout(a,b) (a)-&gt;delay_off = ((b &gt;= 0) ? (b) / 100 : -1)</div><div class='add'>+#define timeout(a) wtimeout(stdscr, a)</div><div class='add'>+extern int SLcurses_wdelch (SLcurses_Window_Type *);</div><div class='add'>+#define wdelch SLcurses_wdelch</div><div class='add'>+#define delch() wdelch(stdscr)</div><div class='add'>+</div><div class='add'>+extern int SLcurses_winsch (SLcurses_Window_Type *, int);</div><div class='add'>+#define winsch SLcurses_winsch</div><div class='add'>+</div><div class='add'>+extern int SLcurses_Esc_Delay;/* ESC expire time in milliseconds (ncurses compatible) */</div><div class='add'>+#define ESCDELAY SLcurses_Esc_Delay</div><div class='add'>+</div><div class='add'>+extern int SLcurses_clearok (SLcurses_Window_Type *, int);</div><div class='add'>+#define clearok SLcurses_clearok</div><div class='add'>+</div><div class='add'>+/* Functions that have not been implemented. */</div><div class='add'>+#define copywin(w,v,a,b,c,d,e,f,g) SLcurses_nil()</div><div class='add'>+#define wdeleteln(win) SLcurses_nil()</div><div class='add'>+#define resetty SLcurses_nil</div><div class='add'>+#define savetty SLcurses_nil</div><div class='add'>+#define overlay(u,v) SLcurses_nil()</div><div class='add'>+</div><div class='add'>+/* These functions do nothing */</div><div class='add'>+#define savetty SLcurses_nil</div><div class='add'>+#define nonl    SLcurses_nil</div><div class='add'>+#define echo SLcurses_nil</div><div class='add'>+#define noecho SLcurses_nil</div><div class='add'>+#define saveterm SLcurses_nil</div><div class='add'>+#define box(w,y,z) ((w)-&gt;has_box = 1, (w)-&gt;modified = 1)</div><div class='add'>+#define leaveok(a,b) SLcurses_nil()</div><div class='add'>+#define nl() SLcurses_nil()</div><div class='add'>+#define trace(x) SLcurses_nil()</div><div class='add'>+#define tigetstr(x) NULL</div><div class='add'>+</div><div class='add'>+/* These have no place in C */</div><div class='add'>+#define TRUE 1</div><div class='add'>+#define FALSE 0</div><div class='add'>+#define bool int</div><div class='add'>+</div><div class='add'>+/* Lynx compatability */</div><div class='add'>+#else</div><div class='add'>+</div><div class='add'>+#define stdscr NULL</div><div class='add'>+#define COLS SLtt_Screen_Cols</div><div class='add'>+#define LINES SLtt_Screen_Rows</div><div class='add'>+#define move SLsmg_gotorc</div><div class='add'>+#define addstr SLsmg_write_string</div><div class='add'>+#define clear SLsmg_cls</div><div class='add'>+#define standout SLsmg_reverse_video</div><div class='add'>+#define standend  SLsmg_normal_video</div><div class='add'>+#define clrtoeol SLsmg_erase_eol</div><div class='add'>+#define scrollok(a,b) SLsmg_Newline_Moves = ((b) ? 1 : -1)</div><div class='add'>+#define addch SLsmg_write_char</div><div class='add'>+#define echo()</div><div class='add'>+#define printw SLsmg_printf</div><div class='add'>+#define endwin SLsmg_reset_smg(),SLang_reset_tty</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/sldisply.c b/mdk-stage1/slang/sldisply.c<br/>new file mode 100644<br/>index 000000000..1e1161774<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sldisply.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sldisply.c</a></div><div class='hunk'>@@ -0,0 +1,2596 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+</div><div class='add'>+#if !defined(VMS) || (__VMS_VER &gt;= 70000000)</div><div class='add'>+# include &lt;sys/time.h&gt;</div><div class='add'>+# ifdef __QNX__</div><div class='add'>+#  include &lt;sys/select.h&gt;</div><div class='add'>+# endif</div><div class='add'>+# include &lt;sys/types.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __BEOS__</div><div class='add'>+/* Prototype for select */</div><div class='add'>+# include &lt;net/socket.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TERMIOS_H</div><div class='add'>+# include &lt;termios.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+# include &lt;unixlib.h&gt;</div><div class='add'>+# include &lt;unixio.h&gt;</div><div class='add'>+# include &lt;dvidef.h&gt;</div><div class='add'>+# include &lt;descrip.h&gt;</div><div class='add'>+# include &lt;lib$routines.h&gt;</div><div class='add'>+# include &lt;starlet.h&gt;</div><div class='add'>+#else</div><div class='add'>+# if !defined(sun)</div><div class='add'>+#  include &lt;sys/ioctl.h&gt;</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef SYSV</div><div class='add'>+# include &lt;sys/termio.h&gt;</div><div class='add'>+# include &lt;sys/stream.h&gt;</div><div class='add'>+# include &lt;sys/ptem.h&gt;</div><div class='add'>+# include &lt;sys/tty.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined (_AIX) &amp;&amp; !defined (FD_SET)</div><div class='add'>+# include &lt;sys/select.h&gt;	/* for FD_ISSET, FD_SET, FD_ZERO */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#if defined(__DECC) &amp;&amp; defined(VMS)</div><div class='add'>+/* These get prototypes for write an sleep */</div><div class='add'>+# include &lt;unixio.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* Colors:  These definitions are used for the display.  However, the</div><div class='add'>+ * application only uses object handles which get mapped to this</div><div class='add'>+ * internal representation.  The mapping is performed by the Color_Map</div><div class='add'>+ * structure below. */</div><div class='add'>+</div><div class='add'>+#define CHAR_MASK	0x000000FF</div><div class='add'>+#define FG_MASK		0x0000FF00</div><div class='add'>+#define BG_MASK		0x00FF0000</div><div class='add'>+#define ATTR_MASK	0x1F000000</div><div class='add'>+#define BGALL_MASK	0x0FFF0000</div><div class='add'>+</div><div class='add'>+/* The 0x10000000 bit represents the alternate character set.  BGALL_MASK does</div><div class='add'>+ * not include this attribute.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define GET_FG(color) ((color &amp; FG_MASK) &gt;&gt; 8)</div><div class='add'>+#define GET_BG(color) ((color &amp; BG_MASK) &gt;&gt; 16)</div><div class='add'>+#define MAKE_COLOR(fg, bg) (((fg) | ((bg) &lt;&lt; 8)) &lt;&lt; 8)</div><div class='add'>+</div><div class='add'>+int SLtt_Screen_Cols;</div><div class='add'>+int SLtt_Screen_Rows;</div><div class='add'>+int SLtt_Term_Cannot_Insert;</div><div class='add'>+int SLtt_Term_Cannot_Scroll;</div><div class='add'>+int SLtt_Use_Ansi_Colors;</div><div class='add'>+int SLtt_Blink_Mode = 1;</div><div class='add'>+int SLtt_Use_Blink_For_ACS = 0;</div><div class='add'>+int SLtt_Newline_Ok = 0;</div><div class='add'>+int SLtt_Has_Alt_Charset = 0;</div><div class='add'>+int SLtt_Force_Keypad_Init = 0;</div><div class='add'>+</div><div class='add'>+void (*_SLtt_color_changed_hook)(void);</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+static int Bce_Color_Offset = 0;</div><div class='add'>+#endif</div><div class='add'>+static int Can_Background_Color_Erase = 1;</div><div class='add'>+</div><div class='add'>+/* -1 means unknown */</div><div class='add'>+int SLtt_Has_Status_Line = -1;	       /* hs */</div><div class='add'>+int SLang_TT_Write_FD = -1;</div><div class='add'>+</div><div class='add'>+static int Automatic_Margins;</div><div class='add'>+/* static int No_Move_In_Standout; */</div><div class='add'>+static int Worthless_Highlight;</div><div class='add'>+#define HP_GLITCH_CODE</div><div class='add'>+#ifdef HP_GLITCH_CODE</div><div class='add'>+/* This glitch is exclusive to HP term.  Basically it means that to clear</div><div class='add'>+ * attributes, one has to erase to the end of the line.</div><div class='add'>+ */</div><div class='add'>+static int Has_HP_Glitch;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static char *Reset_Color_String;</div><div class='add'>+static int Is_Color_Terminal = 0;</div><div class='add'>+</div><div class='add'>+static int Linux_Console;</div><div class='add'>+</div><div class='add'>+/* It is crucial that JMAX_COLORS must be less than 128 since the high bit</div><div class='add'>+ * is used to indicate a character from the ACS (alt char set).  The exception</div><div class='add'>+ * to this rule is if SLtt_Use_Blink_For_ACS is true.  This means that of</div><div class='add'>+ * the highbit is set, we interpret that as a blink character.  This is</div><div class='add'>+ * exploited by DOSemu.</div><div class='add'>+ */</div><div class='add'>+#define JMAX_COLORS 256</div><div class='add'>+#define JNORMAL_COLOR 0</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   SLtt_Char_Type fgbg;</div><div class='add'>+   SLtt_Char_Type mono;</div><div class='add'>+   char *custom_esc;</div><div class='add'>+}</div><div class='add'>+Ansi_Color_Type;</div><div class='add'>+</div><div class='add'>+#define RGB1(r, g, b)   ((r) | ((g) &lt;&lt; 1) | ((b) &lt;&lt; 2))</div><div class='add'>+#define RGB(r, g, b, br, bg, bb)  ((RGB1(r, g, b) &lt;&lt; 8) | (RGB1(br, bg, bb) &lt;&lt; 16))</div><div class='add'>+</div><div class='add'>+static Ansi_Color_Type Ansi_Color_Map[JMAX_COLORS] =</div><div class='add'>+{</div><div class='add'>+     {RGB(1, 1, 1, 0, 0, 0), 0x00000000, NULL},   /* white/black */</div><div class='add'>+     {RGB(0, 1, 0, 0, 0, 0), SLTT_REV_MASK, NULL},   /* green/black */</div><div class='add'>+     {RGB(1, 0, 1, 0, 0, 0), SLTT_REV_MASK, NULL},   /* magenta/black */</div><div class='add'>+     {RGB(0, 1, 1, 0, 0, 0), SLTT_REV_MASK, NULL},   /* cyan/black */</div><div class='add'>+     {RGB(1, 0, 0, 0, 0, 0), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(0, 1, 0, 0, 0, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(1, 0, 0, 0, 0, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(1, 0, 0, 0, 1, 0), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(0, 0, 1, 1, 0, 0), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(0, 1, 0, 1, 0, 0), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(0, 1, 1, 1, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(1, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(1, 0, 1, 1, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(0, 0, 0, 0, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(0, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(0, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(0, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL},</div><div class='add'>+     {RGB(0, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static char *Color_Fg_Str = "\033[3%dm";</div><div class='add'>+static char *Color_Bg_Str = "\033[4%dm";</div><div class='add'>+static char *Default_Color_Fg_Str = "\033[39m";</div><div class='add'>+static char *Default_Color_Bg_Str = "\033[49m";</div><div class='add'>+</div><div class='add'>+static int Max_Terminfo_Colors = 8;	       /* termcap Co */</div><div class='add'>+</div><div class='add'>+char *SLtt_Graphics_Char_Pairs;	       /* ac termcap string -- def is vt100 */</div><div class='add'>+</div><div class='add'>+/* 1 if terminal lacks the ability to go into insert mode or into delete</div><div class='add'>+   mode. Currently controlled by S-Lang but later perhaps termcap. */</div><div class='add'>+</div><div class='add'>+static char *UnderLine_Vid_Str;</div><div class='add'>+static char *Blink_Vid_Str;</div><div class='add'>+static char *Bold_Vid_Str;</div><div class='add'>+static char *Ins_Mode_Str; /* = "\033[4h"; */   /* ins mode (im) */</div><div class='add'>+static char *Eins_Mode_Str; /* = "\033[4l"; */  /* end ins mode (ei) */</div><div class='add'>+static char *Scroll_R_Str; /* = "\033[%d;%dr"; */ /* scroll region */</div><div class='add'>+static char *Cls_Str; /* = "\033[2J\033[H"; */  /* cl termcap STR  for ansi terminals */</div><div class='add'>+static char *Rev_Vid_Str; /* = "\033[7m"; */    /* mr,so termcap string */</div><div class='add'>+static char *Norm_Vid_Str; /* = "\033[m"; */   /* me,se termcap string */</div><div class='add'>+static char *Del_Eol_Str; /* = "\033[K"; */	       /* ce */</div><div class='add'>+static char *Del_Bol_Str; /* = "\033[1K"; */	       /* cb */</div><div class='add'>+static char *Del_Char_Str; /* = "\033[P"; */   /* dc */</div><div class='add'>+static char *Del_N_Lines_Str; /* = "\033[%dM"; */  /* DL */</div><div class='add'>+static char *Add_N_Lines_Str; /* = "\033[%dL"; */  /* AL */</div><div class='add'>+static char *Rev_Scroll_Str;</div><div class='add'>+static char *Curs_Up_Str;</div><div class='add'>+static char *Curs_F_Str;    /* RI termcap string */</div><div class='add'>+static char *Cursor_Visible_Str;    /* ve termcap string */</div><div class='add'>+static char *Cursor_Invisible_Str;    /* vi termcap string */</div><div class='add'>+#if 0</div><div class='add'>+static char *Start_Mouse_Rpt_Str;  /* Start mouse reporting mode */</div><div class='add'>+static char *End_Mouse_Rpt_Str;  /* End mouse reporting mode */</div><div class='add'>+#endif</div><div class='add'>+static char *Start_Alt_Chars_Str;  /* as */</div><div class='add'>+static char *End_Alt_Chars_Str;   /* ae */</div><div class='add'>+static char *Enable_Alt_Char_Set;  /* eA */</div><div class='add'>+</div><div class='add'>+static char *Term_Init_Str;</div><div class='add'>+static char *Keypad_Init_Str;</div><div class='add'>+static char *Term_Reset_Str;</div><div class='add'>+static char *Keypad_Reset_Str;</div><div class='add'>+</div><div class='add'>+/* status line functions */</div><div class='add'>+static char *Disable_Status_line_Str;  /* ds */</div><div class='add'>+static char *Return_From_Status_Line_Str;   /* fs */</div><div class='add'>+static char *Goto_Status_Line_Str;     /* ts */</div><div class='add'>+static int Num_Status_Line_Columns;    /* ws */</div><div class='add'>+/* static int Status_Line_Esc_Ok;	 */       /* es */</div><div class='add'>+</div><div class='add'>+/* static int Len_Curs_F_Str = 5; */</div><div class='add'>+</div><div class='add'>+/* cm string has %i%d since termcap numbers columns from 0 */</div><div class='add'>+/* char *CURS_POS_STR = "\033[%d;%df";  ansi-- hor and vert pos */</div><div class='add'>+static char *Curs_Pos_Str; /* = "\033[%i%d;%dH";*/   /* cm termcap string */</div><div class='add'>+</div><div class='add'>+/* scrolling region */</div><div class='add'>+static int Scroll_r1 = 0, Scroll_r2 = 23;</div><div class='add'>+static int Cursor_r, Cursor_c;	       /* 0 based */</div><div class='add'>+</div><div class='add'>+/* current attributes --- initialized to impossible value */</div><div class='add'>+static SLtt_Char_Type Current_Fgbg = 0xFFFFFFFFU;</div><div class='add'>+</div><div class='add'>+static int Cursor_Set;		       /* 1 if cursor position known, 0</div><div class='add'>+					* if not.  -1 if only row is known</div><div class='add'>+					*/</div><div class='add'>+</div><div class='add'>+#define MAX_OUTPUT_BUFFER_SIZE 4096</div><div class='add'>+</div><div class='add'>+static unsigned char Output_Buffer[MAX_OUTPUT_BUFFER_SIZE];</div><div class='add'>+static unsigned char *Output_Bufferp = Output_Buffer;</div><div class='add'>+</div><div class='add'>+unsigned long SLtt_Num_Chars_Output;</div><div class='add'>+</div><div class='add'>+int _SLusleep (unsigned long usecs)</div><div class='add'>+{</div><div class='add'>+#if !defined(VMS) || (__VMS_VER &gt;= 70000000)</div><div class='add'>+   struct timeval tv;</div><div class='add'>+   tv.tv_sec = usecs / 1000000;</div><div class='add'>+   tv.tv_usec = usecs % 1000000;</div><div class='add'>+   return select(0, NULL, NULL, NULL, &amp;tv);</div><div class='add'>+#else</div><div class='add'>+   return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_flush_output (void)</div><div class='add'>+{</div><div class='add'>+   int nwrite = 0;</div><div class='add'>+   unsigned int total;</div><div class='add'>+   int n = (int) (Output_Bufferp - Output_Buffer);</div><div class='add'>+</div><div class='add'>+   SLtt_Num_Chars_Output += n;</div><div class='add'>+</div><div class='add'>+   total = 0;</div><div class='add'>+   while (n &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	nwrite = write (SLang_TT_Write_FD, (char *) Output_Buffer + total, n);</div><div class='add'>+	if (nwrite == -1)</div><div class='add'>+	  {</div><div class='add'>+	     nwrite = 0;</div><div class='add'>+#ifdef EAGAIN</div><div class='add'>+	     if (errno == EAGAIN)</div><div class='add'>+	       {</div><div class='add'>+		  _SLusleep (100000);   /* 1/10 sec */</div><div class='add'>+		  continue;</div><div class='add'>+	       }</div><div class='add'>+#endif</div><div class='add'>+#ifdef EWOULDBLOCK</div><div class='add'>+	     if (errno == EWOULDBLOCK)</div><div class='add'>+	       {</div><div class='add'>+		  _SLusleep (100000);</div><div class='add'>+		  continue;</div><div class='add'>+	       }</div><div class='add'>+#endif</div><div class='add'>+#ifdef EINTR</div><div class='add'>+	     if (errno == EINTR) continue;</div><div class='add'>+#endif</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	n -= nwrite;</div><div class='add'>+	total += nwrite;</div><div class='add'>+     }</div><div class='add'>+   Output_Bufferp = Output_Buffer;</div><div class='add'>+   return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_Baud_Rate;</div><div class='add'>+static void tt_write(char *str, unsigned int n)</div><div class='add'>+{</div><div class='add'>+   static unsigned long last_time;</div><div class='add'>+   static int total;</div><div class='add'>+   unsigned long now;</div><div class='add'>+   unsigned int ndiff;</div><div class='add'>+</div><div class='add'>+   if ((str == NULL) || (n == 0)) return;</div><div class='add'>+   total += n;</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	ndiff = MAX_OUTPUT_BUFFER_SIZE - (int) (Output_Bufferp - Output_Buffer);</div><div class='add'>+	if (ndiff &lt; n)</div><div class='add'>+	  {</div><div class='add'>+	     SLMEMCPY ((char *) Output_Bufferp, (char *) str, ndiff);</div><div class='add'>+	     Output_Bufferp += ndiff;</div><div class='add'>+	     SLtt_flush_output ();</div><div class='add'>+	     n -= ndiff;</div><div class='add'>+	     str += ndiff;</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     SLMEMCPY ((char *) Output_Bufferp, str, n);</div><div class='add'>+	     Output_Bufferp += n;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (((SLtt_Baud_Rate &gt; 150) &amp;&amp; (SLtt_Baud_Rate &lt;= 9600))</div><div class='add'>+       &amp;&amp; (10 * total &gt; SLtt_Baud_Rate))</div><div class='add'>+     {</div><div class='add'>+	total = 0;</div><div class='add'>+	if ((now = (unsigned long) time(NULL)) - last_time &lt;= 1)</div><div class='add'>+	  {</div><div class='add'>+	     SLtt_flush_output ();</div><div class='add'>+	     sleep((unsigned) 1);</div><div class='add'>+	  }</div><div class='add'>+	last_time = now;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void tt_write_string (char *str)</div><div class='add'>+{</div><div class='add'>+   if (str != NULL) tt_write(str, strlen(str));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_write_string (char *str)</div><div class='add'>+{</div><div class='add'>+   tt_write_string (str);</div><div class='add'>+   Cursor_Set = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_putchar (char ch)</div><div class='add'>+{</div><div class='add'>+   SLtt_normal_video ();</div><div class='add'>+   if (Cursor_Set == 1)</div><div class='add'>+     {</div><div class='add'>+	if (ch &gt;= ' ') Cursor_c++;</div><div class='add'>+	else if (ch == '\b') Cursor_c--;</div><div class='add'>+	else if (ch == '\r') Cursor_c = 0;</div><div class='add'>+	else Cursor_Set = 0;</div><div class='add'>+</div><div class='add'>+	if ((Cursor_c + 1 == SLtt_Screen_Cols)</div><div class='add'>+	    &amp;&amp; Automatic_Margins) Cursor_Set = 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (Output_Bufferp &lt; Output_Buffer + MAX_OUTPUT_BUFFER_SIZE)</div><div class='add'>+     {</div><div class='add'>+	*Output_Bufferp++ = (unsigned char) ch;</div><div class='add'>+     }</div><div class='add'>+   else tt_write (&amp;ch, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned int tt_sprintf(char *buf, char *fmt, int x, int y)</div><div class='add'>+{</div><div class='add'>+   char *fmt_max;</div><div class='add'>+   register unsigned char *b, ch;</div><div class='add'>+   int offset;</div><div class='add'>+   int z, z1, parse_level;</div><div class='add'>+   int zero_pad;</div><div class='add'>+   int field_width;</div><div class='add'>+   int variables [26];</div><div class='add'>+   int stack [64];</div><div class='add'>+   unsigned int stack_len;</div><div class='add'>+   int parms [10];</div><div class='add'>+#define STACK_POP (stack_len ? stack[--stack_len] : 0)</div><div class='add'>+</div><div class='add'>+   if (fmt == NULL)</div><div class='add'>+     {</div><div class='add'>+	*buf = 0;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   stack [0] = y;	       /* pushed for termcap */</div><div class='add'>+   stack [1] = x;</div><div class='add'>+   stack_len = 2;</div><div class='add'>+</div><div class='add'>+   parms [1] = x;	       /* p1 */</div><div class='add'>+   parms [2] = y;	       /* p2 */</div><div class='add'>+</div><div class='add'>+   offset = 0;</div><div class='add'>+   zero_pad = 0;</div><div class='add'>+   field_width = 0;</div><div class='add'>+</div><div class='add'>+   b = (unsigned char *) buf;</div><div class='add'>+   fmt_max = fmt + strlen (fmt);</div><div class='add'>+</div><div class='add'>+   while (fmt &lt; fmt_max)</div><div class='add'>+     {</div><div class='add'>+	ch = *fmt++;</div><div class='add'>+</div><div class='add'>+	if (ch != '%')</div><div class='add'>+	  {</div><div class='add'>+	     *b++ = ch;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (fmt == fmt_max) break;</div><div class='add'>+	ch = *fmt++;</div><div class='add'>+</div><div class='add'>+	switch (ch)</div><div class='add'>+	  {</div><div class='add'>+	   default:</div><div class='add'>+	     *b++ = ch;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 'p':</div><div class='add'>+</div><div class='add'>+	     if (fmt == fmt_max) break;</div><div class='add'>+	     ch = *fmt++;</div><div class='add'>+	     if ((ch &gt;= '0') &amp;&amp; (ch &lt;= '9'))</div><div class='add'>+	       stack [stack_len++] = parms [ch - '0'];</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '\'':   /* 'x' */</div><div class='add'>+	     if (fmt == fmt_max) break;</div><div class='add'>+	     stack [stack_len++] = *fmt++;</div><div class='add'>+	     if (fmt &lt; fmt_max) fmt++;     /* skip ' */</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '{':	       /* literal constant, e.g. {30} */</div><div class='add'>+	     z = 0;</div><div class='add'>+	     while ((fmt &lt; fmt_max) &amp;&amp; ((ch = *fmt) &lt;= '9') &amp;&amp; (ch &gt;= '0'))</div><div class='add'>+	       {</div><div class='add'>+		  z = z * 10 + (ch - '0');</div><div class='add'>+		  fmt++;</div><div class='add'>+	       }</div><div class='add'>+	     stack [stack_len++] = z;</div><div class='add'>+	     if ((ch == '}') &amp;&amp; (fmt &lt; fmt_max)) fmt++;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '0':</div><div class='add'>+	     if (fmt == fmt_max) break;</div><div class='add'>+	     ch = *fmt;</div><div class='add'>+	     if ((ch != '2') &amp;&amp; (ch != '3'))</div><div class='add'>+	       break;</div><div class='add'>+	     zero_pad = 1;</div><div class='add'>+	     fmt++;</div><div class='add'>+	     /* drop */</div><div class='add'>+</div><div class='add'>+	   case '2':</div><div class='add'>+	   case '3':</div><div class='add'>+	     if (fmt == fmt_max)</div><div class='add'>+	     if (*fmt == 'x')</div><div class='add'>+	       {</div><div class='add'>+		  char x_fmt_buf [4];</div><div class='add'>+		  char *x_fmt_buf_ptr;</div><div class='add'>+</div><div class='add'>+		  x_fmt_buf_ptr = x_fmt_buf;</div><div class='add'>+		  if (zero_pad) *x_fmt_buf_ptr++ = '0';</div><div class='add'>+		  *x_fmt_buf_ptr++ = ch;</div><div class='add'>+		  *x_fmt_buf_ptr++ = 'X';</div><div class='add'>+		  *x_fmt_buf_ptr = 0;</div><div class='add'>+</div><div class='add'>+		  z = STACK_POP;</div><div class='add'>+		  z += offset;</div><div class='add'>+</div><div class='add'>+		  sprintf ((char *)b, x_fmt_buf, z);</div><div class='add'>+		  b += strlen ((char *)b);</div><div class='add'>+		  zero_pad = 0;</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     field_width = (ch - '0');</div><div class='add'>+		  /* drop */</div><div class='add'>+</div><div class='add'>+	   case 'd':</div><div class='add'>+	     z = STACK_POP;</div><div class='add'>+	     z += offset;</div><div class='add'>+	     if (z &gt;= 100)</div><div class='add'>+	       {</div><div class='add'>+		  *b++ = z / 100 + '0';</div><div class='add'>+		  z = z % 100;</div><div class='add'>+		  zero_pad = 1;</div><div class='add'>+		  field_width = 2;</div><div class='add'>+	       }</div><div class='add'>+	     else if (zero_pad &amp;&amp; (field_width == 3))</div><div class='add'>+	       *b++ = '0';</div><div class='add'>+</div><div class='add'>+	     if (z &gt;= 10)</div><div class='add'>+	       {</div><div class='add'>+		  *b++ = z / 10 + '0';</div><div class='add'>+		  z = z % 10;</div><div class='add'>+	       }</div><div class='add'>+	     else if (zero_pad &amp;&amp; (field_width &gt;= 2))</div><div class='add'>+	       *b++ = '0';</div><div class='add'>+</div><div class='add'>+	     *b++ = z + '0';</div><div class='add'>+	     field_width = zero_pad = 0;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 'x':</div><div class='add'>+	     z = STACK_POP;</div><div class='add'>+	     z += offset;</div><div class='add'>+	     sprintf ((char *) b, "%X", z);</div><div class='add'>+	     b += strlen ((char *)b);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 'i':</div><div class='add'>+	     offset = 1;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '+':</div><div class='add'>+	     /* Handling this depends upon whether or not we are parsing</div><div class='add'>+	      * terminfo.  Terminfo requires the stack so use it as an</div><div class='add'>+	      * indicator.</div><div class='add'>+	      */</div><div class='add'>+	     if (stack_len &gt; 2)</div><div class='add'>+	       {</div><div class='add'>+		  z = STACK_POP;</div><div class='add'>+		  stack [stack_len - 1] += z;</div><div class='add'>+	       }</div><div class='add'>+	     else if (fmt &lt; fmt_max)</div><div class='add'>+	       {</div><div class='add'>+		  ch = *fmt++;</div><div class='add'>+		  if ((unsigned char) ch == 128) ch = 0;</div><div class='add'>+		  ch = ch + (unsigned char) STACK_POP;</div><div class='add'>+		  if (ch == '\n') ch++;</div><div class='add'>+		  *b++ = ch;</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	     /* Binary operators */</div><div class='add'>+	   case '-':</div><div class='add'>+	   case '*':</div><div class='add'>+	   case '/':</div><div class='add'>+	   case 'm':</div><div class='add'>+	   case '&amp;':</div><div class='add'>+	   case '|':</div><div class='add'>+	   case '^':</div><div class='add'>+	   case '=':</div><div class='add'>+	   case '&gt;':</div><div class='add'>+	   case '&lt;':</div><div class='add'>+	   case 'A':</div><div class='add'>+	   case 'O':</div><div class='add'>+	     z1 = STACK_POP;</div><div class='add'>+	     z = STACK_POP;</div><div class='add'>+	     switch (ch)</div><div class='add'>+	       {</div><div class='add'>+		case '-': z = (z - z1); break;</div><div class='add'>+		case '*': z = (z * z1); break;</div><div class='add'>+		case '/': z = (z / z1); break;</div><div class='add'>+		case 'm': z = (z % z1); break;</div><div class='add'>+		case '&amp;': z = (z &amp; z1); break;</div><div class='add'>+		case '|': z = (z | z1); break;</div><div class='add'>+		case '^': z = (z ^ z1); break;</div><div class='add'>+		case '=': z = (z == z1); break;</div><div class='add'>+		case '&gt;': z = (z &gt; z1); break;</div><div class='add'>+		case '&lt;': z = (z &lt; z1); break;</div><div class='add'>+		case 'A': z = (z &amp;&amp; z1); break;</div><div class='add'>+		case 'O': z = (z || z1); break;</div><div class='add'>+	       }</div><div class='add'>+	     stack [stack_len++] = z;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	     /* unary */</div><div class='add'>+	   case '!':</div><div class='add'>+	     z = STACK_POP;</div><div class='add'>+	     stack [stack_len++] = !z;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '~':</div><div class='add'>+	     z = STACK_POP;</div><div class='add'>+	     stack [stack_len++] = ~z;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 'r':		       /* termcap -- swap parameters */</div><div class='add'>+	     z = stack [0];</div><div class='add'>+	     stack [0] = stack [1];</div><div class='add'>+	     stack [1] = z;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '.':		       /* termcap */</div><div class='add'>+	   case 'c':</div><div class='add'>+	     ch = (unsigned char) STACK_POP;</div><div class='add'>+	     if (ch == '\n') ch++;</div><div class='add'>+	     *b++ = ch;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 'g':</div><div class='add'>+	     if (fmt == fmt_max) break;</div><div class='add'>+	     ch = *fmt++;</div><div class='add'>+	     if ((ch &gt;= 'a') &amp;&amp; (ch &lt;= 'z'))</div><div class='add'>+	       stack [stack_len++] = variables [ch - 'a'];</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 'P':</div><div class='add'>+	     if (fmt == fmt_max) break;</div><div class='add'>+	     ch = *fmt++;</div><div class='add'>+	     if ((ch &gt;= 'a') &amp;&amp; (ch &lt;= 'z'))</div><div class='add'>+	       variables [ch - 'a'] = STACK_POP;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	     /* If then else parsing.  Actually, this is rather easy.  The</div><div class='add'>+	      * key is to notice that 'then' does all the work.  'if' simply</div><div class='add'>+	      * there to indicate the start of a test and endif indicates</div><div class='add'>+	      * the end of tests.  If 'else' is seen, then skip to</div><div class='add'>+	      * endif.</div><div class='add'>+	      */</div><div class='add'>+	   case '?':		       /* if */</div><div class='add'>+	   case ';':		       /* endif */</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 't':		       /* then */</div><div class='add'>+	     z = STACK_POP;</div><div class='add'>+	     if (z != 0)</div><div class='add'>+	       break;		       /* good.  Continue parsing. */</div><div class='add'>+</div><div class='add'>+	     /* z == 0 and test has failed.  So, skip past this entire if</div><div class='add'>+	      * expression to the matching else or matching endif.</div><div class='add'>+	      */</div><div class='add'>+	     /* drop */</div><div class='add'>+	   case 'e':		       /* else */</div><div class='add'>+</div><div class='add'>+	     parse_level = 0;</div><div class='add'>+	     while (fmt &lt; fmt_max)</div><div class='add'>+	       {</div><div class='add'>+		  unsigned char ch1;</div><div class='add'>+</div><div class='add'>+		  ch1 = *fmt++;</div><div class='add'>+		  if ((ch1 != '%') || (fmt == fmt_max))</div><div class='add'>+		    continue;</div><div class='add'>+</div><div class='add'>+		  ch1 = *fmt++;</div><div class='add'>+</div><div class='add'>+		  if (ch1 == '?') parse_level++;   /* new if */</div><div class='add'>+		  else if (ch1 == 'e')</div><div class='add'>+		    {</div><div class='add'>+		       if ((ch != 'e') &amp;&amp; (parse_level == 0))</div><div class='add'>+			 break;</div><div class='add'>+		    }</div><div class='add'>+		  else if (ch1 == ';')</div><div class='add'>+		    {</div><div class='add'>+		       if (parse_level == 0)</div><div class='add'>+			 break;</div><div class='add'>+		       parse_level--;</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   *b = 0;</div><div class='add'>+   return (unsigned int) (b - (unsigned char *) buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void tt_printf(char *fmt, int x, int y)</div><div class='add'>+{</div><div class='add'>+   char buf[1024];</div><div class='add'>+   unsigned int n;</div><div class='add'>+   if (fmt == NULL) return;</div><div class='add'>+   n = tt_sprintf(buf, fmt, x, y);</div><div class='add'>+   tt_write(buf, n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_set_scroll_region (int r1, int r2)</div><div class='add'>+{</div><div class='add'>+   Scroll_r1 = r1;</div><div class='add'>+   Scroll_r2 = r2;</div><div class='add'>+   tt_printf (Scroll_R_Str, Scroll_r1, Scroll_r2);</div><div class='add'>+   Cursor_Set = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_reset_scroll_region (void)</div><div class='add'>+{</div><div class='add'>+   SLtt_set_scroll_region(0, SLtt_Screen_Rows - 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_set_cursor_visibility (int show)</div><div class='add'>+{</div><div class='add'>+   if ((Cursor_Visible_Str == NULL) || (Cursor_Invisible_Str == NULL))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   tt_write_string (show ? Cursor_Visible_Str : Cursor_Invisible_Str);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* the goto_rc function moves to row relative to scrolling region */</div><div class='add'>+void SLtt_goto_rc(int r, int c)</div><div class='add'>+{</div><div class='add'>+   char *s = NULL;</div><div class='add'>+   int n;</div><div class='add'>+   char buf[6];</div><div class='add'>+</div><div class='add'>+   if ((c &lt; 0) || (r &lt; 0))</div><div class='add'>+     {</div><div class='add'>+	Cursor_Set = 0;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* if (No_Move_In_Standout &amp;&amp; Current_Fgbg) SLtt_normal_video (); */</div><div class='add'>+   r += Scroll_r1;</div><div class='add'>+</div><div class='add'>+   if ((Cursor_Set &gt; 0) || ((Cursor_Set &lt; 0) &amp;&amp; !Automatic_Margins))</div><div class='add'>+     {</div><div class='add'>+	n = r - Cursor_r;</div><div class='add'>+	if ((n == -1) &amp;&amp; (Cursor_Set &gt; 0) &amp;&amp; (Cursor_c == c)</div><div class='add'>+	    &amp;&amp; (Curs_Up_Str != NULL))</div><div class='add'>+	  {</div><div class='add'>+	     s = Curs_Up_Str;</div><div class='add'>+	  }</div><div class='add'>+	else if ((n &gt;= 0) &amp;&amp; (n &lt;= 4))</div><div class='add'>+	  {</div><div class='add'>+	     if ((n == 0) &amp;&amp; (Cursor_Set == 1)</div><div class='add'>+		 &amp;&amp; ((c &gt; 1) || (c == Cursor_c)))</div><div class='add'>+	       {</div><div class='add'>+		  if (Cursor_c == c) return;</div><div class='add'>+		  if (Cursor_c == c + 1)</div><div class='add'>+		    {</div><div class='add'>+		       s = buf;</div><div class='add'>+		       *s++ = '\b'; *s = 0;</div><div class='add'>+		       s = buf;</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+	     else if (c == 0)</div><div class='add'>+	       {</div><div class='add'>+		  s = buf;</div><div class='add'>+		  if ((Cursor_Set != 1) || (Cursor_c != 0)) *s++ = '\r';</div><div class='add'>+		  while (n--) *s++ = '\n';</div><div class='add'>+#ifdef VMS</div><div class='add'>+		  /* Need to add this after \n to start a new record.  Sheesh. */</div><div class='add'>+		  *s++ = '\r';</div><div class='add'>+#endif</div><div class='add'>+		  *s = 0;</div><div class='add'>+		  s = buf;</div><div class='add'>+	       }</div><div class='add'>+	     /* Will fail on VMS */</div><div class='add'>+#ifndef VMS</div><div class='add'>+	     else if (SLtt_Newline_Ok &amp;&amp; (Cursor_Set == 1) &amp;&amp;</div><div class='add'>+		      (Cursor_c &gt;= c) &amp;&amp; (c + 3 &gt; Cursor_c))</div><div class='add'>+	       {</div><div class='add'>+		  s = buf;</div><div class='add'>+		  while (n--) *s++ = '\n';</div><div class='add'>+		  n = Cursor_c - c;</div><div class='add'>+		  while (n--) *s++ = '\b';</div><div class='add'>+		  *s = 0;</div><div class='add'>+		  s = buf;</div><div class='add'>+	       }</div><div class='add'>+#endif</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   if (s != NULL) tt_write_string(s);</div><div class='add'>+   else tt_printf(Curs_Pos_Str, r, c);</div><div class='add'>+   Cursor_c = c; Cursor_r = r;</div><div class='add'>+   Cursor_Set = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_begin_insert (void)</div><div class='add'>+{</div><div class='add'>+   tt_write_string(Ins_Mode_Str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_end_insert (void)</div><div class='add'>+{</div><div class='add'>+   tt_write_string(Eins_Mode_Str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_delete_char (void)</div><div class='add'>+{</div><div class='add'>+   SLtt_normal_video ();</div><div class='add'>+   tt_write_string(Del_Char_Str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_erase_line (void)</div><div class='add'>+{</div><div class='add'>+   tt_write_string("\r");</div><div class='add'>+   Cursor_Set = 1; Cursor_c = 0;</div><div class='add'>+   SLtt_del_eol();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* It appears that the Linux console, and most likely others do not</div><div class='add'>+ * like scrolling regions that consist of one line.  So I have to</div><div class='add'>+ * resort to this stupidity to make up for that stupidity.</div><div class='add'>+ */</div><div class='add'>+static void delete_line_in_scroll_region (void)</div><div class='add'>+{</div><div class='add'>+   SLtt_goto_rc (Cursor_r - Scroll_r1, 0);</div><div class='add'>+   SLtt_del_eol ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_delete_nlines (int n)</div><div class='add'>+{</div><div class='add'>+   int r1, curs;</div><div class='add'>+   char buf[132];</div><div class='add'>+</div><div class='add'>+   if (n &lt;= 0) return;</div><div class='add'>+   SLtt_normal_video ();</div><div class='add'>+</div><div class='add'>+   if (Scroll_r1 == Scroll_r2)</div><div class='add'>+     {</div><div class='add'>+	delete_line_in_scroll_region ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (Del_N_Lines_Str != NULL) tt_printf(Del_N_Lines_Str,n, 0);</div><div class='add'>+   else</div><div class='add'>+   /* get a new terminal */</div><div class='add'>+     {</div><div class='add'>+	r1 = Scroll_r1;</div><div class='add'>+	curs = Cursor_r;</div><div class='add'>+	SLtt_set_scroll_region(curs, Scroll_r2);</div><div class='add'>+	SLtt_goto_rc(Scroll_r2 - Scroll_r1, 0);</div><div class='add'>+	SLMEMSET(buf, '\n', (unsigned int) n);</div><div class='add'>+	tt_write(buf, (unsigned int) n);</div><div class='add'>+	/* while (n--) tt_putchar('\n'); */</div><div class='add'>+	SLtt_set_scroll_region(r1, Scroll_r2);</div><div class='add'>+	SLtt_goto_rc(curs, 0);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_cls (void)</div><div class='add'>+{</div><div class='add'>+   /* If the terminal is a color terminal but the user wants black and </div><div class='add'>+    * white, then make sure that the colors are reset.  This appears to be</div><div class='add'>+    * necessary.</div><div class='add'>+    */</div><div class='add'>+   if ((SLtt_Use_Ansi_Colors == 0) &amp;&amp; Is_Color_Terminal)</div><div class='add'>+     {</div><div class='add'>+	if (Reset_Color_String != NULL)</div><div class='add'>+	  tt_write_string (Reset_Color_String);</div><div class='add'>+	else</div><div class='add'>+	  tt_write_string ("\033[0m\033[m");</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLtt_normal_video();</div><div class='add'>+   SLtt_reset_scroll_region ();</div><div class='add'>+   tt_write_string(Cls_Str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_reverse_index (int n)</div><div class='add'>+{</div><div class='add'>+   if (!n) return;</div><div class='add'>+</div><div class='add'>+   SLtt_normal_video();</div><div class='add'>+</div><div class='add'>+   if (Scroll_r1 == Scroll_r2)</div><div class='add'>+     {</div><div class='add'>+	delete_line_in_scroll_region ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (Add_N_Lines_Str != NULL) tt_printf(Add_N_Lines_Str,n, 0);</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	while(n--) tt_write_string(Rev_Scroll_Str);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_Ignore_Beep = 1;</div><div class='add'>+static char *Visible_Bell_Str;</div><div class='add'>+</div><div class='add'>+void SLtt_beep (void)</div><div class='add'>+{</div><div class='add'>+   if (SLtt_Ignore_Beep &amp; 0x1) SLtt_putchar('\007');</div><div class='add'>+</div><div class='add'>+   if (SLtt_Ignore_Beep &amp; 0x2)</div><div class='add'>+     {</div><div class='add'>+	if (Visible_Bell_Str != NULL) tt_write_string (Visible_Bell_Str);</div><div class='add'>+#ifdef __linux__</div><div class='add'>+	else if (Linux_Console)</div><div class='add'>+	  {</div><div class='add'>+	     tt_write_string ("\033[?5h");</div><div class='add'>+	     SLtt_flush_output ();</div><div class='add'>+	     _SLusleep (50000);</div><div class='add'>+	     tt_write_string ("\033[?5l");</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+   SLtt_flush_output ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void del_eol (void)</div><div class='add'>+{</div><div class='add'>+   int c;</div><div class='add'>+</div><div class='add'>+   if (Del_Eol_Str != NULL)</div><div class='add'>+     {</div><div class='add'>+	tt_write_string(Del_Eol_Str);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   c = Cursor_c;</div><div class='add'>+   /* Avoid writing to the lower right corner.  If the terminal does not</div><div class='add'>+    * have Del_Eol_Str, then it probably does not have what it takes to play</div><div class='add'>+    * games with insert for for a space into that corner.</div><div class='add'>+    */</div><div class='add'>+   if (Cursor_r + 1 &lt; SLtt_Screen_Rows)</div><div class='add'>+     c++;</div><div class='add'>+</div><div class='add'>+   while (c &lt; SLtt_Screen_Cols)</div><div class='add'>+     {</div><div class='add'>+	tt_write (" ", 1);</div><div class='add'>+	c++;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_del_eol (void)</div><div class='add'>+{</div><div class='add'>+   if (Current_Fgbg != 0xFFFFFFFFU) SLtt_normal_video ();</div><div class='add'>+   del_eol ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   SLtt_Char_Type color;</div><div class='add'>+}</div><div class='add'>+Color_Def_Type;</div><div class='add'>+</div><div class='add'>+#define MAX_COLOR_NAMES 17</div><div class='add'>+static Color_Def_Type Color_Defs [MAX_COLOR_NAMES] =</div><div class='add'>+{</div><div class='add'>+     {"black",		SLSMG_COLOR_BLACK},</div><div class='add'>+     {"red",		SLSMG_COLOR_RED},</div><div class='add'>+     {"green",		SLSMG_COLOR_GREEN},</div><div class='add'>+     {"brown",		SLSMG_COLOR_BROWN},</div><div class='add'>+     {"blue",		SLSMG_COLOR_BLUE},</div><div class='add'>+     {"magenta",	SLSMG_COLOR_MAGENTA},</div><div class='add'>+     {"cyan",		SLSMG_COLOR_CYAN},</div><div class='add'>+     {"lightgray",	SLSMG_COLOR_LGRAY},</div><div class='add'>+     {"gray",		SLSMG_COLOR_GRAY},</div><div class='add'>+     {"brightred",	SLSMG_COLOR_BRIGHT_RED},</div><div class='add'>+     {"brightgreen",	SLSMG_COLOR_BRIGHT_GREEN},</div><div class='add'>+     {"yellow",		SLSMG_COLOR_BRIGHT_BROWN},</div><div class='add'>+     {"brightblue",	SLSMG_COLOR_BRIGHT_BLUE},</div><div class='add'>+     {"brightmagenta",	SLSMG_COLOR_BRIGHT_CYAN},</div><div class='add'>+     {"brightcyan",	SLSMG_COLOR_BRIGHT_MAGENTA},</div><div class='add'>+     {"white",		SLSMG_COLOR_BRIGHT_WHITE},</div><div class='add'>+#define SLSMG_COLOR_DEFAULT 0xFF</div><div class='add'>+     {"default",		SLSMG_COLOR_DEFAULT}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+void SLtt_set_mono (int obj, char *what, SLtt_Char_Type mask)</div><div class='add'>+{</div><div class='add'>+   (void) what;</div><div class='add'>+   if ((obj &lt; 0) || (obj &gt;= JMAX_COLORS))</div><div class='add'>+     {</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   Ansi_Color_Map[obj].mono = mask &amp; ATTR_MASK;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *check_color_for_digit_form (char *color)</div><div class='add'>+{</div><div class='add'>+   unsigned int i, ich;</div><div class='add'>+   char *s = color;</div><div class='add'>+</div><div class='add'>+   i = 0;</div><div class='add'>+   while ((ich = (int) *s) != 0)</div><div class='add'>+     {</div><div class='add'>+	if ((ich &lt; '0') || (ich &gt; '9'))</div><div class='add'>+	  return color;</div><div class='add'>+</div><div class='add'>+	i = i * 10 + (ich - '0');</div><div class='add'>+	s++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (i &lt; MAX_COLOR_NAMES)</div><div class='add'>+     color = Color_Defs[i].name;</div><div class='add'>+</div><div class='add'>+   return color;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_default_colors (char **fgp, char **bgp)</div><div class='add'>+{</div><div class='add'>+   static char fg_buf[16], bg_buf[16], *bg, *fg;</div><div class='add'>+   static int already_parsed;</div><div class='add'>+   char *p, *pmax;</div><div class='add'>+</div><div class='add'>+   if (already_parsed == -1)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (already_parsed)</div><div class='add'>+     {</div><div class='add'>+	*fgp = fg;</div><div class='add'>+	*bgp = bg;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   already_parsed = -1;</div><div class='add'>+</div><div class='add'>+   bg = getenv ("COLORFGBG");</div><div class='add'>+</div><div class='add'>+   if (bg == NULL)</div><div class='add'>+     {</div><div class='add'>+	bg = getenv ("DEFAULT_COLORS");</div><div class='add'>+	if (bg == NULL)</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   p = fg_buf;</div><div class='add'>+   pmax = p + (sizeof (fg_buf) - 1);</div><div class='add'>+</div><div class='add'>+   while ((*bg != 0) &amp;&amp; (*bg != ';'))</div><div class='add'>+     {</div><div class='add'>+	if (p &lt; pmax) *p++ = *bg;</div><div class='add'>+	bg++;</div><div class='add'>+     }</div><div class='add'>+   *p = 0;</div><div class='add'>+</div><div class='add'>+   if (*bg) bg++;</div><div class='add'>+</div><div class='add'>+   p = bg_buf;</div><div class='add'>+   pmax = p + (sizeof (bg_buf) - 1);</div><div class='add'>+</div><div class='add'>+   /* Mark suggested allowing for extra spplication specific stuff following</div><div class='add'>+    * the background color.  That is what the check for the semi-colon is for.</div><div class='add'>+    */</div><div class='add'>+   while ((*bg != 0) &amp;&amp; (*bg != ';'))</div><div class='add'>+     {</div><div class='add'>+	if (p &lt; pmax) *p++ = *bg;</div><div class='add'>+	bg++;</div><div class='add'>+     }</div><div class='add'>+   *p = 0;</div><div class='add'>+</div><div class='add'>+   if (!strcmp (fg_buf, "default") || !strcmp(bg_buf, "default"))</div><div class='add'>+     {</div><div class='add'>+	*fgp = *bgp = fg = bg = "default";</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	*fgp = fg = check_color_for_digit_form (fg_buf);</div><div class='add'>+	*bgp = bg = check_color_for_digit_form (bg_buf);</div><div class='add'>+     }</div><div class='add'>+   already_parsed = 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char FgBg_Stats[JMAX_COLORS];</div><div class='add'>+</div><div class='add'>+static int Color_0_Modified = 0;</div><div class='add'>+</div><div class='add'>+void SLtt_set_color_object (int obj, SLtt_Char_Type attr)</div><div class='add'>+{</div><div class='add'>+   char *cust_esc;</div><div class='add'>+</div><div class='add'>+   if ((obj &lt; 0) || (obj &gt;= JMAX_COLORS)) return;</div><div class='add'>+</div><div class='add'>+   cust_esc = Ansi_Color_Map[obj].custom_esc;</div><div class='add'>+   if (cust_esc != NULL)</div><div class='add'>+     {</div><div class='add'>+	SLfree (cust_esc);</div><div class='add'>+	FgBg_Stats[(Ansi_Color_Map[obj].fgbg &gt;&gt; 8) &amp; 0x7F] -= 1;</div><div class='add'>+	Ansi_Color_Map[obj].custom_esc = NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Ansi_Color_Map[obj].fgbg = attr;</div><div class='add'>+   if (obj == 0) Color_0_Modified = 1;</div><div class='add'>+</div><div class='add'>+   if (_SLtt_color_changed_hook != NULL)</div><div class='add'>+     (*_SLtt_color_changed_hook)();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLtt_Char_Type SLtt_get_color_object (int obj)</div><div class='add'>+{</div><div class='add'>+   if ((obj &lt; 0) || (obj &gt;= JMAX_COLORS)) return 0;</div><div class='add'>+   return Ansi_Color_Map[obj].fgbg;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_add_color_attribute (int obj, SLtt_Char_Type attr)</div><div class='add'>+{</div><div class='add'>+   if ((obj &lt; 0) || (obj &gt;= JMAX_COLORS)) return;</div><div class='add'>+</div><div class='add'>+   Ansi_Color_Map[obj].fgbg |= (attr &amp; ATTR_MASK);</div><div class='add'>+   if (obj == 0) Color_0_Modified = 1;</div><div class='add'>+   if (_SLtt_color_changed_hook != NULL)</div><div class='add'>+     (*_SLtt_color_changed_hook)();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLtt_Char_Type fb_to_fgbg (SLtt_Char_Type f, SLtt_Char_Type b)</div><div class='add'>+{</div><div class='add'>+   SLtt_Char_Type attr;</div><div class='add'>+</div><div class='add'>+   if (Max_Terminfo_Colors != 8)</div><div class='add'>+     {</div><div class='add'>+	if (f != SLSMG_COLOR_DEFAULT) f %= Max_Terminfo_Colors;</div><div class='add'>+	if (b != SLSMG_COLOR_DEFAULT) b %= Max_Terminfo_Colors;</div><div class='add'>+	return ((f &lt;&lt; 8) | (b &lt;&lt; 16));</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Otherwise we have 8 ansi colors.  Try to get bright versions</div><div class='add'>+    * by using the BOLD and BLINK attributes.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   attr = 0;</div><div class='add'>+</div><div class='add'>+   /* Note:  If f represents default, it will have the value 0xFF */</div><div class='add'>+   if (f != SLSMG_COLOR_DEFAULT)</div><div class='add'>+     {</div><div class='add'>+	if (f &amp; 0x8) attr = SLTT_BOLD_MASK;</div><div class='add'>+	f &amp;= 0x7;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (b != SLSMG_COLOR_DEFAULT)</div><div class='add'>+     {</div><div class='add'>+	if (b &amp; 0x8) attr |= SLTT_BLINK_MASK;</div><div class='add'>+	b &amp;= 0x7;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return ((f &lt;&lt; 8) | (b &lt;&lt; 16) | attr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This looks for colors with name form 'colorN'.  If color is of this</div><div class='add'>+ * form, N is passed back via paramter list.</div><div class='add'>+ */</div><div class='add'>+static int parse_color_digit_name (char *color, SLtt_Char_Type *f)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+   unsigned char ch;</div><div class='add'>+</div><div class='add'>+   if (strncmp (color, "color", 5))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   color += 5;</div><div class='add'>+   if (*color == 0)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   i = 0;</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	ch = (unsigned char) *color++;</div><div class='add'>+	if (ch == 0)</div><div class='add'>+	  break;</div><div class='add'>+	if ((ch &gt; '9') || (ch &lt; '0'))</div><div class='add'>+	  return -1;</div><div class='add'>+	i = 10 * i + (ch - '0');</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *f = (SLtt_Char_Type) i;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int make_color_fgbg (char *fg, char *bg, SLtt_Char_Type *fgbg)</div><div class='add'>+{</div><div class='add'>+   SLtt_Char_Type f = 0xFFFFFFFFU, b = 0xFFFFFFFFU;</div><div class='add'>+   char *dfg, *dbg;</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   if ((fg != NULL) &amp;&amp; (*fg == 0)) fg = NULL;</div><div class='add'>+   if ((bg != NULL) &amp;&amp; (*bg == 0)) bg = NULL;</div><div class='add'>+</div><div class='add'>+   if ((fg == NULL) || (bg == NULL))</div><div class='add'>+     {</div><div class='add'>+	if (-1 == get_default_colors (&amp;dfg, &amp;dbg))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	if (fg == NULL) fg = dfg;</div><div class='add'>+	if (bg == NULL) bg = dbg;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == parse_color_digit_name (fg, &amp;f))</div><div class='add'>+     {</div><div class='add'>+	for (i = 0; i &lt; MAX_COLOR_NAMES; i++)</div><div class='add'>+	  {</div><div class='add'>+	     if (strcmp(fg, Color_Defs[i].name)) continue;</div><div class='add'>+	     f = Color_Defs[i].color;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == parse_color_digit_name (bg, &amp;b))</div><div class='add'>+     {</div><div class='add'>+	for (i = 0; i &lt; MAX_COLOR_NAMES; i++)</div><div class='add'>+	  {</div><div class='add'>+	     if (strcmp(bg, Color_Defs[i].name)) continue;</div><div class='add'>+	     b = Color_Defs[i].color;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((f == 0xFFFFFFFFU) || (b == 0xFFFFFFFFU))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   *fgbg = fb_to_fgbg (f, b);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_set_color (int obj, char *what, char *fg, char *bg)</div><div class='add'>+{</div><div class='add'>+   SLtt_Char_Type fgbg;</div><div class='add'>+</div><div class='add'>+   (void) what;</div><div class='add'>+   if ((obj &lt; 0) || (obj &gt;= JMAX_COLORS))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (-1 != make_color_fgbg (fg, bg, &amp;fgbg))</div><div class='add'>+     SLtt_set_color_object (obj, fgbg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_set_color_fgbg (int obj, SLtt_Char_Type f, SLtt_Char_Type b)</div><div class='add'>+{</div><div class='add'>+   SLtt_set_color_object (obj, fb_to_fgbg (f, b));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_set_color_esc (int obj, char *esc)</div><div class='add'>+{</div><div class='add'>+   char *cust_esc;</div><div class='add'>+   SLtt_Char_Type fgbg = 0;</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   if ((obj &lt; 0) || (obj &gt;= JMAX_COLORS))</div><div class='add'>+     {</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   cust_esc = Ansi_Color_Map[obj].custom_esc;</div><div class='add'>+   if (cust_esc != NULL)</div><div class='add'>+     {</div><div class='add'>+	SLfree (cust_esc);</div><div class='add'>+	FgBg_Stats[(Ansi_Color_Map[obj].fgbg &gt;&gt; 8) &amp; 0x7F] -= 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   cust_esc = (char *) SLmalloc (strlen(esc) + 1);</div><div class='add'>+   if (cust_esc != NULL) strcpy (cust_esc, esc);</div><div class='add'>+</div><div class='add'>+   Ansi_Color_Map[obj].custom_esc = cust_esc;</div><div class='add'>+   if (cust_esc == NULL) fgbg = 0;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	/* The whole point of this is to generate a unique fgbg */</div><div class='add'>+	for (i = 0; i &lt; JMAX_COLORS; i++)</div><div class='add'>+	  {</div><div class='add'>+	     if (FgBg_Stats[i] == 0) fgbg = i;</div><div class='add'>+</div><div class='add'>+	     if (obj == i) continue;</div><div class='add'>+	     if ((Ansi_Color_Map[i].custom_esc) == NULL) continue;</div><div class='add'>+	     if (!strcmp (Ansi_Color_Map[i].custom_esc, cust_esc))</div><div class='add'>+	       {</div><div class='add'>+		  fgbg = (Ansi_Color_Map[i].fgbg &gt;&gt; 8) &amp; 0x7F;</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	FgBg_Stats[fgbg] += 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   fgbg |= 0x80;</div><div class='add'>+   Ansi_Color_Map[obj].fgbg = (fgbg | (fgbg &lt;&lt; 8)) &lt;&lt; 8;</div><div class='add'>+   if (obj == 0) Color_0_Modified = 1;</div><div class='add'>+   if (_SLtt_color_changed_hook != NULL)</div><div class='add'>+     (*_SLtt_color_changed_hook)();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_set_alt_char_set (int i)</div><div class='add'>+{</div><div class='add'>+   static int last_i;</div><div class='add'>+   if (SLtt_Has_Alt_Charset == 0) return;</div><div class='add'>+   if (i == last_i) return;</div><div class='add'>+   tt_write_string (i ? Start_Alt_Chars_Str : End_Alt_Chars_Str );</div><div class='add'>+   last_i = i;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void write_attributes (SLtt_Char_Type fgbg)</div><div class='add'>+{</div><div class='add'>+   int bg0, fg0;</div><div class='add'>+   int unknown_attributes;</div><div class='add'>+</div><div class='add'>+   if (Worthless_Highlight) return;</div><div class='add'>+   if (fgbg == Current_Fgbg) return;</div><div class='add'>+</div><div class='add'>+   unknown_attributes = 0;</div><div class='add'>+</div><div class='add'>+   /* Before spitting out colors, fix attributes */</div><div class='add'>+   if ((fgbg &amp; ATTR_MASK) != (Current_Fgbg &amp; ATTR_MASK))</div><div class='add'>+     {</div><div class='add'>+	if (Current_Fgbg &amp; ATTR_MASK)</div><div class='add'>+	  {</div><div class='add'>+	     tt_write_string(Norm_Vid_Str);</div><div class='add'>+	     /* In case normal video turns off ALL attributes: */</div><div class='add'>+	     if (fgbg &amp; SLTT_ALTC_MASK)</div><div class='add'>+	       Current_Fgbg &amp;= ~SLTT_ALTC_MASK;</div><div class='add'>+	     SLtt_set_alt_char_set (0);</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if ((fgbg &amp; SLTT_ALTC_MASK)</div><div class='add'>+	    != (Current_Fgbg &amp; SLTT_ALTC_MASK))</div><div class='add'>+	  {</div><div class='add'>+	     SLtt_set_alt_char_set ((int) (fgbg &amp; SLTT_ALTC_MASK));</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (fgbg &amp; SLTT_ULINE_MASK) tt_write_string (UnderLine_Vid_Str);</div><div class='add'>+	if (fgbg &amp; SLTT_BOLD_MASK) SLtt_bold_video ();</div><div class='add'>+	if (fgbg &amp; SLTT_REV_MASK) tt_write_string (Rev_Vid_Str);</div><div class='add'>+	if (fgbg &amp; SLTT_BLINK_MASK)</div><div class='add'>+	  {</div><div class='add'>+	     /* Someday Linux will have a blink mode that set high intensity</div><div class='add'>+	      * background.  Lets be prepared.</div><div class='add'>+	      */</div><div class='add'>+	     if (SLtt_Blink_Mode) tt_write_string (Blink_Vid_Str);</div><div class='add'>+	  }</div><div class='add'>+	unknown_attributes = 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (SLtt_Use_Ansi_Colors)</div><div class='add'>+     {</div><div class='add'>+	fg0 = (int) GET_FG(fgbg);</div><div class='add'>+	bg0 = (int) GET_BG(fgbg);</div><div class='add'>+</div><div class='add'>+	if (unknown_attributes </div><div class='add'>+	    || (fg0 != (int)GET_FG(Current_Fgbg)))</div><div class='add'>+	  {</div><div class='add'>+	     if (fg0 == SLSMG_COLOR_DEFAULT)</div><div class='add'>+	       tt_write_string (Default_Color_Fg_Str);</div><div class='add'>+	     else</div><div class='add'>+	       tt_printf (Color_Fg_Str, fg0, 0);</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (unknown_attributes</div><div class='add'>+	    || (bg0 != (int)GET_BG(Current_Fgbg)))</div><div class='add'>+	  {</div><div class='add'>+	     if (bg0 == SLSMG_COLOR_DEFAULT)</div><div class='add'>+	       tt_write_string (Default_Color_Bg_Str);</div><div class='add'>+	     else</div><div class='add'>+	       tt_printf (Color_Bg_Str, bg0, 0);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Current_Fgbg = fgbg;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int Video_Initialized;</div><div class='add'>+</div><div class='add'>+void SLtt_reverse_video (int color)</div><div class='add'>+{</div><div class='add'>+   SLtt_Char_Type fgbg;</div><div class='add'>+   char *esc;</div><div class='add'>+</div><div class='add'>+   if (Worthless_Highlight) return;</div><div class='add'>+   if ((color &lt; 0) || (color &gt;= JMAX_COLORS)) return;</div><div class='add'>+</div><div class='add'>+   if (Video_Initialized == 0)</div><div class='add'>+     {</div><div class='add'>+	if (color == JNORMAL_COLOR)</div><div class='add'>+	  {</div><div class='add'>+	     tt_write_string (Norm_Vid_Str);</div><div class='add'>+	  }</div><div class='add'>+	else tt_write_string (Rev_Vid_Str);</div><div class='add'>+	Current_Fgbg = 0xFFFFFFFFU;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (SLtt_Use_Ansi_Colors)</div><div class='add'>+     {</div><div class='add'>+	fgbg = Ansi_Color_Map[color].fgbg;</div><div class='add'>+	if ((esc = Ansi_Color_Map[color].custom_esc) != NULL)</div><div class='add'>+	  {</div><div class='add'>+	     if (fgbg != Current_Fgbg)</div><div class='add'>+	       {</div><div class='add'>+		  Current_Fgbg = fgbg;</div><div class='add'>+		  tt_write_string (esc);</div><div class='add'>+		  return;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   else fgbg = Ansi_Color_Map[color].mono;</div><div class='add'>+</div><div class='add'>+   if (fgbg == Current_Fgbg) return;</div><div class='add'>+   write_attributes (fgbg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_normal_video (void)</div><div class='add'>+{</div><div class='add'>+   SLtt_reverse_video(JNORMAL_COLOR);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_narrow_width (void)</div><div class='add'>+{</div><div class='add'>+   tt_write_string("\033[?3l");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_wide_width (void)</div><div class='add'>+{</div><div class='add'>+   tt_write_string("\033[?3h");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Highest bit represents the character set. */</div><div class='add'>+#define COLOR_MASK 0x7F00</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+static int bce_color_eqs (unsigned int a, unsigned int b)</div><div class='add'>+{</div><div class='add'>+   a = (a &amp; COLOR_MASK) &gt;&gt; 8;</div><div class='add'>+   b = (b &amp; COLOR_MASK) &gt;&gt; 8;</div><div class='add'>+   </div><div class='add'>+   if (a == b)</div><div class='add'>+     return 1;</div><div class='add'>+</div><div class='add'>+   if (SLtt_Use_Ansi_Colors == 0)</div><div class='add'>+     return Ansi_Color_Map[a].mono == Ansi_Color_Map[b].mono;</div><div class='add'>+   </div><div class='add'>+   if (Bce_Color_Offset == 0)</div><div class='add'>+     return Ansi_Color_Map[a].fgbg == Ansi_Color_Map[b].fgbg;</div><div class='add'>+   </div><div class='add'>+   /* If either are color 0, then we do not know what that means since the</div><div class='add'>+    * terminal does not support BCE */</div><div class='add'>+   if ((a == 0) || (b == 0))</div><div class='add'>+     return 0;</div><div class='add'>+     </div><div class='add'>+   return Ansi_Color_Map[a-1].fgbg == Ansi_Color_Map[b-1].fgbg;</div><div class='add'>+}</div><div class='add'>+#define COLOR_EQS(a,b) bce_color_eqs (a,b)</div><div class='add'>+#else</div><div class='add'>+# define COLOR_OF(x) (((unsigned int)(x) &amp; COLOR_MASK) &gt;&gt; 8)</div><div class='add'>+# define COLOR_EQS(a, b) \</div><div class='add'>+   (SLtt_Use_Ansi_Colors \</div><div class='add'>+    ? (Ansi_Color_Map[COLOR_OF(a)].fgbg == Ansi_Color_Map[COLOR_OF(b)].fgbg)\</div><div class='add'>+    :  (Ansi_Color_Map[COLOR_OF(a)].mono == Ansi_Color_Map[COLOR_OF(b)].mono))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define CHAR_EQS(a, b) (((a) == (b))\</div><div class='add'>+			|| ((((a) &amp; ~COLOR_MASK) == ((b) &amp; ~COLOR_MASK))\</div><div class='add'>+			    &amp;&amp; COLOR_EQS((a), (b))))</div><div class='add'>+</div><div class='add'>+/* The whole point of this routine is to prevent writing to the last column</div><div class='add'>+ * and last row on terminals with automatic margins.</div><div class='add'>+ */</div><div class='add'>+static void write_string_with_care (char *str)</div><div class='add'>+{</div><div class='add'>+   unsigned int len;</div><div class='add'>+</div><div class='add'>+   if (str == NULL) return;</div><div class='add'>+</div><div class='add'>+   len = strlen (str);</div><div class='add'>+   if (Automatic_Margins &amp;&amp; (Cursor_r + 1 == SLtt_Screen_Rows))</div><div class='add'>+     {</div><div class='add'>+	if (len + (unsigned int) Cursor_c &gt;= (unsigned int) SLtt_Screen_Cols)</div><div class='add'>+	  {</div><div class='add'>+	     /* For now, just do not write there.  Later, something more</div><div class='add'>+	      * sophisticated will be implemented.</div><div class='add'>+	      */</div><div class='add'>+	     if (SLtt_Screen_Cols &gt; Cursor_c)</div><div class='add'>+	       len = SLtt_Screen_Cols - Cursor_c - 1;</div><div class='add'>+	     else </div><div class='add'>+	       len = 0;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   tt_write (str, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void send_attr_str (SLsmg_Char_Type *s)</div><div class='add'>+{</div><div class='add'>+   unsigned char out[256], ch, *p;</div><div class='add'>+   register SLtt_Char_Type attr;</div><div class='add'>+   register SLsmg_Char_Type sh;</div><div class='add'>+   int color, last_color = -1;</div><div class='add'>+</div><div class='add'>+   p = out;</div><div class='add'>+   while (0 != (sh = *s++))</div><div class='add'>+     {</div><div class='add'>+	ch = sh &amp; 0xFF;</div><div class='add'>+	color = ((int) sh &amp; 0xFF00) &gt;&gt; 8;</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+	if (Bce_Color_Offset</div><div class='add'>+	    &amp;&amp; (color &gt;= Bce_Color_Offset))</div><div class='add'>+	  color -= Bce_Color_Offset;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+	if (color != last_color)</div><div class='add'>+	  {</div><div class='add'>+	     if (SLtt_Use_Ansi_Colors) attr = Ansi_Color_Map[color &amp; 0x7F].fgbg;</div><div class='add'>+	     else attr = Ansi_Color_Map[color &amp; 0x7F].mono;</div><div class='add'>+</div><div class='add'>+	     if (sh &amp; 0x8000) /* alternate char set */</div><div class='add'>+	       {</div><div class='add'>+		  if (SLtt_Use_Blink_For_ACS)</div><div class='add'>+		    {</div><div class='add'>+		       if (SLtt_Blink_Mode) attr |= SLTT_BLINK_MASK;</div><div class='add'>+		    }</div><div class='add'>+		  else attr |= SLTT_ALTC_MASK;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     if (attr != Current_Fgbg)</div><div class='add'>+	       {</div><div class='add'>+		  if ((ch != ' ') ||</div><div class='add'>+		      /* it is a space so only consider it different if it</div><div class='add'>+		       * has different attributes.</div><div class='add'>+		       */</div><div class='add'>+		      (attr &amp; BGALL_MASK) != (Current_Fgbg &amp; BGALL_MASK))</div><div class='add'>+		    {</div><div class='add'>+		       if (p != out)</div><div class='add'>+			 {</div><div class='add'>+			    *p = 0;</div><div class='add'>+			    write_string_with_care ((char *) out);</div><div class='add'>+			    Cursor_c += (int) (p - out);</div><div class='add'>+			    p = out;</div><div class='add'>+			 }</div><div class='add'>+</div><div class='add'>+		       if (SLtt_Use_Ansi_Colors &amp;&amp; (NULL != Ansi_Color_Map[color &amp; 0x7F].custom_esc))</div><div class='add'>+			 {</div><div class='add'>+			    tt_write_string (Ansi_Color_Map[color &amp; 0x7F].custom_esc);</div><div class='add'>+			    /* Just in case the custom escape sequence screwed up</div><div class='add'>+			     * the alt character set state...</div><div class='add'>+			     */</div><div class='add'>+	                    if ((attr &amp; SLTT_ALTC_MASK) != (Current_Fgbg &amp; SLTT_ALTC_MASK))</div><div class='add'>+			      SLtt_set_alt_char_set ((int) (attr &amp; SLTT_ALTC_MASK));</div><div class='add'>+			    Current_Fgbg = attr;</div><div class='add'>+			 }</div><div class='add'>+		       else write_attributes (attr);</div><div class='add'>+</div><div class='add'>+		       last_color = color;</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	*p++ = ch;</div><div class='add'>+     }</div><div class='add'>+   *p = 0;</div><div class='add'>+   if (p != out) write_string_with_care ((char *) out);</div><div class='add'>+   Cursor_c += (int) (p - out);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void forward_cursor (unsigned int n, int row)</div><div class='add'>+{</div><div class='add'>+   char buf [1024];</div><div class='add'>+</div><div class='add'>+   if (n &lt;= 4)</div><div class='add'>+     {</div><div class='add'>+	SLtt_normal_video ();</div><div class='add'>+	SLMEMSET (buf, ' ', n);</div><div class='add'>+	buf[n] = 0;</div><div class='add'>+	write_string_with_care (buf);</div><div class='add'>+	Cursor_c += n;</div><div class='add'>+     }</div><div class='add'>+   else if (Curs_F_Str != NULL)</div><div class='add'>+     {</div><div class='add'>+	Cursor_c += n;</div><div class='add'>+	n = tt_sprintf(buf, Curs_F_Str, (int) n, 0);</div><div class='add'>+	tt_write(buf, n);</div><div class='add'>+     }</div><div class='add'>+   else SLtt_goto_rc (row, (int) (Cursor_c + n));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+void SLtt_smart_puts(SLsmg_Char_Type *neww, SLsmg_Char_Type *oldd, int len, int row)</div><div class='add'>+{</div><div class='add'>+   register SLsmg_Char_Type *p, *q, *qmax, *pmax, *buf;</div><div class='add'>+   SLsmg_Char_Type buffer[256];</div><div class='add'>+   unsigned int n_spaces;</div><div class='add'>+   SLsmg_Char_Type *space_match, *last_buffered_match;</div><div class='add'>+#ifdef HP_GLITCH_CODE</div><div class='add'>+   int handle_hp_glitch = 0;</div><div class='add'>+#endif</div><div class='add'>+   SLsmg_Char_Type space_char;</div><div class='add'>+#define SLTT_USE_INSERT_HACK 1</div><div class='add'>+#if SLTT_USE_INSERT_HACK</div><div class='add'>+   SLsmg_Char_Type insert_hack_prev = 0;</div><div class='add'>+   SLsmg_Char_Type insert_hack_char = 0;</div><div class='add'>+</div><div class='add'>+   if ((row + 1 == SLtt_Screen_Rows)</div><div class='add'>+       &amp;&amp; (len == SLtt_Screen_Cols)</div><div class='add'>+       &amp;&amp; (len &gt; 1)</div><div class='add'>+       &amp;&amp; (SLtt_Term_Cannot_Insert == 0)</div><div class='add'>+       &amp;&amp; Automatic_Margins)</div><div class='add'>+     {</div><div class='add'>+	insert_hack_char = neww[len-1];</div><div class='add'>+	if (oldd[len-1] == insert_hack_char)</div><div class='add'>+	  insert_hack_char = 0;</div><div class='add'>+	else </div><div class='add'>+	  insert_hack_prev = neww[len-2];</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+     </div><div class='add'>+   q = oldd; p = neww;</div><div class='add'>+   qmax = oldd + len;</div><div class='add'>+   pmax = p + len;</div><div class='add'>+</div><div class='add'>+   /* Find out where to begin --- while they match, we are ok */</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	if (q == qmax) return;</div><div class='add'>+#if SLANG_HAS_KANJI_SUPPORT</div><div class='add'>+	if (*p &amp; 0x80)</div><div class='add'>+	  { /* new is kanji */</div><div class='add'>+	     if ((*q &amp; 0x80) &amp;&amp; ((q + 1) &lt; qmax))</div><div class='add'>+	       { /* old is also kanji */</div><div class='add'>+		  if (((0xFF &amp; *q) != (0xFF &amp; *p))</div><div class='add'>+		      || ((0xFF &amp; q[1]) != (0xFF &amp; p[1])))</div><div class='add'>+		    break; /* both kanji, but not match */</div><div class='add'>+</div><div class='add'>+		  else</div><div class='add'>+		    { /* kanji match ! */</div><div class='add'>+		       if (!COLOR_EQS(*q, *p)) break;</div><div class='add'>+		       q++; p++;</div><div class='add'>+		       if (!COLOR_EQS(*q, *p)) break;</div><div class='add'>+		       /* really match! */</div><div class='add'>+		       q++; p++;</div><div class='add'>+		       continue;</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+	     else break; /* old is not kanji */</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  { /* new is not kanji */</div><div class='add'>+	     if (*q &amp; 0x80) break; /* old is kanji */</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	if (!CHAR_EQS(*q, *p)) break;</div><div class='add'>+	q++; p++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#ifdef HP_GLITCH_CODE</div><div class='add'>+   if (Has_HP_Glitch)</div><div class='add'>+     {</div><div class='add'>+	SLsmg_Char_Type *qq = q;</div><div class='add'>+</div><div class='add'>+	SLtt_goto_rc (row, (int) (p - neww));</div><div class='add'>+</div><div class='add'>+	while (qq &lt; qmax)</div><div class='add'>+	  {</div><div class='add'>+	     if (*qq &amp; 0xFF00)</div><div class='add'>+	       {</div><div class='add'>+		  SLtt_normal_video ();</div><div class='add'>+		  SLtt_del_eol ();</div><div class='add'>+		  qmax = q;</div><div class='add'>+		  handle_hp_glitch = 1;</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	     qq++;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   /* Find where the last non-blank character on old/new screen is */</div><div class='add'>+</div><div class='add'>+   space_char = ' ';</div><div class='add'>+   if ((*(pmax-1) &amp; 0xFF) == ' ')</div><div class='add'>+     {</div><div class='add'>+	/* If we get here, then we can erase to the end of the line to create</div><div class='add'>+	 * the final space.  However, this will only work _if_ erasing will </div><div class='add'>+	 * get us the correct color.  If the terminal supports BCE, then this</div><div class='add'>+	 * is easy.  If it does not, then we can only perform this operation</div><div class='add'>+	 * if the color is known via something like COLORFGBG.  For now, </div><div class='add'>+	 * I just will not perform the optimization for such terminals.</div><div class='add'>+	 */</div><div class='add'>+	if ((Can_Background_Color_Erase)</div><div class='add'>+	    &amp;&amp; SLtt_Use_Ansi_Colors)</div><div class='add'>+	  space_char = *(pmax - 1);</div><div class='add'>+</div><div class='add'>+	while (pmax &gt; p)</div><div class='add'>+	  {</div><div class='add'>+	     pmax--;</div><div class='add'>+	     if (!CHAR_EQS(*pmax, space_char))</div><div class='add'>+	       {</div><div class='add'>+		  pmax++;</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (qmax &gt; q)</div><div class='add'>+     {</div><div class='add'>+	qmax--;</div><div class='add'>+	if (!CHAR_EQS(*qmax, space_char))</div><div class='add'>+	  {</div><div class='add'>+	     qmax++;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   last_buffered_match = buf = buffer;		       /* buffer is empty */</div><div class='add'>+</div><div class='add'>+#ifdef HP_GLITCH_CODE</div><div class='add'>+   if (handle_hp_glitch)</div><div class='add'>+     {</div><div class='add'>+	while (p &lt; pmax)</div><div class='add'>+	  {</div><div class='add'>+	     *buf++ = *p++;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HP_GLITCH_CODE</div><div class='add'>+   if (Has_HP_Glitch == 0)</div><div class='add'>+     {</div><div class='add'>+#endif</div><div class='add'>+	/* Try use use erase to bol if possible */</div><div class='add'>+	if ((Del_Bol_Str != NULL) &amp;&amp; ((*neww &amp; 0xFF) == 32))</div><div class='add'>+	  {</div><div class='add'>+	     SLsmg_Char_Type *p1;</div><div class='add'>+	     SLsmg_Char_Type blank;</div><div class='add'>+</div><div class='add'>+	     p1 = neww;</div><div class='add'>+	     if ((Can_Background_Color_Erase)</div><div class='add'>+		 &amp;&amp; SLtt_Use_Ansi_Colors)</div><div class='add'>+	       blank = *p1;</div><div class='add'>+	     /* black+white attributes do not support bce */</div><div class='add'>+	     else</div><div class='add'>+	       blank = 32;</div><div class='add'>+</div><div class='add'>+	     while ((p1 &lt; pmax) &amp;&amp; (CHAR_EQS (*p1, blank)))</div><div class='add'>+	       p1++;</div><div class='add'>+</div><div class='add'>+	     /* Is this optimization worth it?  Assume Del_Bol_Str is ESC [ 1 K</div><div class='add'>+	      * It costs 4 chars + the space needed to properly position the </div><div class='add'>+	      * cursor, e.g., ESC [ 10;10H. So, it costs at least 13 characters.</div><div class='add'>+	      */</div><div class='add'>+	     if ((p1 &gt; neww + 13) </div><div class='add'>+		 &amp;&amp; (p1 &gt;= p)</div><div class='add'>+		 /* Avoid erasing from the end of the line */</div><div class='add'>+		 &amp;&amp; ((p1 != pmax) || (pmax &lt; neww + len)))</div><div class='add'>+	       {</div><div class='add'>+		  int ofs = (int) (p1 - neww);</div><div class='add'>+		  q = oldd + ofs;</div><div class='add'>+		  p = p1;</div><div class='add'>+		  SLtt_goto_rc (row, ofs - 1);</div><div class='add'>+		  SLtt_reverse_video (blank &gt;&gt; 8);</div><div class='add'>+		  tt_write_string (Del_Bol_Str);</div><div class='add'>+		  tt_write (" ", 1);</div><div class='add'>+		  Cursor_c += 1;</div><div class='add'>+	       }</div><div class='add'>+	     else</div><div class='add'>+	       SLtt_goto_rc (row, (int) (p - neww));</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  SLtt_goto_rc (row, (int) (p - neww));</div><div class='add'>+#ifdef HP_GLITCH_CODE</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   </div><div class='add'>+   </div><div class='add'>+   /* loop using overwrite then skip algorithm until done */</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	/* while they do not match and we do not hit a space, buffer them up */</div><div class='add'>+	n_spaces = 0;</div><div class='add'>+	while (p &lt; pmax)</div><div class='add'>+	  {</div><div class='add'>+	     if (CHAR_EQS(*q, 32) &amp;&amp; CHAR_EQS(*p, 32))</div><div class='add'>+	       {</div><div class='add'>+		  /* If *q is not a space, we would have to overwrite it.</div><div class='add'>+		   * However, if *q is a space, then while *p is also one,</div><div class='add'>+		   * we only need to skip over the blank field.</div><div class='add'>+		   */</div><div class='add'>+		  space_match = p;</div><div class='add'>+		  p++; q++;</div><div class='add'>+		  while ((p &lt; pmax)</div><div class='add'>+			 &amp;&amp; CHAR_EQS(*q, 32)</div><div class='add'>+			 &amp;&amp; CHAR_EQS(*p, 32))</div><div class='add'>+		    {</div><div class='add'>+		       p++;</div><div class='add'>+		       q++;</div><div class='add'>+		    }</div><div class='add'>+		  n_spaces = (unsigned int) (p - space_match);</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+#if SLANG_HAS_KANJI_SUPPORT</div><div class='add'>+	     if ((*p &amp; 0x80) &amp;&amp; ((p + 1) &lt; pmax))</div><div class='add'>+	       { /* new is kanji */</div><div class='add'>+		  if (*q &amp; 0x80)</div><div class='add'>+		    { /* old is also kanji */</div><div class='add'>+		       if (((0xFF &amp; *q) != (0xFF &amp; *p))</div><div class='add'>+			   || ((0xFF &amp; q[1]) != (0xFF &amp; p[1])))</div><div class='add'>+			 {</div><div class='add'>+			    /* both kanji, but not match */</div><div class='add'>+			    *buf++ = *p++;</div><div class='add'>+			    *buf++ = *p++;</div><div class='add'>+			    q += 2;</div><div class='add'>+			    continue;</div><div class='add'>+			 }</div><div class='add'>+		       else</div><div class='add'>+			 { /* kanji match ? */</div><div class='add'>+			    if (!COLOR_EQS(*q, *p) || !COLOR_EQS(*(q+1), *(p+1)))</div><div class='add'>+			      {</div><div class='add'>+				 /* code is match, but color is diff */</div><div class='add'>+				 *buf++ = *p++;</div><div class='add'>+				 *buf++ = *p++;</div><div class='add'>+				 q += 2;</div><div class='add'>+				 continue;</div><div class='add'>+			      }</div><div class='add'>+			    /* really match ! */</div><div class='add'>+			    break;</div><div class='add'>+			 }</div><div class='add'>+		    }</div><div class='add'>+ 		  else</div><div class='add'>+		    { /* old is not kanji */</div><div class='add'>+		       *buf++ = *p++;</div><div class='add'>+		       *buf++ = *p++;</div><div class='add'>+		       q += 2;</div><div class='add'>+		       continue;</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+	     else</div><div class='add'>+	       { /* new is not kanji */</div><div class='add'>+ 		  if (*q &amp; 0x80)</div><div class='add'>+		    { /* old is kanji */</div><div class='add'>+		       *buf++ = *p++;</div><div class='add'>+		       q++;</div><div class='add'>+		       continue;</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+	     if (CHAR_EQS(*q, *p)) break;</div><div class='add'>+	     *buf++ = *p++;</div><div class='add'>+	     q++;</div><div class='add'>+	  }</div><div class='add'>+	*buf = 0;</div><div class='add'>+</div><div class='add'>+	if (buf != buffer) send_attr_str (buffer);</div><div class='add'>+	buf = buffer;</div><div class='add'>+</div><div class='add'>+	if (n_spaces </div><div class='add'>+	    &amp;&amp; ((p &lt; pmax) 	       /* erase to eol will achieve this effect*/</div><div class='add'>+		|| (space_char != 32)))/* unless space_char is not a simple space */</div><div class='add'>+	  {</div><div class='add'>+	     forward_cursor (n_spaces, row);</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* Now we overwrote what we could and cursor is placed at position</div><div class='add'>+	 * of a possible match of new and old.  If this is the case, skip</div><div class='add'>+	 * some more.</div><div class='add'>+	 */</div><div class='add'>+#if !SLANG_HAS_KANJI_SUPPORT</div><div class='add'>+	while ((p &lt; pmax) &amp;&amp; CHAR_EQS(*p, *q))</div><div class='add'>+	  {</div><div class='add'>+	     *buf++ = *p++;</div><div class='add'>+	     q++;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	/* Kanji */</div><div class='add'>+	while (p &lt; pmax)</div><div class='add'>+	  {</div><div class='add'>+	     if ((*p &amp; 0x80) &amp;&amp; ((p + 1) &lt; pmax))</div><div class='add'>+	       { /* new is kanji */</div><div class='add'>+		  if (*q &amp; 0x80)</div><div class='add'>+		    { /* old is also kanji */</div><div class='add'>+		       if (((0xFF &amp; *q) == (0xFF &amp; *p))</div><div class='add'>+			   &amp;&amp; ((0xFF &amp; q[1]) == (0xFF &amp; p[1])))</div><div class='add'>+			 {</div><div class='add'>+			    /* kanji match ? */</div><div class='add'>+			    if (!COLOR_EQS(*q, *p)</div><div class='add'>+				|| !COLOR_EQS(q[1], p[1]))</div><div class='add'>+			      break;</div><div class='add'>+</div><div class='add'>+			    *buf++ = *p++;</div><div class='add'>+			    q++;</div><div class='add'>+			    if (p &gt;= pmax)</div><div class='add'>+			      {</div><div class='add'>+				 *buf++ = 32;</div><div class='add'>+				 p++;</div><div class='add'>+				 break;</div><div class='add'>+			      }</div><div class='add'>+			    else</div><div class='add'>+			      {</div><div class='add'>+				 *buf++ = *p++;</div><div class='add'>+				 q++;</div><div class='add'>+				 continue;</div><div class='add'>+			      }</div><div class='add'>+			 }</div><div class='add'>+		       else break; /* both kanji, but not match */</div><div class='add'>+		    }</div><div class='add'>+		  else break; /* old is not kanji */</div><div class='add'>+	       }</div><div class='add'>+	     else</div><div class='add'>+	       {  /* new is not kanji */</div><div class='add'>+		  if (*q &amp; 0x80) break; /* old is kanji */</div><div class='add'>+		  if (!CHAR_EQS(*q, *p)) break;</div><div class='add'>+		  *buf++ = *p++;</div><div class='add'>+		  q++;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	last_buffered_match = buf;</div><div class='add'>+	if (p &gt;= pmax) break;</div><div class='add'>+</div><div class='add'>+	/* jump to new position is it is greater than 5 otherwise</div><div class='add'>+	 * let it sit in the buffer and output it later.</div><div class='add'>+	 */</div><div class='add'>+	if ((int) (buf - buffer) &gt;= 5)</div><div class='add'>+	  {</div><div class='add'>+	     forward_cursor ((unsigned int) (buf - buffer), row);</div><div class='add'>+	     last_buffered_match = buf = buffer;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (buf != buffer)</div><div class='add'>+     {</div><div class='add'>+	if (q &lt; qmax)</div><div class='add'>+	  {</div><div class='add'>+	     if ((buf == last_buffered_match)</div><div class='add'>+		 &amp;&amp; ((int) (buf - buffer) &gt;= 5))</div><div class='add'>+	       {</div><div class='add'>+		  forward_cursor ((unsigned int) (buf - buffer), row);</div><div class='add'>+	       }</div><div class='add'>+	     else</div><div class='add'>+	       {</div><div class='add'>+		  *buf = 0;</div><div class='add'>+		  send_attr_str (buffer);</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (q &lt; qmax) </div><div class='add'>+     {</div><div class='add'>+	SLtt_reverse_video (space_char &gt;&gt; 8);</div><div class='add'>+	del_eol ();</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+#if SLTT_USE_INSERT_HACK</div><div class='add'>+   else if (insert_hack_char)</div><div class='add'>+     {</div><div class='add'>+	SLtt_goto_rc (SLtt_Screen_Rows-1, SLtt_Screen_Cols-2);</div><div class='add'>+	buffer[0] = insert_hack_char;</div><div class='add'>+	buffer[1] = 0;</div><div class='add'>+	send_attr_str (buffer);</div><div class='add'>+	SLtt_goto_rc (SLtt_Screen_Rows-1, SLtt_Screen_Cols-2);</div><div class='add'>+	buffer[0] = insert_hack_prev;</div><div class='add'>+	SLtt_begin_insert ();</div><div class='add'>+	send_attr_str (buffer);</div><div class='add'>+	SLtt_end_insert ();</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (Automatic_Margins &amp;&amp; (Cursor_c + 1 &gt;= SLtt_Screen_Cols)) Cursor_Set = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void get_color_info (void)</div><div class='add'>+{</div><div class='add'>+   char *fg, *bg;</div><div class='add'>+</div><div class='add'>+   /* Allow easy mechanism to override inadequate termcap/terminfo files. */</div><div class='add'>+   if (SLtt_Use_Ansi_Colors == 0)</div><div class='add'>+     SLtt_Use_Ansi_Colors = (NULL != getenv ("COLORTERM"));</div><div class='add'>+</div><div class='add'>+   if (SLtt_Use_Ansi_Colors)</div><div class='add'>+     Is_Color_Terminal = 1;</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+   if (Can_Background_Color_Erase == 0)</div><div class='add'>+     Can_Background_Color_Erase = (NULL != getenv ("COLORTERM_BCE"));</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (-1 == get_default_colors (&amp;fg, &amp;bg))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   /* Check to see if application has already set them. */</div><div class='add'>+   if (Color_0_Modified)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   SLtt_set_color (0, NULL, fg, bg);</div><div class='add'>+   SLtt_set_color (1, NULL, bg, fg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* termcap stuff */</div><div class='add'>+</div><div class='add'>+#ifdef __unix__</div><div class='add'>+</div><div class='add'>+static int Termcap_Initalized = 0;</div><div class='add'>+</div><div class='add'>+#ifdef USE_TERMCAP</div><div class='add'>+/* Termcap based system */</div><div class='add'>+static char Termcap_Buf[4096];</div><div class='add'>+static char Termcap_String_Buf[4096];</div><div class='add'>+static char *Termcap_String_Ptr;</div><div class='add'>+extern char *tgetstr(char *, char **);</div><div class='add'>+extern int tgetent(char *, char *);</div><div class='add'>+extern int tgetnum(char *);</div><div class='add'>+extern int tgetflag(char *);</div><div class='add'>+#else</div><div class='add'>+/* Terminfo */</div><div class='add'>+static SLterminfo_Type *Terminfo;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define TGETFLAG(x) (SLtt_tgetflag(x) &gt; 0)</div><div class='add'>+</div><div class='add'>+static char *fixup_tgetstr (char *what)</div><div class='add'>+{</div><div class='add'>+   register char *w, *w1;</div><div class='add'>+   char *wsave;</div><div class='add'>+   </div><div class='add'>+   if (what == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   /* Check for AIX brain-damage */</div><div class='add'>+   if (*what == '@')</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   /* lose pad info --- with today's technology, term is a loser if</div><div class='add'>+    it is really needed */</div><div class='add'>+   while ((*what == '.') ||</div><div class='add'>+	  ((*what &gt;= '0') &amp;&amp; (*what &lt;= '9'))) what++;</div><div class='add'>+   if (*what == '*') what++;</div><div class='add'>+   </div><div class='add'>+   /* lose terminfo padding--- looks like $&lt;...&gt; */</div><div class='add'>+   w = what;</div><div class='add'>+   while (*w) if ((*w++ == '$') &amp;&amp; (*w == '&lt;'))</div><div class='add'>+     {</div><div class='add'>+	w1 = w - 1;</div><div class='add'>+	while (*w &amp;&amp; (*w != '&gt;')) w++;</div><div class='add'>+	if (*w == 0) break;</div><div class='add'>+	w++;</div><div class='add'>+	wsave = w1;</div><div class='add'>+	while ((*w1++ = *w++) != 0);</div><div class='add'>+	w = wsave;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (*what == 0) what = NULL;</div><div class='add'>+   return what;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLtt_tgetstr (char *s)</div><div class='add'>+{</div><div class='add'>+   if (Termcap_Initalized == 0)</div><div class='add'>+     return NULL;</div><div class='add'>+   </div><div class='add'>+#ifdef USE_TERMCAP</div><div class='add'>+   s = tgetstr (s, &amp;Termcap_String_Ptr);</div><div class='add'>+#else</div><div class='add'>+   s = _SLtt_tigetstr (Terminfo, s);</div><div class='add'>+#endif</div><div class='add'>+   return fixup_tgetstr (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_tgetnum (char *s)</div><div class='add'>+{</div><div class='add'>+   if (Termcap_Initalized == 0)</div><div class='add'>+     return -1;</div><div class='add'>+#ifdef USE_TERMCAP</div><div class='add'>+   return tgetnum (s);</div><div class='add'>+#else</div><div class='add'>+   return _SLtt_tigetnum (Terminfo, s);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_tgetflag (char *s)</div><div class='add'>+{</div><div class='add'>+   if (Termcap_Initalized == 0)</div><div class='add'>+     return -1;</div><div class='add'>+#ifdef USE_TERMCAP</div><div class='add'>+   return tgetflag (s);</div><div class='add'>+#else</div><div class='add'>+   return _SLtt_tigetflag (Terminfo, s);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int Vt100_Like = 0;</div><div class='add'>+</div><div class='add'>+void SLtt_get_terminfo (void)</div><div class='add'>+{</div><div class='add'>+   char *term;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   term = getenv ("TERM");</div><div class='add'>+   if (term == NULL)</div><div class='add'>+     SLang_exit_error("TERM environment variable needs set.");</div><div class='add'>+</div><div class='add'>+   if (0 == (status = SLtt_initialize (term)))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (status == -1)</div><div class='add'>+     {</div><div class='add'>+	SLang_exit_error ("Unknown terminal: %s\n\</div><div class='add'>+Check the TERM environment variable.\n\</div><div class='add'>+Also make sure that the terminal is defined in the terminfo database.\n\</div><div class='add'>+Alternatively, set the TERMCAP environment variable to the desired\n\</div><div class='add'>+termcap entry.",</div><div class='add'>+			  term);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (status == -2)</div><div class='add'>+     {</div><div class='add'>+	SLang_exit_error ("\</div><div class='add'>+Your terminal lacks the ability to clear the screen or position the cursor.\n");</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Returns 0 if all goes well, -1 if terminal capabilities cannot be deduced,</div><div class='add'>+ * or -2 if terminal cannot position the cursor.</div><div class='add'>+ */</div><div class='add'>+int SLtt_initialize (char *term)</div><div class='add'>+{</div><div class='add'>+   char *t, ch;</div><div class='add'>+   int is_xterm;</div><div class='add'>+   int almost_vtxxx;</div><div class='add'>+</div><div class='add'>+   if (SLang_TT_Write_FD == -1)</div><div class='add'>+     {</div><div class='add'>+	/* Apparantly, this cannot fail according to the man pages. */</div><div class='add'>+	SLang_TT_Write_FD = fileno (stdout);</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (term == NULL)</div><div class='add'>+     {</div><div class='add'>+	term = getenv ("TERM");</div><div class='add'>+	if (term == NULL)</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Linux_Console = (!strncmp (term, "linux", 5)</div><div class='add'>+# ifdef linux</div><div class='add'>+		    || !strncmp(term, "con", 3)</div><div class='add'>+# endif</div><div class='add'>+		    );</div><div class='add'>+</div><div class='add'>+   t = term;</div><div class='add'>+</div><div class='add'>+   if (strcmp(t, "vt52") &amp;&amp; (*t++ == 'v') &amp;&amp; (*t++ == 't')</div><div class='add'>+       &amp;&amp; (ch = *t, (ch &gt;= '1') &amp;&amp; (ch &lt;= '9'))) Vt100_Like = 1;</div><div class='add'>+</div><div class='add'>+   is_xterm = ((0 == strncmp (term, "xterm", 5))</div><div class='add'>+	       || (0 == strncmp (term, "rxvt", 4))</div><div class='add'>+	       || (0 == strncmp (term, "Eterm", 5)));</div><div class='add'>+</div><div class='add'>+   almost_vtxxx = (Vt100_Like</div><div class='add'>+		   || Linux_Console</div><div class='add'>+		   || is_xterm</div><div class='add'>+		   || !strcmp (term, "screen"));</div><div class='add'>+</div><div class='add'>+# ifndef USE_TERMCAP</div><div class='add'>+   if (NULL == (Terminfo = _SLtt_tigetent (term)))</div><div class='add'>+     {</div><div class='add'>+	if (almost_vtxxx) /* Special cases. */</div><div class='add'>+	  {</div><div class='add'>+	     int vt102 = 1;</div><div class='add'>+	     if (!strcmp (term, "vt100")) vt102 = 0;</div><div class='add'>+	     get_color_info ();</div><div class='add'>+   	     SLtt_set_term_vtxxx (&amp;vt102);</div><div class='add'>+	     return 0;</div><div class='add'>+	  }</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+# else				       /* USE_TERMCAP */</div><div class='add'>+   if (1 != tgetent(Termcap_Buf, term))</div><div class='add'>+     return -1;</div><div class='add'>+   Termcap_String_Ptr = Termcap_String_Buf;</div><div class='add'>+# endif				       /* NOT USE_TERMCAP */</div><div class='add'>+</div><div class='add'>+   Termcap_Initalized = 1;</div><div class='add'>+</div><div class='add'>+   Cls_Str = SLtt_tgetstr ("cl");</div><div class='add'>+   Curs_Pos_Str = SLtt_tgetstr ("cm");</div><div class='add'>+</div><div class='add'>+   if ((NULL == (Ins_Mode_Str = SLtt_tgetstr("im")))</div><div class='add'>+       || ( NULL == (Eins_Mode_Str = SLtt_tgetstr("ei")))</div><div class='add'>+       || ( NULL == (Del_Char_Str = SLtt_tgetstr("dc"))))</div><div class='add'>+     SLtt_Term_Cannot_Insert = 1;</div><div class='add'>+</div><div class='add'>+   Visible_Bell_Str = SLtt_tgetstr ("vb");</div><div class='add'>+   Curs_Up_Str = SLtt_tgetstr ("up");</div><div class='add'>+   Rev_Scroll_Str = SLtt_tgetstr("sr");</div><div class='add'>+   Del_N_Lines_Str = SLtt_tgetstr("DL");</div><div class='add'>+   Add_N_Lines_Str = SLtt_tgetstr("AL");</div><div class='add'>+</div><div class='add'>+   /* Actually these are used to initialize terminals that use cursor</div><div class='add'>+    * addressing.  Hard to believe.</div><div class='add'>+    */</div><div class='add'>+   Term_Init_Str = SLtt_tgetstr ("ti");</div><div class='add'>+   Term_Reset_Str = SLtt_tgetstr ("te");</div><div class='add'>+</div><div class='add'>+   /* If I do this for vtxxx terminals, arrow keys start sending ESC O A,</div><div class='add'>+    * which I do not want.  This is mainly for HP terminals.</div><div class='add'>+    */</div><div class='add'>+   if ((almost_vtxxx == 0) || SLtt_Force_Keypad_Init)</div><div class='add'>+     {</div><div class='add'>+	Keypad_Init_Str = SLtt_tgetstr ("ks");</div><div class='add'>+	Keypad_Reset_Str = SLtt_tgetstr ("ke");</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Make up for defective termcap/terminfo databases */</div><div class='add'>+   if ((Vt100_Like &amp;&amp; (term[2] != '1'))</div><div class='add'>+       || Linux_Console</div><div class='add'>+       || is_xterm</div><div class='add'>+       )</div><div class='add'>+     {</div><div class='add'>+	if (Del_N_Lines_Str == NULL) Del_N_Lines_Str = "\033[%dM";</div><div class='add'>+	if (Add_N_Lines_Str == NULL) Add_N_Lines_Str = "\033[%dL";</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Scroll_R_Str = SLtt_tgetstr("cs");</div><div class='add'>+</div><div class='add'>+   SLtt_get_screen_size ();</div><div class='add'>+</div><div class='add'>+   if ((Scroll_R_Str == NULL)</div><div class='add'>+       || (((NULL == Del_N_Lines_Str) || (NULL == Add_N_Lines_Str))</div><div class='add'>+	   &amp;&amp; (NULL == Rev_Scroll_Str)))</div><div class='add'>+     {</div><div class='add'>+	if (is_xterm</div><div class='add'>+	    || Linux_Console</div><div class='add'>+	    )</div><div class='add'>+	  {</div><div class='add'>+	     /* Defective termcap mode!!!! */</div><div class='add'>+	     SLtt_set_term_vtxxx (NULL);</div><div class='add'>+	  }</div><div class='add'>+	else SLtt_Term_Cannot_Scroll = 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Del_Eol_Str = SLtt_tgetstr("ce");</div><div class='add'>+   Del_Bol_Str = SLtt_tgetstr("cb");</div><div class='add'>+   if (is_xterm &amp;&amp; (Del_Bol_Str == NULL))</div><div class='add'>+     Del_Bol_Str = "\033[1K";</div><div class='add'>+   if (is_xterm &amp;&amp; (Del_Eol_Str == NULL))</div><div class='add'>+     Del_Bol_Str = "\033[K";</div><div class='add'>+</div><div class='add'>+   Rev_Vid_Str = SLtt_tgetstr("mr");</div><div class='add'>+   if (Rev_Vid_Str == NULL) Rev_Vid_Str = SLtt_tgetstr("so");</div><div class='add'>+</div><div class='add'>+   Bold_Vid_Str = SLtt_tgetstr("md");</div><div class='add'>+</div><div class='add'>+   /* Although xterm cannot blink, it does display the blinking characters</div><div class='add'>+    * as bold ones.  Some Rxvt will display the background as high intensity.</div><div class='add'>+    */</div><div class='add'>+   if ((NULL == (Blink_Vid_Str = SLtt_tgetstr("mb")))</div><div class='add'>+       &amp;&amp; is_xterm)</div><div class='add'>+     Blink_Vid_Str = "\033[5m";</div><div class='add'>+</div><div class='add'>+   UnderLine_Vid_Str = SLtt_tgetstr("us");</div><div class='add'>+</div><div class='add'>+   Start_Alt_Chars_Str = SLtt_tgetstr ("as");   /* smacs */</div><div class='add'>+   End_Alt_Chars_Str = SLtt_tgetstr ("ae");   /* rmacs */</div><div class='add'>+   Enable_Alt_Char_Set = SLtt_tgetstr ("eA");   /* enacs */</div><div class='add'>+   SLtt_Graphics_Char_Pairs = SLtt_tgetstr ("ac");</div><div class='add'>+</div><div class='add'>+   if (NULL == SLtt_Graphics_Char_Pairs)</div><div class='add'>+     {</div><div class='add'>+	/* make up for defective termcap/terminfo */</div><div class='add'>+	if (Vt100_Like)</div><div class='add'>+	  {</div><div class='add'>+	     Start_Alt_Chars_Str = "\016";</div><div class='add'>+	     End_Alt_Chars_Str = "\017";</div><div class='add'>+	     Enable_Alt_Char_Set = "\033)0";</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+    /* aixterm added by willi */</div><div class='add'>+   if (is_xterm || !strncmp (term, "aixterm", 7))</div><div class='add'>+     {</div><div class='add'>+	Start_Alt_Chars_Str = "\016";</div><div class='add'>+	End_Alt_Chars_Str = "\017";</div><div class='add'>+	Enable_Alt_Char_Set = "\033(B\033)0";</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((SLtt_Graphics_Char_Pairs == NULL) &amp;&amp;</div><div class='add'>+       ((Start_Alt_Chars_Str == NULL) || (End_Alt_Chars_Str == NULL)))</div><div class='add'>+     {</div><div class='add'>+	SLtt_Has_Alt_Charset = 0;</div><div class='add'>+	Enable_Alt_Char_Set = NULL;</div><div class='add'>+     }</div><div class='add'>+   else SLtt_Has_Alt_Charset = 1;</div><div class='add'>+</div><div class='add'>+#ifdef AMIGA</div><div class='add'>+   Enable_Alt_Char_Set = Start_Alt_Chars_Str = End_Alt_Chars_Str = NULL;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   /* status line capabilities */</div><div class='add'>+   if ((SLtt_Has_Status_Line == -1)</div><div class='add'>+       &amp;&amp; (0 != (SLtt_Has_Status_Line = TGETFLAG ("hs"))))</div><div class='add'>+     {</div><div class='add'>+	Disable_Status_line_Str = SLtt_tgetstr ("ds");</div><div class='add'>+	Return_From_Status_Line_Str = SLtt_tgetstr ("fs");</div><div class='add'>+	Goto_Status_Line_Str = SLtt_tgetstr ("ts");</div><div class='add'>+	/* Status_Line_Esc_Ok = TGETFLAG("es"); */</div><div class='add'>+	Num_Status_Line_Columns = SLtt_tgetnum ("ws");</div><div class='add'>+	if (Num_Status_Line_Columns &lt; 0) Num_Status_Line_Columns = 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (Norm_Vid_Str = SLtt_tgetstr("me")))</div><div class='add'>+     {</div><div class='add'>+	Norm_Vid_Str = SLtt_tgetstr("se");</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Cursor_Invisible_Str = SLtt_tgetstr("vi");</div><div class='add'>+   Cursor_Visible_Str = SLtt_tgetstr("ve");</div><div class='add'>+</div><div class='add'>+   Curs_F_Str = SLtt_tgetstr("RI");</div><div class='add'>+</div><div class='add'>+# if 0</div><div class='add'>+   if (NULL != Curs_F_Str)</div><div class='add'>+     {</div><div class='add'>+	Len_Curs_F_Str = strlen(Curs_F_Str);</div><div class='add'>+     }</div><div class='add'>+   else Len_Curs_F_Str = strlen(Curs_Pos_Str);</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+   Automatic_Margins = TGETFLAG ("am");</div><div class='add'>+   /* No_Move_In_Standout = !TGETFLAG ("ms"); */</div><div class='add'>+# ifdef HP_GLITCH_CODE</div><div class='add'>+   Has_HP_Glitch = TGETFLAG ("xs");</div><div class='add'>+# else</div><div class='add'>+   Worthless_Highlight = TGETFLAG ("xs");</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+   if (Worthless_Highlight == 0)</div><div class='add'>+     {				       /* Magic cookie glitch */</div><div class='add'>+	Worthless_Highlight = (SLtt_tgetnum ("sg") &gt; 0);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (Worthless_Highlight)</div><div class='add'>+     SLtt_Has_Alt_Charset = 0;</div><div class='add'>+</div><div class='add'>+   Reset_Color_String = SLtt_tgetstr ("op");</div><div class='add'>+   Color_Fg_Str = SLtt_tgetstr ("AF"); /* ANSI setaf */</div><div class='add'>+   Color_Bg_Str = SLtt_tgetstr ("AB"); /* ANSI setbf */</div><div class='add'>+   if ((Color_Fg_Str == NULL) || (Color_Bg_Str == NULL))</div><div class='add'>+     {</div><div class='add'>+	Color_Fg_Str = SLtt_tgetstr ("Sf");   /* setf */</div><div class='add'>+	Color_Bg_Str = SLtt_tgetstr ("Sb");   /* setb */</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((Max_Terminfo_Colors = SLtt_tgetnum ("Co")) &lt; 0)</div><div class='add'>+     Max_Terminfo_Colors = 8;</div><div class='add'>+</div><div class='add'>+   if ((Color_Bg_Str != NULL) &amp;&amp; (Color_Fg_Str != NULL))</div><div class='add'>+     SLtt_Use_Ansi_Colors = 1;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+#if 0</div><div class='add'>+	Color_Fg_Str = "%?%p1%{7}%&gt;%t\033[1;3%p1%{8}%m%dm%e\033[3%p1%dm%;";</div><div class='add'>+	Color_Bg_Str = "%?%p1%{7}%&gt;%t\033[5;4%p1%{8}%m%dm%e\033[4%p1%dm%;";</div><div class='add'>+	Max_Terminfo_Colors = 16;</div><div class='add'>+#else</div><div class='add'>+	Color_Fg_Str = "\033[3%dm";</div><div class='add'>+	Color_Bg_Str = "\033[4%dm";</div><div class='add'>+	Max_Terminfo_Colors = 8;</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+   Can_Background_Color_Erase = TGETFLAG ("ut");   /* bce */</div><div class='add'>+   /* Modern xterms have the BCE capability as well as the linux console */</div><div class='add'>+   if (Can_Background_Color_Erase == 0)</div><div class='add'>+     {</div><div class='add'>+	Can_Background_Color_Erase = (Linux_Console</div><div class='add'>+# if SLTT_XTERM_ALWAYS_BCE</div><div class='add'>+				      || is_xterm</div><div class='add'>+# endif</div><div class='add'>+				      );</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   get_color_info ();</div><div class='add'>+</div><div class='add'>+  </div><div class='add'>+   if ((Cls_Str == NULL)</div><div class='add'>+       || (Curs_Pos_Str == NULL))</div><div class='add'>+     return -2;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+/* Unix */</div><div class='add'>+</div><div class='add'>+/* specific to vtxxx only */</div><div class='add'>+void SLtt_enable_cursor_keys (void)</div><div class='add'>+{</div><div class='add'>+#ifdef __unix__</div><div class='add'>+   if (Vt100_Like)</div><div class='add'>+#endif</div><div class='add'>+     tt_write_string("\033=\033[?1l");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+int SLtt_initialize (char *term)</div><div class='add'>+{</div><div class='add'>+   SLtt_get_terminfo ();</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_get_terminfo ()</div><div class='add'>+{</div><div class='add'>+   int zero = 0;</div><div class='add'>+</div><div class='add'>+   Color_Fg_Str = "\033[3%dm";</div><div class='add'>+   Color_Bg_Str = "\033[4%dm";</div><div class='add'>+   Max_Terminfo_Colors = 8;</div><div class='add'>+</div><div class='add'>+   get_color_info ();</div><div class='add'>+</div><div class='add'>+   SLtt_set_term_vtxxx(&amp;zero);</div><div class='add'>+   Start_Alt_Chars_Str = "\016";</div><div class='add'>+   End_Alt_Chars_Str = "\017";</div><div class='add'>+   SLtt_Has_Alt_Charset = 1;</div><div class='add'>+   SLtt_Graphics_Char_Pairs = "aaffgghhjjkkllmmnnooqqssttuuvvwwxx";</div><div class='add'>+   Enable_Alt_Char_Set = "\033(B\033)0";</div><div class='add'>+   SLtt_get_screen_size ();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* This sets term for vt102 terminals it parameter vt100 is 0.  If vt100</div><div class='add'>+ * is non-zero, set terminal appropriate for a only vt100</div><div class='add'>+ * (no add line capability). */</div><div class='add'>+</div><div class='add'>+void SLtt_set_term_vtxxx(int *vt100)</div><div class='add'>+{</div><div class='add'>+   Norm_Vid_Str = "\033[m";</div><div class='add'>+</div><div class='add'>+   Scroll_R_Str = "\033[%i%d;%dr";</div><div class='add'>+   Cls_Str = "\033[2J\033[H";</div><div class='add'>+   Rev_Vid_Str = "\033[7m";</div><div class='add'>+   Bold_Vid_Str = "\033[1m";</div><div class='add'>+   Blink_Vid_Str = "\033[5m";</div><div class='add'>+   UnderLine_Vid_Str = "\033[4m";</div><div class='add'>+   Del_Eol_Str = "\033[K";</div><div class='add'>+   Del_Bol_Str = "\033[1K";</div><div class='add'>+   Rev_Scroll_Str = "\033M";</div><div class='add'>+   Curs_F_Str = "\033[%dC";</div><div class='add'>+   /* Len_Curs_F_Str = 5; */</div><div class='add'>+   Curs_Pos_Str = "\033[%i%d;%dH";</div><div class='add'>+   if ((vt100 == NULL) || (*vt100 == 0))</div><div class='add'>+     {</div><div class='add'>+	Ins_Mode_Str = "\033[4h";</div><div class='add'>+	Eins_Mode_Str = "\033[4l";</div><div class='add'>+	Del_Char_Str =  "\033[P";</div><div class='add'>+	Del_N_Lines_Str = "\033[%dM";</div><div class='add'>+	Add_N_Lines_Str = "\033[%dL";</div><div class='add'>+	SLtt_Term_Cannot_Insert = 0;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	Del_N_Lines_Str = NULL;</div><div class='add'>+	Add_N_Lines_Str = NULL;</div><div class='add'>+	SLtt_Term_Cannot_Insert = 1;</div><div class='add'>+     }</div><div class='add'>+   SLtt_Term_Cannot_Scroll = 0;</div><div class='add'>+   /* No_Move_In_Standout = 0; */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_init_video (void)</div><div class='add'>+{</div><div class='add'>+   /*   send_string_to_term("\033[?6h"); */</div><div class='add'>+   /* relative origin mode */</div><div class='add'>+   tt_write_string (Term_Init_Str);</div><div class='add'>+   tt_write_string (Keypad_Init_Str);</div><div class='add'>+   SLtt_reset_scroll_region();</div><div class='add'>+   SLtt_end_insert();</div><div class='add'>+   tt_write_string (Enable_Alt_Char_Set);</div><div class='add'>+   Video_Initialized = 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_reset_video (void)</div><div class='add'>+{</div><div class='add'>+   SLtt_goto_rc (SLtt_Screen_Rows - 1, 0);</div><div class='add'>+   Cursor_Set = 0;</div><div class='add'>+   SLtt_normal_video ();	       /* MSKermit requires this  */</div><div class='add'>+   tt_write_string(Norm_Vid_Str);</div><div class='add'>+</div><div class='add'>+   Current_Fgbg = 0xFFFFFFFFU;</div><div class='add'>+   SLtt_set_alt_char_set (0);</div><div class='add'>+   if (SLtt_Use_Ansi_Colors)</div><div class='add'>+     {</div><div class='add'>+	if (Reset_Color_String == NULL)</div><div class='add'>+	  {</div><div class='add'>+	     SLtt_Char_Type attr;</div><div class='add'>+	     if (-1 != make_color_fgbg (NULL, NULL, &amp;attr))</div><div class='add'>+	       write_attributes (attr);</div><div class='add'>+	     else tt_write_string ("\033[0m\033[m");</div><div class='add'>+	  }</div><div class='add'>+	else tt_write_string (Reset_Color_String);</div><div class='add'>+	Current_Fgbg = 0xFFFFFFFFU;</div><div class='add'>+     }</div><div class='add'>+   SLtt_erase_line ();</div><div class='add'>+   tt_write_string (Keypad_Reset_Str);</div><div class='add'>+   tt_write_string (Term_Reset_Str);</div><div class='add'>+   SLtt_flush_output ();</div><div class='add'>+   Video_Initialized = 0;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_bold_video (void)</div><div class='add'>+{</div><div class='add'>+   tt_write_string (Bold_Vid_Str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_set_mouse_mode (int mode, int force)</div><div class='add'>+{</div><div class='add'>+   char *term;</div><div class='add'>+</div><div class='add'>+   if (force == 0)</div><div class='add'>+     {</div><div class='add'>+	if (NULL == (term = (char *) getenv("TERM"))) return -1;</div><div class='add'>+	if (strncmp ("xterm", term, 5))</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (mode)</div><div class='add'>+     tt_write_string ("\033[?9h");</div><div class='add'>+   else</div><div class='add'>+     tt_write_string ("\033[?9l");</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_disable_status_line (void)</div><div class='add'>+{</div><div class='add'>+   if (SLtt_Has_Status_Line &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	tt_write_string (Disable_Status_line_Str);</div><div class='add'>+	SLtt_flush_output ();</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_write_to_status_line (char *s, int col)</div><div class='add'>+{</div><div class='add'>+   if ((SLtt_Has_Status_Line &lt;= 0)</div><div class='add'>+       || (Goto_Status_Line_Str == NULL)</div><div class='add'>+       || (Return_From_Status_Line_Str == NULL))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   tt_printf (Goto_Status_Line_Str, col, 0);</div><div class='add'>+   tt_write_string (s);</div><div class='add'>+   tt_write_string (Return_From_Status_Line_Str);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtt_get_screen_size (void)</div><div class='add'>+{</div><div class='add'>+#ifdef VMS</div><div class='add'>+   int status, code;</div><div class='add'>+   unsigned short chan;</div><div class='add'>+   $DESCRIPTOR(dev_dsc, "SYS$INPUT:");</div><div class='add'>+#endif</div><div class='add'>+   int r = 0, c = 0;</div><div class='add'>+</div><div class='add'>+#ifdef TIOCGWINSZ</div><div class='add'>+   struct winsize wind_struct;</div><div class='add'>+</div><div class='add'>+   do</div><div class='add'>+     {</div><div class='add'>+	if ((ioctl(1,TIOCGWINSZ,&amp;wind_struct) == 0)</div><div class='add'>+	    || (ioctl(0, TIOCGWINSZ, &amp;wind_struct) == 0)</div><div class='add'>+	    || (ioctl(2, TIOCGWINSZ, &amp;wind_struct) == 0))</div><div class='add'>+	  {</div><div class='add'>+	     c = (int) wind_struct.ws_col;</div><div class='add'>+	     r = (int) wind_struct.ws_row;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   while (errno == EINTR);</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+   status = sys$assign(&amp;dev_dsc,&amp;chan,0,0,0);</div><div class='add'>+   if (status &amp; 1)</div><div class='add'>+     {</div><div class='add'>+	code = DVI$_DEVBUFSIZ;</div><div class='add'>+	status = lib$getdvi(&amp;code, &amp;chan,0, &amp;c, 0,0);</div><div class='add'>+	if (!(status &amp; 1))</div><div class='add'>+	  c = 80;</div><div class='add'>+	code = DVI$_TT_PAGE;</div><div class='add'>+	status = lib$getdvi(&amp;code, &amp;chan,0, &amp;r, 0,0);</div><div class='add'>+	if (!(status &amp; 1))</div><div class='add'>+	  r = 24;</div><div class='add'>+	sys$dassgn(chan);</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (r &lt;= 0)</div><div class='add'>+     {</div><div class='add'>+	char *s = getenv ("LINES");</div><div class='add'>+	if (s != NULL) r = atoi (s);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (c &lt;= 0)</div><div class='add'>+     {</div><div class='add'>+	char *s = getenv ("COLUMNS");</div><div class='add'>+	if (s != NULL) c = atoi (s);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (r &lt;= 0) r = 24;</div><div class='add'>+   if (c &lt;= 0) c = 80;</div><div class='add'>+#if 0</div><div class='add'>+   if ((r &lt;= 0) || (r &gt; 200)) r = 24;</div><div class='add'>+   if ((c &lt;= 0) || (c &gt; 250)) c = 80;</div><div class='add'>+#endif</div><div class='add'>+   SLtt_Screen_Rows = r;</div><div class='add'>+   SLtt_Screen_Cols = c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT</div><div class='add'>+int _SLtt_get_bce_color_offset (void)</div><div class='add'>+{</div><div class='add'>+   if ((SLtt_Use_Ansi_Colors == 0)</div><div class='add'>+       || Can_Background_Color_Erase</div><div class='add'>+       || SLtt_Use_Blink_For_ACS)      /* in this case, we cannot lose a color */</div><div class='add'>+     Bce_Color_Offset = 0;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	if (GET_BG(Ansi_Color_Map[0].fgbg) == SLSMG_COLOR_DEFAULT)</div><div class='add'>+	  Bce_Color_Offset = 0;</div><div class='add'>+	else</div><div class='add'>+	  Bce_Color_Offset = 1;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   return Bce_Color_Offset;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slerr.c b/mdk-stage1/slang/slerr.c<br/>new file mode 100644<br/>index 000000000..139b3859b<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slerr.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slerr.c</a></div><div class='hunk'>@@ -0,0 +1,181 @@</div><div class='add'>+/* error handling common to all routines. */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+void (*SLang_VMessage_Hook) (char *, va_list);</div><div class='add'>+void (*SLang_Error_Hook)(char *);</div><div class='add'>+void (*SLang_Exit_Error_Hook)(char *, va_list);</div><div class='add'>+volatile int SLang_Error = 0;</div><div class='add'>+char *SLang_Error_Message;</div><div class='add'>+volatile int SLKeyBoard_Quit = 0;</div><div class='add'>+</div><div class='add'>+static char *get_error_string (void)</div><div class='add'>+{</div><div class='add'>+   char *str;</div><div class='add'>+</div><div class='add'>+   if (!SLang_Error) SLang_Error = SL_UNKNOWN_ERROR;</div><div class='add'>+   if (SLang_Error_Message != NULL) str = SLang_Error_Message;</div><div class='add'>+   else switch(SLang_Error)</div><div class='add'>+     {</div><div class='add'>+      case SL_NOT_IMPLEMENTED: str = "Not Implemented"; break;</div><div class='add'>+      case SL_APPLICATION_ERROR: str = "Application Error"; break;</div><div class='add'>+      case SL_VARIABLE_UNINITIALIZED: str = "Variable Uninitialized"; break;</div><div class='add'>+      case SL_MALLOC_ERROR : str = "Malloc Error"; break;</div><div class='add'>+      case SL_INTERNAL_ERROR: str = "Internal Error"; break;</div><div class='add'>+      case SL_STACK_OVERFLOW: str = "Stack Overflow"; break;</div><div class='add'>+      case SL_STACK_UNDERFLOW: str = "Stack Underflow"; break;</div><div class='add'>+      case SL_INTRINSIC_ERROR: str = "Intrinsic Error"; break;</div><div class='add'>+      case SL_USER_BREAK: str = "User Break"; break;</div><div class='add'>+      case SL_UNDEFINED_NAME: str = "Undefined Name"; break;</div><div class='add'>+      case SL_SYNTAX_ERROR: str = "Syntax Error"; break;</div><div class='add'>+      case SL_DUPLICATE_DEFINITION: str = "Duplicate Definition"; break;</div><div class='add'>+      case SL_TYPE_MISMATCH: str = "Type Mismatch"; break;</div><div class='add'>+      case SL_READONLY_ERROR: str = "Variable is read-only"; break;</div><div class='add'>+      case SL_DIVIDE_ERROR: str = "Divide by zero"; break;</div><div class='add'>+      case SL_OBJ_NOPEN: str = "Object not opened"; break;</div><div class='add'>+      case SL_OBJ_UNKNOWN: str = "Object unknown"; break;</div><div class='add'>+      case SL_INVALID_PARM: str = "Invalid Parameter"; break;</div><div class='add'>+      case SL_TYPE_UNDEFINED_OP_ERROR:</div><div class='add'>+	str = "Operation not defined for datatype"; break;</div><div class='add'>+      case SL_USER_ERROR:</div><div class='add'>+	str = "User Error"; break;</div><div class='add'>+      case SL_USAGE_ERROR:</div><div class='add'>+	str = "Illegal usage of function";</div><div class='add'>+	break;</div><div class='add'>+      case SL_FLOATING_EXCEPTION:</div><div class='add'>+	str = "Floating Point Exception";</div><div class='add'>+	break;</div><div class='add'>+      case SL_UNKNOWN_ERROR:</div><div class='add'>+      default: str = "Unknown Error Code";</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_Error_Message = NULL;</div><div class='add'>+   return str;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_doerror (char *error)</div><div class='add'>+{</div><div class='add'>+   char *str = NULL;</div><div class='add'>+   char *err;</div><div class='add'>+   char *malloced_err_buf;</div><div class='add'>+   char err_buf [1024];</div><div class='add'>+</div><div class='add'>+   malloced_err_buf = NULL;</div><div class='add'>+</div><div class='add'>+   if (((SLang_Error == SL_USER_ERROR)</div><div class='add'>+	|| (SLang_Error == SL_USAGE_ERROR))</div><div class='add'>+       &amp;&amp; (error != NULL) &amp;&amp; (*error != 0))</div><div class='add'>+     err = error;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	char *sle = "S-Lang Error: ";</div><div class='add'>+	unsigned int len;</div><div class='add'>+	char *fmt;</div><div class='add'>+</div><div class='add'>+	str = get_error_string ();</div><div class='add'>+</div><div class='add'>+	fmt = "%s%s%s";</div><div class='add'>+	if ((error == NULL) || (*error == 0))</div><div class='add'>+	  error = "";</div><div class='add'>+	else if (SLang_Error == SL_UNKNOWN_ERROR)</div><div class='add'>+	  /* Do not display an unknown error message if error is non-NULL */</div><div class='add'>+	  str = "";</div><div class='add'>+	else</div><div class='add'>+	  fmt = "%s%s: %s";</div><div class='add'>+</div><div class='add'>+	len = strlen (sle) + strlen (str) + strlen(error) + 1;</div><div class='add'>+</div><div class='add'>+	err = err_buf;</div><div class='add'>+	if (len &gt;= sizeof (err_buf))</div><div class='add'>+	  {</div><div class='add'>+	     if (NULL == (malloced_err_buf = SLmalloc (len)))</div><div class='add'>+	       err = NULL;</div><div class='add'>+	     else</div><div class='add'>+	       err = malloced_err_buf;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (err != NULL) sprintf (err, fmt, sle, str, error);</div><div class='add'>+	else err = "Out of memory";</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (SLang_Error_Hook == NULL)</div><div class='add'>+     {</div><div class='add'>+	fputs (err, stderr);</div><div class='add'>+	fputs("\r\n", stderr);</div><div class='add'>+	fflush (stderr);</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     (*SLang_Error_Hook)(err);</div><div class='add'>+</div><div class='add'>+   SLfree (malloced_err_buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_verror (int err_code, char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+   va_list ap;</div><div class='add'>+   char err [1024];</div><div class='add'>+</div><div class='add'>+   if (err_code == 0) err_code = SL_INTRINSIC_ERROR;</div><div class='add'>+   if (SLang_Error == 0) SLang_Error = err_code;</div><div class='add'>+</div><div class='add'>+   if (fmt != NULL)</div><div class='add'>+     {</div><div class='add'>+	va_start(ap, fmt);</div><div class='add'>+	(void) _SLvsnprintf (err, sizeof (err), fmt, ap);</div><div class='add'>+	fmt = err;</div><div class='add'>+	va_end(ap);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_doerror (fmt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_exit_error (char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+   va_list ap;</div><div class='add'>+</div><div class='add'>+   va_start (ap, fmt);</div><div class='add'>+   if (SLang_Exit_Error_Hook != NULL)</div><div class='add'>+     {</div><div class='add'>+	(*SLang_Exit_Error_Hook) (fmt, ap);</div><div class='add'>+	exit (1);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (fmt != NULL)</div><div class='add'>+     {</div><div class='add'>+	vfprintf (stderr, fmt, ap);</div><div class='add'>+	fputs ("\r\n", stderr);</div><div class='add'>+	fflush (stderr);</div><div class='add'>+     }</div><div class='add'>+   va_end (ap);</div><div class='add'>+</div><div class='add'>+   exit (1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_vmessage (char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+   va_list ap;</div><div class='add'>+</div><div class='add'>+   if (fmt == NULL)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   va_start (ap, fmt);</div><div class='add'>+</div><div class='add'>+   if (SLang_VMessage_Hook != NULL)</div><div class='add'>+     (*SLang_VMessage_Hook) (fmt, ap);</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	vfprintf (stdout, fmt, ap);</div><div class='add'>+	fputs ("\r\n", stdout);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   va_end (ap);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slerrno.c b/mdk-stage1/slang/slerrno.c<br/>new file mode 100644<br/>index 000000000..662fadde1<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slerrno.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slerrno.c</a></div><div class='hunk'>@@ -0,0 +1,219 @@</div><div class='add'>+/* The point of this file is to handle errno values in a system independent</div><div class='add'>+ * way so that they may be used in slang scripts.</div><div class='add'>+ */</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *msg;</div><div class='add'>+   int sys_errno;</div><div class='add'>+   char *symbolic_name;</div><div class='add'>+}</div><div class='add'>+Errno_Map_Type;</div><div class='add'>+</div><div class='add'>+static Errno_Map_Type Errno_Map [] =</div><div class='add'>+{</div><div class='add'>+#ifndef EPERM</div><div class='add'>+# define EPERM	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Not owner",			EPERM,	"EPERM"},</div><div class='add'>+#ifndef ENOENT</div><div class='add'>+# define ENOENT	-1</div><div class='add'>+#endif</div><div class='add'>+     {"No such file or directory",	ENOENT,	"ENOENT"},</div><div class='add'>+#ifndef ESRCH</div><div class='add'>+# define ESRCH	-1</div><div class='add'>+#endif</div><div class='add'>+     {"No such process",		ESRCH,	"ESRCH"},</div><div class='add'>+#ifndef EINTR</div><div class='add'>+# define EINTR	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Interrupted system call",	EINTR,	"EINTR"},</div><div class='add'>+#ifndef EIO</div><div class='add'>+# define EIO	-1</div><div class='add'>+#endif</div><div class='add'>+     {"I/O error",			EIO,	"EIO"},</div><div class='add'>+#ifndef ENXIO</div><div class='add'>+# define ENXIO	-1</div><div class='add'>+#endif</div><div class='add'>+     {"No such device or address",	ENXIO,	"ENXIO"},</div><div class='add'>+#ifndef E2BIG</div><div class='add'>+# define E2BIG	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Arg list too long",		E2BIG,	"E2BIG"},</div><div class='add'>+#ifndef ENOEXEC</div><div class='add'>+# define ENOEXEC	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Exec format error",		ENOEXEC,"ENOEXEC"},</div><div class='add'>+#ifndef EBADF</div><div class='add'>+# define EBADF	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Bad file number",		EBADF,	"EBADF"},</div><div class='add'>+#ifndef ECHILD</div><div class='add'>+# define ECHILD	-1</div><div class='add'>+#endif</div><div class='add'>+     {"No children",			ECHILD,	"ECHILD"},</div><div class='add'>+#ifndef EAGAIN</div><div class='add'>+# define EAGAIN	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Try again",			EAGAIN,	"EAGAIN"},</div><div class='add'>+#ifndef ENOMEM</div><div class='add'>+# define ENOMEM	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Not enough core",		ENOMEM,	"ENOMEM"},</div><div class='add'>+#ifndef EACCES</div><div class='add'>+# define EACCES	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Permission denied",		EACCES,	"EACCES"},</div><div class='add'>+#ifndef EFAULT</div><div class='add'>+# define EFAULT	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Bad address",			EFAULT,	"EFAULT"},</div><div class='add'>+#ifndef ENOTBLK</div><div class='add'>+# define ENOTBLK	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Block device required",		ENOTBLK,	"ENOTBLK"},</div><div class='add'>+#ifndef EBUSY</div><div class='add'>+# define EBUSY	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Mount device busy",		EBUSY,	"EBUSY"},</div><div class='add'>+#ifndef EEXIST</div><div class='add'>+# define EEXIST	-1</div><div class='add'>+#endif</div><div class='add'>+     {"File exists",			EEXIST,	"EEXIST"},</div><div class='add'>+#ifndef EXDEV</div><div class='add'>+# define EXDEV	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Cross-device link",		EXDEV,	"EXDEV"},</div><div class='add'>+#ifndef ENODEV</div><div class='add'>+# define ENODEV	-1</div><div class='add'>+#endif</div><div class='add'>+     {"No such device",			ENODEV,	"ENODEV"},</div><div class='add'>+#ifndef ENOTDIR</div><div class='add'>+# define ENOTDIR	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Not a directory",		ENOTDIR,	"ENOTDIR"},</div><div class='add'>+#ifndef EISDIR</div><div class='add'>+# define EISDIR	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Is a directory",			EISDIR,	"EISDIR"},</div><div class='add'>+#ifndef EINVAL</div><div class='add'>+# define EINVAL	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Invalid argument",		EINVAL,	"EINVAL"},</div><div class='add'>+#ifndef ENFILE</div><div class='add'>+# define ENFILE	-1</div><div class='add'>+#endif</div><div class='add'>+     {"File table overflow",		ENFILE,	"ENFILE"},</div><div class='add'>+#ifndef EMFILE</div><div class='add'>+# define EMFILE	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Too many open files",		EMFILE,	"EMFILE"},</div><div class='add'>+#ifndef ENOTTY</div><div class='add'>+# define ENOTTY	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Not a typewriter",		ENOTTY,	"ENOTTY"},</div><div class='add'>+#ifndef ETXTBSY</div><div class='add'>+# define ETXTBSY	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Text file busy",			ETXTBSY,	"ETXTBSY"},</div><div class='add'>+#ifndef EFBIG</div><div class='add'>+# define EFBIG	-1</div><div class='add'>+#endif</div><div class='add'>+     {"File too large",			EFBIG,	"EFBIG"},</div><div class='add'>+#ifndef ENOSPC</div><div class='add'>+# define ENOSPC	-1</div><div class='add'>+#endif</div><div class='add'>+     {"No space left on device",	ENOSPC,	"ENOSPC"},</div><div class='add'>+#ifndef ESPIPE</div><div class='add'>+# define ESPIPE	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Illegal seek",			ESPIPE,	"ESPIPE"},</div><div class='add'>+#ifndef EROFS</div><div class='add'>+# define EROFS	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Read-only file system",		EROFS,	"EROFS"},</div><div class='add'>+#ifndef EMLINK</div><div class='add'>+# define EMLINK	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Too many links",			EMLINK,	"EMLINK"},</div><div class='add'>+#ifndef EPIPE</div><div class='add'>+# define EPIPE	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Broken pipe",			EPIPE,	"EPIPE"},</div><div class='add'>+#ifndef ELOOP</div><div class='add'>+# define ELOOP	-1</div><div class='add'>+#endif</div><div class='add'>+     {"Too many levels of symbolic links",ELOOP,	"ELOOP"},</div><div class='add'>+#ifndef ENAMETOOLONG</div><div class='add'>+# define ENAMETOOLONG	-1</div><div class='add'>+#endif</div><div class='add'>+     {"File name too long",		ENAMETOOLONG,	"ENAMETOOLONG"},</div><div class='add'>+</div><div class='add'>+     {NULL, 0, NULL}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLerrno_errno;</div><div class='add'>+</div><div class='add'>+int SLerrno_set_errno (int sys_errno)</div><div class='add'>+{</div><div class='add'>+   _SLerrno_errno = sys_errno;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLerrno_strerror (int sys_errno)</div><div class='add'>+{</div><div class='add'>+   Errno_Map_Type *e;</div><div class='add'>+</div><div class='add'>+   e = Errno_Map;</div><div class='add'>+   while (e-&gt;msg != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (e-&gt;sys_errno == sys_errno)</div><div class='add'>+	  return e-&gt;msg;</div><div class='add'>+</div><div class='add'>+	e++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (sys_errno == SL_ERRNO_NOT_IMPLEMENTED)</div><div class='add'>+     return "System call not available for this platform";</div><div class='add'>+</div><div class='add'>+   return "Unknown error";</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *intrin_errno_string (int *sys_errno)</div><div class='add'>+{</div><div class='add'>+   return SLerrno_strerror (*sys_errno);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLerrno_init (void)</div><div class='add'>+{</div><div class='add'>+   static Errno_Map_Type *e;</div><div class='add'>+</div><div class='add'>+   if (e != NULL)		       /* already initialized */</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLadd_intrinsic_function ("errno_string", (FVOID_STAR) intrin_errno_string,</div><div class='add'>+				       SLANG_STRING_TYPE, 1, SLANG_INT_TYPE))</div><div class='add'>+       || (-1 == SLadd_intrinsic_variable ("errno", (VOID_STAR)&amp;_SLerrno_errno, SLANG_INT_TYPE, 1)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   e = Errno_Map;</div><div class='add'>+   while (e-&gt;msg != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLadd_intrinsic_variable (e-&gt;symbolic_name, (VOID_STAR) &amp;e-&gt;sys_errno, SLANG_INT_TYPE, 1))</div><div class='add'>+	  return -1;</div><div class='add'>+	e++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slgetkey.c b/mdk-stage1/slang/slgetkey.c<br/>new file mode 100644<br/>index 000000000..2f2914f07<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slgetkey.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slgetkey.c</a></div><div class='hunk'>@@ -0,0 +1,306 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+unsigned int SLang_Input_Buffer_Len = 0;</div><div class='add'>+unsigned char SLang_Input_Buffer [SL_MAX_INPUT_BUFFER_LEN];</div><div class='add'>+</div><div class='add'>+int SLang_Abort_Char = 7;</div><div class='add'>+int SLang_Ignore_User_Abort = 0;</div><div class='add'>+</div><div class='add'>+/* This has the effect of mapping all characters in the range 128-169 to</div><div class='add'>+ * ESC [ something</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+unsigned int SLang_getkey (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int imax;</div><div class='add'>+   unsigned int ch;</div><div class='add'>+</div><div class='add'>+   if (SLang_Input_Buffer_Len)</div><div class='add'>+     {</div><div class='add'>+	ch = (unsigned int) *SLang_Input_Buffer;</div><div class='add'>+	SLang_Input_Buffer_Len--;</div><div class='add'>+	imax = SLang_Input_Buffer_Len;</div><div class='add'>+</div><div class='add'>+	SLMEMCPY ((char *) SLang_Input_Buffer,</div><div class='add'>+		(char *) (SLang_Input_Buffer + 1), imax);</div><div class='add'>+     }</div><div class='add'>+   else if (SLANG_GETKEY_ERROR == (ch = _SLsys_getkey ())) return ch;</div><div class='add'>+</div><div class='add'>+#if _SLANG_MAP_VTXXX_8BIT</div><div class='add'>+# if !defined(IBMPC_SYSTEM)</div><div class='add'>+   if (ch &amp; 0x80)</div><div class='add'>+     {</div><div class='add'>+	unsigned char i;</div><div class='add'>+	i = (unsigned char) (ch &amp; 0x7F);</div><div class='add'>+	if (i &lt; ' ')</div><div class='add'>+	  {</div><div class='add'>+	     i += 64;</div><div class='add'>+	     SLang_ungetkey (i);</div><div class='add'>+	     ch = 27;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+   return(ch);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_ungetkey_string (unsigned char *s, unsigned int n)</div><div class='add'>+{</div><div class='add'>+   register unsigned char *bmax, *b, *b1;</div><div class='add'>+   if (SLang_Input_Buffer_Len + n + 3 &gt; SL_MAX_INPUT_BUFFER_LEN)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   b = SLang_Input_Buffer;</div><div class='add'>+   bmax = (b - 1) + SLang_Input_Buffer_Len;</div><div class='add'>+   b1 = bmax + n;</div><div class='add'>+   while (bmax &gt;= b) *b1-- = *bmax--;</div><div class='add'>+   bmax = b + n;</div><div class='add'>+   while (b &lt; bmax) *b++ = *s++;</div><div class='add'>+   SLang_Input_Buffer_Len += n;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_buffer_keystring (unsigned char *s, unsigned int n)</div><div class='add'>+{</div><div class='add'>+</div><div class='add'>+   if (n + SLang_Input_Buffer_Len + 3 &gt; SL_MAX_INPUT_BUFFER_LEN) return -1;</div><div class='add'>+</div><div class='add'>+   SLMEMCPY ((char *) SLang_Input_Buffer + SLang_Input_Buffer_Len,</div><div class='add'>+	   (char *) s, n);</div><div class='add'>+   SLang_Input_Buffer_Len += n;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_ungetkey (unsigned char ch)</div><div class='add'>+{</div><div class='add'>+   return SLang_ungetkey_string(&amp;ch, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_input_pending (int tsecs)</div><div class='add'>+{</div><div class='add'>+   int n;</div><div class='add'>+   unsigned char c;</div><div class='add'>+   if (SLang_Input_Buffer_Len) return (int) SLang_Input_Buffer_Len;</div><div class='add'>+</div><div class='add'>+   n = _SLsys_input_pending (tsecs);</div><div class='add'>+</div><div class='add'>+   if (n &lt;= 0) return 0;</div><div class='add'>+</div><div class='add'>+   c = (unsigned char) SLang_getkey ();</div><div class='add'>+   SLang_ungetkey_string (&amp;c, 1);</div><div class='add'>+</div><div class='add'>+   return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_flush_input (void)</div><div class='add'>+{</div><div class='add'>+   int quit = SLKeyBoard_Quit;</div><div class='add'>+</div><div class='add'>+   SLang_Input_Buffer_Len = 0;</div><div class='add'>+   SLKeyBoard_Quit = 0;</div><div class='add'>+   while (_SLsys_input_pending (0) &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	(void) _SLsys_getkey ();</div><div class='add'>+	/* Set this to 0 because _SLsys_getkey may stuff keyboard buffer if</div><div class='add'>+	 * key sends key sequence (OS/2, DOS, maybe VMS).</div><div class='add'>+	 */</div><div class='add'>+	SLang_Input_Buffer_Len = 0;</div><div class='add'>+     }</div><div class='add'>+   SLKeyBoard_Quit = quit;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+static int Map_To_ANSI;</div><div class='add'>+int SLgetkey_map_to_ansi (int enable)</div><div class='add'>+{</div><div class='add'>+   Map_To_ANSI = enable;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int convert_scancode (unsigned int scan, </div><div class='add'>+			     unsigned int shift,</div><div class='add'>+			     int getkey,</div><div class='add'>+			     unsigned int *ret_key)</div><div class='add'>+{</div><div class='add'>+   unsigned char buf[16];</div><div class='add'>+   unsigned char *b;</div><div class='add'>+   unsigned char end;</div><div class='add'>+   int is_arrow;</div><div class='add'>+</div><div class='add'>+   shift &amp;= (_SLTT_KEY_ALT|_SLTT_KEY_SHIFT|_SLTT_KEY_CTRL);</div><div class='add'>+</div><div class='add'>+   b = buf;</div><div class='add'>+   if (_SLTT_KEY_ALT == shift)</div><div class='add'>+     {</div><div class='add'>+	shift = 0;</div><div class='add'>+	*b++ = 27;</div><div class='add'>+     }</div><div class='add'>+   *b++ = 27;</div><div class='add'>+   *b++ = '[';</div><div class='add'>+</div><div class='add'>+   is_arrow = 0;</div><div class='add'>+   end = '~';</div><div class='add'>+   if (shift)</div><div class='add'>+     {</div><div class='add'>+	if (shift == _SLTT_KEY_CTRL)</div><div class='add'>+	  end = '^';</div><div class='add'>+	else if (shift == _SLTT_KEY_SHIFT)</div><div class='add'>+	  end = '$';</div><div class='add'>+	else shift = 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* These mappings correspond to what rxvt produces under Linux */</div><div class='add'>+   switch (scan &amp; 0xFF)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return -1;</div><div class='add'>+</div><div class='add'>+      case 0x47:		       /* home */</div><div class='add'>+	*b++ = '1';</div><div class='add'>+	break;</div><div class='add'>+      case 0x48:		       /* up */</div><div class='add'>+	end = 'A';</div><div class='add'>+	is_arrow = 1;</div><div class='add'>+	break;</div><div class='add'>+      case 0x49:		       /* PgUp */</div><div class='add'>+	*b++ = '5';</div><div class='add'>+	break;</div><div class='add'>+      case 0x4B:		       /* Left */</div><div class='add'>+	end = 'D';</div><div class='add'>+	is_arrow = 1;</div><div class='add'>+	break;</div><div class='add'>+      case 0x4D:		       /* Right */</div><div class='add'>+	end = 'C';</div><div class='add'>+	is_arrow = 1;</div><div class='add'>+	break;</div><div class='add'>+      case 0x4F:		       /* End */</div><div class='add'>+	*b++ = '4';</div><div class='add'>+	break;</div><div class='add'>+      case 0x50:		       /* Down */</div><div class='add'>+	end = 'B';</div><div class='add'>+	is_arrow = 1;</div><div class='add'>+	break;</div><div class='add'>+      case 0x51:		       /* PgDn */</div><div class='add'>+	*b++ = '6';</div><div class='add'>+	break;</div><div class='add'>+      case 0x52:		       /* Insert */</div><div class='add'>+	*b++ = '2';</div><div class='add'>+	break;</div><div class='add'>+      case 0x53:		       /* Delete */</div><div class='add'>+	*b++ = '3';</div><div class='add'>+	break;</div><div class='add'>+      case ';':			       /* F1 */</div><div class='add'>+	*b++ = '1';</div><div class='add'>+	*b++ = '1';</div><div class='add'>+	break;</div><div class='add'>+      case '&lt;':			       /* F2 */</div><div class='add'>+	*b++ = '1';</div><div class='add'>+	*b++ = '2';</div><div class='add'>+	break;</div><div class='add'>+      case '=':			       /* F3 */</div><div class='add'>+	*b++ = '1';</div><div class='add'>+	*b++ = '3';</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '&gt;':			       /* F4 */</div><div class='add'>+	*b++ = '1';</div><div class='add'>+	*b++ = '4';</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '?':			       /* F5 */</div><div class='add'>+	*b++ = '1';</div><div class='add'>+	*b++ = '5';</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '@':			       /* F6 */</div><div class='add'>+	*b++ = '1';</div><div class='add'>+	*b++ = '7';</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'A':			       /* F7 */</div><div class='add'>+	*b++ = '1';</div><div class='add'>+	*b++ = '8';</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'B':			       /* F8 */</div><div class='add'>+	*b++ = '1';</div><div class='add'>+	*b++ = '9';</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'C':			       /* F9 */</div><div class='add'>+	*b++ = '2';</div><div class='add'>+	*b++ = '0';</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'D':			       /* F10 */</div><div class='add'>+	*b++ = '2';</div><div class='add'>+	*b++ = '1';</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 0x57:		       /* F11 */</div><div class='add'>+	*b++ = '2';</div><div class='add'>+	*b++ = '3';</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 0x58:		       /* F12 */</div><div class='add'>+	*b++ = '2';</div><div class='add'>+	*b++ = '4';</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (is_arrow &amp;&amp; shift)</div><div class='add'>+     {</div><div class='add'>+	if (shift == _SLTT_KEY_CTRL)</div><div class='add'>+	  end &amp;= 0x1F;</div><div class='add'>+	else</div><div class='add'>+	  end |= 0x20;</div><div class='add'>+     }</div><div class='add'>+   *b++ = end;</div><div class='add'>+   </div><div class='add'>+   if (getkey)</div><div class='add'>+     {</div><div class='add'>+	(void) SLang_buffer_keystring (buf + 1, (unsigned int) (b - (buf + 1)));</div><div class='add'>+	*ret_key = buf[0];</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   (void) SLang_buffer_keystring (buf, (unsigned int) (b - buf));</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+   </div><div class='add'>+unsigned int _SLpc_convert_scancode (unsigned int scan,</div><div class='add'>+				     unsigned int shift,</div><div class='add'>+				     int getkey)</div><div class='add'>+{</div><div class='add'>+   unsigned char buf[16];</div><div class='add'>+</div><div class='add'>+   if (Map_To_ANSI)</div><div class='add'>+     {</div><div class='add'>+	if (0 == convert_scancode (scan, shift, getkey, &amp;scan))</div><div class='add'>+	  return scan;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (getkey)</div><div class='add'>+     {</div><div class='add'>+	buf[0] = scan &amp; 0xFF;</div><div class='add'>+	SLang_buffer_keystring (buf, 1);</div><div class='add'>+	return (scan &gt;&gt; 8) &amp; 0xFF;</div><div class='add'>+     }</div><div class='add'>+   buf[0] = (scan &gt;&gt; 8) &amp; 0xFF;</div><div class='add'>+   buf[1] = scan &amp; 0xFF;</div><div class='add'>+   (void) SLang_buffer_keystring (buf, 2);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slimport.c b/mdk-stage1/slang/slimport.c<br/>new file mode 100644<br/>index 000000000..44b4b25e1<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slimport.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slimport.c</a></div><div class='hunk'>@@ -0,0 +1,281 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#define SLANG_HAS_DYNAMIC_LINKING 1</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_DLFCN_H</div><div class='add'>+# undef SLANG_HAS_DYNAMIC_LINKING</div><div class='add'>+# define SLANG_HAS_DYNAMIC_LINKING	0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* The rest of this file is in the if block */</div><div class='add'>+#if SLANG_HAS_DYNAMIC_LINKING</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_DLFCN_H</div><div class='add'>+# include &lt;dlfcn.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static char *Module_Path;</div><div class='add'>+#define MODULE_PATH_ENV_NAME	"SLANG_MODULE_PATH"</div><div class='add'>+#ifndef MODULE_INSTALL_DIR</div><div class='add'>+# define MODULE_INSTALL_DIR "/usr/local/lib/slang/modules"</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct _Handle_Type</div><div class='add'>+{</div><div class='add'>+   struct _Handle_Type *next;</div><div class='add'>+   char *name;</div><div class='add'>+   VOID_STAR handle;</div><div class='add'>+   void (*deinit_fun) (void);</div><div class='add'>+}</div><div class='add'>+Handle_Type;</div><div class='add'>+</div><div class='add'>+static Handle_Type *Handle_List;</div><div class='add'>+</div><div class='add'>+static void delete_handles (void)</div><div class='add'>+{</div><div class='add'>+   while (Handle_List != NULL)</div><div class='add'>+     {</div><div class='add'>+	Handle_Type *next = Handle_List-&gt;next;</div><div class='add'>+</div><div class='add'>+	if (Handle_List-&gt;deinit_fun != NULL)</div><div class='add'>+	  Handle_List-&gt;deinit_fun ();</div><div class='add'>+	(void) dlclose (Handle_List-&gt;handle);</div><div class='add'>+	SLang_free_slstring (Handle_List-&gt;name);</div><div class='add'>+	SLfree ((char *)Handle_List);</div><div class='add'>+	Handle_List = next;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static Handle_Type *save_handle (char *name, VOID_STAR h, void (*df)(void))</div><div class='add'>+{</div><div class='add'>+   Handle_Type *l;</div><div class='add'>+</div><div class='add'>+   l = (Handle_Type *) SLmalloc (sizeof (Handle_Type));</div><div class='add'>+   if (l == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+   memset ((char *) l, 0, sizeof(Handle_Type));</div><div class='add'>+   if (NULL == (l-&gt;name = SLang_create_slstring (name)))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) l);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   l-&gt;handle = h;</div><div class='add'>+   l-&gt;next = Handle_List;</div><div class='add'>+   l-&gt;deinit_fun = df;</div><div class='add'>+   Handle_List = l;</div><div class='add'>+</div><div class='add'>+   return l;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static Handle_Type *find_handle (char *name)</div><div class='add'>+{</div><div class='add'>+   Handle_Type *l;</div><div class='add'>+</div><div class='add'>+   l = Handle_List;</div><div class='add'>+   while (l != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (0 == strcmp (l-&gt;name, name))</div><div class='add'>+	  break;</div><div class='add'>+	l = l-&gt;next;</div><div class='add'>+     }</div><div class='add'>+   return l;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int import_from_library (char *name, </div><div class='add'>+				char *init_fun_name, char *deinit_fun_name,</div><div class='add'>+				char *file,</div><div class='add'>+				char *ns,</div><div class='add'>+				char *ns_init_fun_name)</div><div class='add'>+{</div><div class='add'>+   VOID_STAR handle;</div><div class='add'>+   int (*init_fun) (void);</div><div class='add'>+   int (*ns_init_fun) (char *);</div><div class='add'>+   void (*deinit_fun) (void);</div><div class='add'>+   char *err;</div><div class='add'>+   char filebuf[1024];</div><div class='add'>+   char *fun_name;</div><div class='add'>+</div><div class='add'>+   if (NULL != find_handle (name))</div><div class='add'>+     return 0;			       /* already loaded */</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+#ifndef RTLD_GLOBAL</div><div class='add'>+# define RTLD_GLOBAL 0</div><div class='add'>+#endif</div><div class='add'>+#ifdef RTLD_NOW</div><div class='add'>+	handle = (VOID_STAR) dlopen (file, RTLD_NOW | RTLD_GLOBAL);</div><div class='add'>+#else</div><div class='add'>+	handle = (VOID_STAR) dlopen (file, RTLD_LAZY | RTLD_GLOBAL);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+	if (handle != NULL)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	if (NULL == strchr (file, '/'))</div><div class='add'>+	  {</div><div class='add'>+	     _SLsnprintf (filebuf, sizeof (filebuf), "./%s", file);</div><div class='add'>+	     file = filebuf;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (NULL == (err = (char *) dlerror ()))</div><div class='add'>+	  err = "UNKNOWN";</div><div class='add'>+</div><div class='add'>+	SLang_verror (SL_INTRINSIC_ERROR,</div><div class='add'>+		      "Error linking to %s: %s", file, err);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   fun_name = ns_init_fun_name;</div><div class='add'>+   ns_init_fun = (int (*)(char *)) dlsym (handle, fun_name);</div><div class='add'>+   if (ns_init_fun == NULL) </div><div class='add'>+     {</div><div class='add'>+	if ((ns != NULL) </div><div class='add'>+	    &amp;&amp; (0 != strcmp (ns, "Global")))</div><div class='add'>+	  goto return_error;</div><div class='add'>+	</div><div class='add'>+	fun_name = init_fun_name;</div><div class='add'>+	init_fun = (int (*)(void)) dlsym (handle, fun_name);</div><div class='add'>+	if (init_fun == NULL)</div><div class='add'>+	  goto return_error;</div><div class='add'>+	</div><div class='add'>+	if (-1 == (*init_fun) ())</div><div class='add'>+	  {</div><div class='add'>+	     dlclose (handle);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   else if (-1 == (*ns_init_fun) (ns))</div><div class='add'>+     {</div><div class='add'>+	dlclose (handle);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+   deinit_fun = (void (*)(void)) dlsym (handle, deinit_fun_name);</div><div class='add'>+</div><div class='add'>+   (void) save_handle (name, handle, deinit_fun);</div><div class='add'>+   return 0;</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   </div><div class='add'>+   if (NULL == (err = (char *) dlerror ()))</div><div class='add'>+     err = "UNKNOWN";</div><div class='add'>+</div><div class='add'>+   dlclose (handle);</div><div class='add'>+   SLang_verror (SL_INTRINSIC_ERROR,</div><div class='add'>+		 "Unable to get symbol %s from %s: %s",</div><div class='add'>+		 name, file, err);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void import_module (void)</div><div class='add'>+{</div><div class='add'>+   char module_name[256];</div><div class='add'>+   char symbol_name[256];</div><div class='add'>+   char deinit_name[256];</div><div class='add'>+   char ns_init_name[256];</div><div class='add'>+   char *path;</div><div class='add'>+   char *file;</div><div class='add'>+   char *module;</div><div class='add'>+   char *ns = NULL;</div><div class='add'>+</div><div class='add'>+   if (SLang_Num_Function_Args == 2)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLang_pop_slstring (&amp;ns))</div><div class='add'>+	  return;	</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (-1 == SLang_pop_slstring (&amp;module))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (ns);      /* NULL ok */</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   _SLsnprintf (symbol_name, sizeof(symbol_name), "init_%s_module", module);</div><div class='add'>+   _SLsnprintf (module_name, sizeof(module_name), "%s-module.so", module);</div><div class='add'>+   _SLsnprintf (deinit_name, sizeof(deinit_name), "deinit_%s_module", module);</div><div class='add'>+   _SLsnprintf (ns_init_name, sizeof (ns_init_name), "init_%s_module_ns", module);</div><div class='add'>+</div><div class='add'>+   if (Module_Path != NULL)</div><div class='add'>+     file = SLpath_find_file_in_path (Module_Path, module_name);</div><div class='add'>+   else file = NULL;</div><div class='add'>+</div><div class='add'>+   if ((file == NULL)</div><div class='add'>+       &amp;&amp; (NULL != (path = getenv (MODULE_PATH_ENV_NAME))))</div><div class='add'>+     file = SLpath_find_file_in_path (path, module_name);</div><div class='add'>+</div><div class='add'>+   if (file == NULL)</div><div class='add'>+     file = SLpath_find_file_in_path (MODULE_INSTALL_DIR, module_name);</div><div class='add'>+</div><div class='add'>+   if (file != NULL)</div><div class='add'>+     {</div><div class='add'>+	(void) import_from_library (symbol_name, symbol_name, deinit_name, file, ns, ns_init_name);</div><div class='add'>+	SLfree (file);</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	/* Maybe the system loader can find it in LD_LIBRARY_PATH */</div><div class='add'>+	(void) import_from_library (symbol_name, symbol_name, deinit_name, module_name, ns, ns_init_name);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void set_import_module_path (char *path)</div><div class='add'>+{</div><div class='add'>+   (void) SLang_set_module_load_path (path);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *get_import_module_path (void)</div><div class='add'>+{</div><div class='add'>+   char *path;</div><div class='add'>+   if (Module_Path != NULL)</div><div class='add'>+     return Module_Path;</div><div class='add'>+   if (NULL != (path = getenv (MODULE_PATH_ENV_NAME)))</div><div class='add'>+     return path;</div><div class='add'>+   return MODULE_INSTALL_DIR;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Module_Intrins [] =</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_0("import", import_module, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("set_import_module_path", set_import_module_path, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("get_import_module_path", get_import_module_path, SLANG_STRING_TYPE),</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+#endif				       /* SLANG_HAS_DYNAMIC_LINKING */</div><div class='add'>+</div><div class='add'>+int SLang_set_module_load_path (char *path)</div><div class='add'>+{</div><div class='add'>+#if SLANG_HAS_DYNAMIC_LINKING</div><div class='add'>+   if (NULL == (path = SLang_create_slstring (path)))</div><div class='add'>+     return -1;</div><div class='add'>+   SLang_free_slstring (Module_Path);</div><div class='add'>+   Module_Path = path;</div><div class='add'>+   return 0;</div><div class='add'>+#else</div><div class='add'>+   (void) path;</div><div class='add'>+   return -1;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_init_import (void)</div><div class='add'>+{</div><div class='add'>+#if SLANG_HAS_DYNAMIC_LINKING</div><div class='add'>+   (void) SLang_add_cleanup_function (delete_handles);</div><div class='add'>+   return SLadd_intrin_fun_table (Module_Intrins, "__IMPORT__");</div><div class='add'>+#else</div><div class='add'>+   return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slinclud.h b/mdk-stage1/slang/slinclud.h<br/>new file mode 100644<br/>index 000000000..d60a4423e<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slinclud.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slinclud.h</a></div><div class='hunk'>@@ -0,0 +1,26 @@</div><div class='add'>+#ifndef _SLANG_INCLUDE_H_</div><div class='add'>+#define _SLANG_INCLUDE_H_</div><div class='add'>+</div><div class='add'>+#include "config.h"</div><div class='add'>+#include "sl-feat.h"</div><div class='add'>+</div><div class='add'>+#include &lt;stdio.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_STDLIB_H</div><div class='add'>+# include &lt;stdlib.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_UNISTD_H</div><div class='add'>+# include &lt;unistd.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_MALLOC_H</div><div class='add'>+# include &lt;malloc.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_MEMORY_H</div><div class='add'>+# include &lt;memory.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif				       /* _SLANG_INCLUDE_H_ */</div><div class='head'>diff --git a/mdk-stage1/slang/slintall.c b/mdk-stage1/slang/slintall.c<br/>new file mode 100644<br/>index 000000000..a66b9d6d2<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slintall.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slintall.c</a></div><div class='hunk'>@@ -0,0 +1,27 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+int SLang_init_all (void)</div><div class='add'>+{</div><div class='add'>+   if ((-1 == SLang_init_slang ())</div><div class='add'>+       || (-1 == SLang_init_slmath ())</div><div class='add'>+       || (-1 == SLang_init_posix_dir ())</div><div class='add'>+       || (-1 == SLang_init_posix_process ())</div><div class='add'>+       || (-1 == SLang_init_stdio ())</div><div class='add'>+       || (-1 == SLang_init_array ())</div><div class='add'>+       || (-1 == SLang_init_posix_io ())</div><div class='add'>+       || (-1 == SLang_init_ospath ())</div><div class='add'>+       )</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slistruc.c b/mdk-stage1/slang/slistruc.c<br/>new file mode 100644<br/>index 000000000..06b8fd6ff<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slistruc.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slistruc.c</a></div><div class='hunk'>@@ -0,0 +1,218 @@</div><div class='add'>+/* Intrinsic Structure type implementation */</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* Intrinsic structures */</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   VOID_STAR addr;</div><div class='add'>+   SLang_IStruct_Field_Type *fields;</div><div class='add'>+}</div><div class='add'>+_SLang_IStruct_Type;</div><div class='add'>+</div><div class='add'>+static SLang_IStruct_Field_Type *istruct_pop_field (char *name, int no_readonly, VOID_STAR *addr)</div><div class='add'>+{</div><div class='add'>+   _SLang_IStruct_Type *s;</div><div class='add'>+   SLang_IStruct_Field_Type *f;</div><div class='add'>+   char *struct_addr;</div><div class='add'>+</div><div class='add'>+   /* Note: There is no need to free this object */</div><div class='add'>+   if (-1 == SLclass_pop_ptr_obj (SLANG_ISTRUCT_TYPE, (VOID_STAR *) &amp;s))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   if (NULL == (struct_addr = *(char **)s-&gt;addr))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INTRINSIC_ERROR,</div><div class='add'>+		      "%s is NULL.  Unable to access field", s-&gt;name);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   f = s-&gt;fields;</div><div class='add'>+   while (f-&gt;field_name != NULL)</div><div class='add'>+     {</div><div class='add'>+	/* Since both these are slstrings, just test pointers */</div><div class='add'>+	if (f-&gt;field_name != name)</div><div class='add'>+	  {</div><div class='add'>+	     f++;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (no_readonly &amp;&amp; f-&gt;read_only)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_READONLY_ERROR,</div><div class='add'>+			   "%s.%s is read-only", s-&gt;name, name);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	*addr = (VOID_STAR) (struct_addr + f-&gt;offset);</div><div class='add'>+	return f;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_verror (SL_TYPE_MISMATCH,</div><div class='add'>+		 "%s has no field called %s", s-&gt;name, name);</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int istruct_sget (unsigned char type, char *name)</div><div class='add'>+{</div><div class='add'>+   SLang_IStruct_Field_Type *f;</div><div class='add'>+   VOID_STAR addr;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (NULL == (f = istruct_pop_field (name, 0, &amp;addr)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   type = f-&gt;type;</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+   return (cl-&gt;cl_push_intrinsic)(f-&gt;type, addr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int istruct_sput (unsigned char type, char *name)</div><div class='add'>+{</div><div class='add'>+   SLang_IStruct_Field_Type *f;</div><div class='add'>+   VOID_STAR addr;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (NULL == (f = istruct_pop_field (name, 1, &amp;addr)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   type = f-&gt;type;</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+   return (*cl-&gt;cl_pop) (type, addr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int istruct_push (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   _SLang_IStruct_Type *s;</div><div class='add'>+</div><div class='add'>+   s = *(_SLang_IStruct_Type **) ptr;</div><div class='add'>+   if ((s == NULL) </div><div class='add'>+       || (s-&gt;addr == NULL)</div><div class='add'>+       || (*(char **) s-&gt;addr == NULL))</div><div class='add'>+     return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+   return SLclass_push_ptr_obj (type, (VOID_STAR) s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int istruct_pop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   return SLclass_pop_ptr_obj (type, (VOID_STAR *)ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void istruct_destroy (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   (void) ptr;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Intrinsic struct objects are not stored in a variable. So, the address that</div><div class='add'>+ * is passed here is actually a pointer to the struct.  So, pass its address</div><div class='add'>+ * to istruct_push since v is a variable.  Confusing, n'est pas?</div><div class='add'>+ */</div><div class='add'>+static int istruct_push_intrinsic (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   return istruct_push (type, (VOID_STAR) &amp;v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int init_intrin_struct (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   static int initialized;</div><div class='add'>+</div><div class='add'>+   if (initialized)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("IStruct_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_pop = istruct_pop;</div><div class='add'>+   cl-&gt;cl_push = istruct_push;</div><div class='add'>+   cl-&gt;cl_sget = istruct_sget;</div><div class='add'>+   cl-&gt;cl_sput = istruct_sput;</div><div class='add'>+   cl-&gt;cl_destroy = istruct_destroy;</div><div class='add'>+   cl-&gt;cl_push_intrinsic = istruct_push_intrinsic;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_ISTRUCT_TYPE, sizeof (_SLang_IStruct_Type *),</div><div class='add'>+				     SLANG_CLASS_TYPE_PTR))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   initialized = 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLadd_istruct_table (SLang_IStruct_Field_Type *fields, VOID_STAR addr, char *name)</div><div class='add'>+{</div><div class='add'>+   _SLang_IStruct_Type *s;</div><div class='add'>+   SLang_IStruct_Field_Type *f;</div><div class='add'>+</div><div class='add'>+   if (-1 == init_intrin_struct ())</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (addr == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM,</div><div class='add'>+		      "SLadd_istruct_table: address must be non-NULL");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (fields == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* Make the field names slstrings so that only the pointers need to be</div><div class='add'>+    * compared.  However, this table may have been already been added for</div><div class='add'>+    * another instance of the intrinsic object.  So, check for the presence</div><div class='add'>+    * of an slstring.</div><div class='add'>+    */</div><div class='add'>+   f = fields;</div><div class='add'>+   while (f-&gt;field_name != NULL)</div><div class='add'>+     {</div><div class='add'>+	char *fname;</div><div class='add'>+</div><div class='add'>+	fname = SLang_create_slstring (f-&gt;field_name);</div><div class='add'>+	if (fname == NULL)</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	/* Here is the check for the slstring */</div><div class='add'>+	if (f-&gt;field_name == fname)</div><div class='add'>+	  SLang_free_slstring (fname);</div><div class='add'>+	else /* replace string literal with slstring */</div><div class='add'>+	  f-&gt;field_name = fname;</div><div class='add'>+</div><div class='add'>+	f++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   s = (_SLang_IStruct_Type *)SLmalloc (sizeof (_SLang_IStruct_Type));</div><div class='add'>+   if (s == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   memset ((char *)s, 0, sizeof (_SLang_IStruct_Type));</div><div class='add'>+   if (NULL == (s-&gt;name = SLang_create_slstring (name)))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) s);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   s-&gt;addr = addr;</div><div class='add'>+   s-&gt;fields = fields;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLadd_intrinsic_variable (name, (VOID_STAR) s, SLANG_ISTRUCT_TYPE, 1))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (s-&gt;name);</div><div class='add'>+	SLfree ((char *) s);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slkeymap.c b/mdk-stage1/slang/slkeymap.c<br/>new file mode 100644<br/>index 000000000..dff65433e<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slkeymap.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slkeymap.c</a></div><div class='hunk'>@@ -0,0 +1,596 @@</div><div class='add'>+/* Keymap routines for SLang.  The role of these keymap routines is simple:</div><div class='add'>+ * Just read keys from the tty and return a pointer to a keymap structure.</div><div class='add'>+ * That is, a keymap is simple a mapping of strings (keys from tty) to</div><div class='add'>+ * structures.  Also included are routines for managing the keymaps.</div><div class='add'>+ */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* We need a define a rule for upperand lower case chars that user cannot</div><div class='add'>+   change!  This could be a problem for international chars! */</div><div class='add'>+</div><div class='add'>+#define UPPER_CASE_KEY(x) (((x) &gt;= 'a') &amp;&amp; ((x) &lt;= 'z') ? (x) - 32 : (x))</div><div class='add'>+#define LOWER_CASE_KEY(x) (((x) &gt;= 'A') &amp;&amp; ((x) &lt;= 'Z') ? (x) + 32 : (x))</div><div class='add'>+</div><div class='add'>+int SLang_Key_TimeOut_Flag = 0;	       /* true if more than 1 sec has elapsed</div><div class='add'>+                                          without key in multikey sequence */</div><div class='add'>+</div><div class='add'>+int SLang_Last_Key_Char;</div><div class='add'>+</div><div class='add'>+SLKeyMap_List_Type SLKeyMap_List[SLANG_MAX_KEYMAPS];</div><div class='add'>+</div><div class='add'>+static SLang_Key_Type *malloc_key(unsigned char *str)</div><div class='add'>+{</div><div class='add'>+   SLang_Key_Type *neew;</div><div class='add'>+</div><div class='add'>+   if (NULL == (neew = (SLang_Key_Type *) SLmalloc(sizeof(SLang_Key_Type))))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   SLMEMSET ((char *) neew, 0, sizeof (SLang_Key_Type));</div><div class='add'>+   SLMEMCPY((char *) neew-&gt;str, (char *) str, (unsigned int) *str);</div><div class='add'>+   return(neew);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLKeyMap_List_Type *add_keymap (char *name, SLang_Key_Type *map)</div><div class='add'>+{</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; SLANG_MAX_KEYMAPS; i++)</div><div class='add'>+     {</div><div class='add'>+	if (SLKeyMap_List[i].keymap == NULL)</div><div class='add'>+	  {</div><div class='add'>+	     if (NULL == (name = SLang_create_slstring (name)))</div><div class='add'>+	       return NULL;</div><div class='add'>+</div><div class='add'>+	     SLKeyMap_List[i].keymap = map;</div><div class='add'>+	     SLKeyMap_List[i].name = name;</div><div class='add'>+	     return &amp;SLKeyMap_List[i];</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   SLang_Error = SL_UNKNOWN_ERROR;</div><div class='add'>+   /* SLang_doerror ("Keymap quota exceeded."); */</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+FVOID_STAR SLang_find_key_function(char *name, SLKeyMap_List_Type *keymap)</div><div class='add'>+{</div><div class='add'>+   SLKeymap_Function_Type *fp = keymap -&gt; functions;</div><div class='add'>+   char ch = *name;</div><div class='add'>+</div><div class='add'>+   while ((fp != NULL) &amp;&amp; (fp-&gt;name != NULL))</div><div class='add'>+     {</div><div class='add'>+	if ((ch == *fp-&gt;name)</div><div class='add'>+	    &amp;&amp; (0 == strcmp(fp-&gt;name, name)))</div><div class='add'>+	  return (FVOID_STAR) fp-&gt;f;</div><div class='add'>+</div><div class='add'>+	fp++;</div><div class='add'>+     }</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+/* Expand termcap string specified by s.  s as passed will have the format:</div><div class='add'>+ *   "XY)..."  where XY represents a termcap keyname.</div><div class='add'>+ */</div><div class='add'>+static char *process_termcap_string (char *s, char *str, int *ip, int imax)</div><div class='add'>+{</div><div class='add'>+   char c[3], *val;</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   if ((0 == (c[0] = s[0]))</div><div class='add'>+       || (0 == (c[1] = s[1]))</div><div class='add'>+       || (s[2] != ')'))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR, "setkey: ^(%s is badly formed", s);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   s += 3;</div><div class='add'>+</div><div class='add'>+   c[2] = 0;</div><div class='add'>+   if ((NULL == (val = SLtt_tgetstr (c)))</div><div class='add'>+       || (*val == 0))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   i = *ip;</div><div class='add'>+   while ((i &lt; imax) &amp;&amp; (*val != 0))</div><div class='add'>+     {</div><div class='add'>+	str[i++] = *val++;</div><div class='add'>+     }</div><div class='add'>+   *ip = i;</div><div class='add'>+</div><div class='add'>+   return s;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* convert things like "^A" to 1 etc... The 0th char is the strlen INCLUDING</div><div class='add'>+ * the length character itself.</div><div class='add'>+ */</div><div class='add'>+char *SLang_process_keystring(char *s)</div><div class='add'>+{</div><div class='add'>+   /* FIXME: v2.0, make this thread safe */</div><div class='add'>+   static char str[32];</div><div class='add'>+   unsigned char ch;</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   i = 1;</div><div class='add'>+   while (*s != 0)</div><div class='add'>+     {</div><div class='add'>+	ch = (unsigned char) *s++;</div><div class='add'>+	if (ch == '^')</div><div class='add'>+	  {</div><div class='add'>+	     ch = *s++;</div><div class='add'>+	     if (ch == 0)</div><div class='add'>+	       {</div><div class='add'>+		  if (i &lt; 32)</div><div class='add'>+		    str[i++] = '^';</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+	     if (ch == '(')</div><div class='add'>+	       {</div><div class='add'>+		  s = process_termcap_string (s, str, &amp;i, 32);</div><div class='add'>+		  if (s == NULL)</div><div class='add'>+		    {</div><div class='add'>+		       str[0] = 1;</div><div class='add'>+		       return str;</div><div class='add'>+		    }</div><div class='add'>+		  continue;</div><div class='add'>+	       }</div><div class='add'>+#endif</div><div class='add'>+	     ch = UPPER_CASE_KEY(ch);</div><div class='add'>+	     if (ch == '?') ch = 127; else ch = ch - 'A' + 1;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (i &gt;= 32) break;</div><div class='add'>+	str[i++] = ch;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (i &gt; SLANG_MAX_KEYMAP_KEY_SEQ)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Key sequence is too long");</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   str[0] = i;</div><div class='add'>+   return(str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int key_string_compare (unsigned char *a, unsigned char *b, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   unsigned char *amax = a + len;</div><div class='add'>+   int cha, chb, cha_up, chb_up;</div><div class='add'>+</div><div class='add'>+   while (a &lt; amax)</div><div class='add'>+     {</div><div class='add'>+	cha = *a++;</div><div class='add'>+	chb = *b++;</div><div class='add'>+</div><div class='add'>+	if (cha == chb) continue;</div><div class='add'>+</div><div class='add'>+	cha_up = UPPER_CASE_KEY(cha);</div><div class='add'>+	chb_up = UPPER_CASE_KEY(chb);</div><div class='add'>+</div><div class='add'>+	if (cha_up == chb_up)</div><div class='add'>+	  {</div><div class='add'>+	     /* Use case-sensitive result. */</div><div class='add'>+	     return cha - chb;</div><div class='add'>+	  }</div><div class='add'>+	/* Use case-insensitive result. */</div><div class='add'>+	return cha_up - chb_up;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *Define_Key_Error = "Inconsistency in define key.";</div><div class='add'>+</div><div class='add'>+/* This function also performs an insertion in an ordered way. */</div><div class='add'>+static int find_the_key (char *s, SLKeyMap_List_Type *kml, SLang_Key_Type **keyp)</div><div class='add'>+{</div><div class='add'>+   unsigned char ch;</div><div class='add'>+   unsigned int str_len;</div><div class='add'>+   SLang_Key_Type *key, *last, *neew;</div><div class='add'>+   unsigned char *str;</div><div class='add'>+</div><div class='add'>+   *keyp = NULL;</div><div class='add'>+</div><div class='add'>+   if (NULL == (str = (unsigned char *) SLang_process_keystring(s)))</div><div class='add'>+     return -2;</div><div class='add'>+</div><div class='add'>+   if (1 == (str_len = str[0]))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   ch = str[1];</div><div class='add'>+   key = kml-&gt;keymap + ch;</div><div class='add'>+</div><div class='add'>+   if (str_len == 2)</div><div class='add'>+     {</div><div class='add'>+	if (key-&gt;next != NULL)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_doerror (Define_Key_Error);</div><div class='add'>+	     return -2;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (key-&gt;type == SLKEY_F_INTERPRET)</div><div class='add'>+	  SLang_free_slstring (key-&gt;f.s);</div><div class='add'>+</div><div class='add'>+	key-&gt;str[0] = str_len;</div><div class='add'>+	key-&gt;str[1] = ch;</div><div class='add'>+</div><div class='add'>+	*keyp = key;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* insert the key definition */</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	int cmp;</div><div class='add'>+	unsigned int key_len, len;</div><div class='add'>+</div><div class='add'>+	last = key;</div><div class='add'>+	key = key-&gt;next;</div><div class='add'>+</div><div class='add'>+	if ((key != NULL) &amp;&amp; (key-&gt;str != NULL))</div><div class='add'>+	  {</div><div class='add'>+	     len = key_len = key-&gt;str[0];</div><div class='add'>+	     if (len &gt; str_len) len = str_len;</div><div class='add'>+</div><div class='add'>+	     cmp = key_string_compare (str + 1, key-&gt;str + 1, len - 1);</div><div class='add'>+</div><div class='add'>+	     if (cmp &gt; 0)</div><div class='add'>+	       continue;</div><div class='add'>+</div><div class='add'>+	     if (cmp == 0)</div><div class='add'>+	       {</div><div class='add'>+		  if (key_len != str_len)</div><div class='add'>+		    {</div><div class='add'>+		       SLang_doerror (Define_Key_Error);</div><div class='add'>+		       return -2;</div><div class='add'>+		    }</div><div class='add'>+</div><div class='add'>+		  if (key-&gt;type == SLKEY_F_INTERPRET)</div><div class='add'>+		    SLang_free_slstring (key-&gt;f.s);</div><div class='add'>+</div><div class='add'>+		  *keyp = key;</div><div class='add'>+		  return 0;</div><div class='add'>+	       }</div><div class='add'>+	     /* Drop to cmp &lt; 0 case */</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (NULL == (neew = malloc_key(str))) return -1;</div><div class='add'>+</div><div class='add'>+	neew -&gt; next = key;</div><div class='add'>+	last -&gt; next = neew;</div><div class='add'>+</div><div class='add'>+	*keyp = neew;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* returns -2 if inconsistent, -1 if malloc error, 0 upon success */</div><div class='add'>+int SLkm_define_key (char *s, FVOID_STAR f, SLKeyMap_List_Type *kml)</div><div class='add'>+{</div><div class='add'>+   SLang_Key_Type *key;</div><div class='add'>+   unsigned int type = SLKEY_F_INTRINSIC;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   ret = find_the_key (s, kml, &amp;key);</div><div class='add'>+   if ((ret != 0) || (key == NULL))</div><div class='add'>+     return ret;</div><div class='add'>+</div><div class='add'>+   key-&gt;type = type;</div><div class='add'>+   key-&gt;f.f = f;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_define_key (char *s, char *funct, SLKeyMap_List_Type *kml)</div><div class='add'>+{</div><div class='add'>+   SLang_Key_Type *key;</div><div class='add'>+   FVOID_STAR f;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   ret = find_the_key (s, kml, &amp;key);</div><div class='add'>+   if ((ret != 0) || (key == NULL))</div><div class='add'>+     return ret;</div><div class='add'>+</div><div class='add'>+   f = SLang_find_key_function(funct, kml);</div><div class='add'>+</div><div class='add'>+   if (f == NULL)                      /* assume interpreted */</div><div class='add'>+     {</div><div class='add'>+	char *str = SLang_create_slstring (funct);</div><div class='add'>+	if (str == NULL) return -1;</div><div class='add'>+	key-&gt;type = SLKEY_F_INTERPRET;</div><div class='add'>+	key-&gt;f.s = str;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	key-&gt;type = SLKEY_F_INTRINSIC;</div><div class='add'>+	key-&gt;f.f = f;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLkm_define_keysym (char *s, unsigned int keysym, SLKeyMap_List_Type *kml)</div><div class='add'>+{</div><div class='add'>+   SLang_Key_Type *key;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   ret = find_the_key (s, kml, &amp;key);</div><div class='add'>+</div><div class='add'>+   if ((ret != 0) || (key == NULL))</div><div class='add'>+     return ret;</div><div class='add'>+</div><div class='add'>+   key-&gt;type = SLKEY_F_KEYSYM;</div><div class='add'>+   key-&gt;f.keysym = keysym;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Key_Type *SLang_do_key(SLKeyMap_List_Type *kml, int (*getkey)(void))</div><div class='add'>+{</div><div class='add'>+   register SLang_Key_Type *key, *next, *kmax;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   unsigned char input_ch;</div><div class='add'>+   register unsigned char chup, chlow;</div><div class='add'>+   unsigned char key_ch = 0;</div><div class='add'>+</div><div class='add'>+   SLang_Last_Key_Char = (*getkey)();</div><div class='add'>+   SLang_Key_TimeOut_Flag = 0;</div><div class='add'>+</div><div class='add'>+   if (SLANG_GETKEY_ERROR == (unsigned int) SLang_Last_Key_Char)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   input_ch = (unsigned char) SLang_Last_Key_Char;</div><div class='add'>+</div><div class='add'>+   key = (SLang_Key_Type *) &amp;((kml-&gt;keymap)[input_ch]);</div><div class='add'>+</div><div class='add'>+   /* if the next one is null, then we know this MAY be it. */</div><div class='add'>+   while (key-&gt;next == NULL)</div><div class='add'>+     {</div><div class='add'>+	if (key-&gt;type != 0)</div><div class='add'>+	  return key;</div><div class='add'>+</div><div class='add'>+	/* Try its opposite case counterpart */</div><div class='add'>+	chlow = LOWER_CASE_KEY(input_ch);</div><div class='add'>+	if (input_ch == chlow)</div><div class='add'>+	  input_ch = UPPER_CASE_KEY(input_ch);</div><div class='add'>+</div><div class='add'>+	key = kml-&gt;keymap + input_ch;</div><div class='add'>+	if (key-&gt;type == 0)</div><div class='add'>+	  return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* It appears to be a prefix character in a key sequence. */</div><div class='add'>+</div><div class='add'>+   len = 1;			       /* already read one character */</div><div class='add'>+   key = key-&gt;next;		       /* Now we are in the key list */</div><div class='add'>+   kmax = NULL;			       /* set to end of list */</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	SLang_Key_TimeOut_Flag = 1;</div><div class='add'>+	SLang_Last_Key_Char = (*getkey)();</div><div class='add'>+	SLang_Key_TimeOut_Flag = 0;</div><div class='add'>+</div><div class='add'>+	len++;</div><div class='add'>+</div><div class='add'>+	if ((SLANG_GETKEY_ERROR == (unsigned int) SLang_Last_Key_Char)</div><div class='add'>+	    || SLKeyBoard_Quit)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	input_ch = (unsigned char) SLang_Last_Key_Char;</div><div class='add'>+</div><div class='add'>+	chup = UPPER_CASE_KEY(input_ch); chlow = LOWER_CASE_KEY(input_ch);</div><div class='add'>+</div><div class='add'>+	while (key != kmax)</div><div class='add'>+	  {</div><div class='add'>+	     if (key-&gt;str[0] &gt; len)</div><div class='add'>+	       {</div><div class='add'>+		  key_ch = key-&gt;str[len];</div><div class='add'>+		  if (chup == UPPER_CASE_KEY(key_ch))</div><div class='add'>+		    break;</div><div class='add'>+	       }</div><div class='add'>+	     key = key-&gt;next;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (key == kmax) break;</div><div class='add'>+</div><div class='add'>+	/* If the input character is lowercase, check to see if there is</div><div class='add'>+	 * a lowercase match.  If so, set key to it.  Note: the</div><div class='add'>+	 * algorithm assumes the sorting performed by key_string_compare.</div><div class='add'>+	 */</div><div class='add'>+	if (input_ch != key_ch)</div><div class='add'>+	  {</div><div class='add'>+	     next = key-&gt;next;</div><div class='add'>+	     while (next != kmax)</div><div class='add'>+	       {</div><div class='add'>+		  if (next-&gt;str[0] &gt; len)</div><div class='add'>+		    {</div><div class='add'>+		       unsigned char next_ch = next-&gt;str[len];</div><div class='add'>+		       if (next_ch == input_ch)</div><div class='add'>+			 {</div><div class='add'>+			    key = next;</div><div class='add'>+			    break;</div><div class='add'>+			 }</div><div class='add'>+		       if (next_ch != chup)</div><div class='add'>+			 break;</div><div class='add'>+		    }</div><div class='add'>+		  next = next-&gt;next;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* Ok, we found the first position of a possible match.  If it</div><div class='add'>+	 * is exact, we are done.</div><div class='add'>+	 */</div><div class='add'>+	if ((unsigned int) key-&gt;str[0] == len + 1)</div><div class='add'>+	  return key;</div><div class='add'>+</div><div class='add'>+	/* Apparantly, there are some ambiguities. Read next key to resolve</div><div class='add'>+	 * the ambiguity.  Adjust kmax to encompass ambiguities.</div><div class='add'>+	 */</div><div class='add'>+</div><div class='add'>+	next = key-&gt;next;</div><div class='add'>+	while (next != kmax)</div><div class='add'>+	  {</div><div class='add'>+	     if ((unsigned int) next-&gt;str[0] &gt; len)</div><div class='add'>+	       {</div><div class='add'>+		  key_ch = next-&gt;str[len];</div><div class='add'>+		  if (chup != UPPER_CASE_KEY(key_ch))</div><div class='add'>+		    break;</div><div class='add'>+	       }</div><div class='add'>+	     next = next-&gt;next;</div><div class='add'>+	  }</div><div class='add'>+	kmax = next;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_undefine_key(char *s, SLKeyMap_List_Type *kml)</div><div class='add'>+{</div><div class='add'>+   int n, i;</div><div class='add'>+   SLang_Key_Type *key, *next, *last, *key_root, *keymap;</div><div class='add'>+   unsigned char *str;</div><div class='add'>+</div><div class='add'>+   keymap = kml -&gt; keymap;</div><div class='add'>+   if (NULL == (str = (unsigned char *) SLang_process_keystring(s)))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (0 == (n = *str++ - 1)) return;</div><div class='add'>+   i = *str;</div><div class='add'>+</div><div class='add'>+   last = key_root = (SLang_Key_Type *) &amp;(keymap[i]);</div><div class='add'>+   key = key_root-&gt;next;</div><div class='add'>+</div><div class='add'>+   while (key != NULL)</div><div class='add'>+     {</div><div class='add'>+	next = key-&gt;next;</div><div class='add'>+	if (0 == SLMEMCMP ((char *)(key-&gt;str + 1), (char *) str, n))</div><div class='add'>+	  {</div><div class='add'>+	     if (key-&gt;type == SLKEY_F_INTERPRET)</div><div class='add'>+	       SLang_free_slstring (key-&gt;f.s);</div><div class='add'>+</div><div class='add'>+	     SLfree((char *) key);</div><div class='add'>+	     last-&gt;next = next;</div><div class='add'>+	  }</div><div class='add'>+	else last = key;</div><div class='add'>+	key = next;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (n == 1)</div><div class='add'>+     {</div><div class='add'>+	*key_root-&gt;str = 0;</div><div class='add'>+	key_root-&gt;f.f = NULL;</div><div class='add'>+	key_root-&gt;type = 0;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLang_make_keystring(unsigned char *s)</div><div class='add'>+{</div><div class='add'>+   static char buf [3 * SLANG_MAX_KEYMAP_KEY_SEQ + 1];</div><div class='add'>+   char *b;</div><div class='add'>+   int n;</div><div class='add'>+</div><div class='add'>+   n = *s++ - 1;</div><div class='add'>+</div><div class='add'>+   if (n &gt; SLANG_MAX_KEYMAP_KEY_SEQ)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Key sequence is too long");</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   b = buf;</div><div class='add'>+   while (n--)</div><div class='add'>+     {</div><div class='add'>+	if (*s &lt; 32)</div><div class='add'>+	  {</div><div class='add'>+	     *b++ = '^';</div><div class='add'>+	     *b++ = *s + 'A' - 1;</div><div class='add'>+	  }</div><div class='add'>+	else *b++ = *s;</div><div class='add'>+	s++;</div><div class='add'>+     }</div><div class='add'>+   *b = 0;</div><div class='add'>+   return(buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Key_Type *copy_keymap(SLKeyMap_List_Type *kml)</div><div class='add'>+{</div><div class='add'>+   int i;</div><div class='add'>+   SLang_Key_Type *neew, *old, *new_root, *km;</div><div class='add'>+</div><div class='add'>+   if (NULL == (new_root = (SLang_Key_Type *) SLcalloc(256, sizeof(SLang_Key_Type))))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   if (kml == NULL) return new_root;</div><div class='add'>+   km = kml-&gt;keymap;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; 256; i++)</div><div class='add'>+     {</div><div class='add'>+	old = &amp;(km[i]);</div><div class='add'>+	neew = &amp;(new_root[i]);</div><div class='add'>+</div><div class='add'>+	if (old-&gt;type == SLKEY_F_INTERPRET)</div><div class='add'>+	  neew-&gt;f.s = SLang_create_slstring (old-&gt;f.s);</div><div class='add'>+	else</div><div class='add'>+	  neew-&gt;f.f = old-&gt;f.f;</div><div class='add'>+</div><div class='add'>+	neew-&gt;type = old-&gt;type;</div><div class='add'>+	SLMEMCPY((char *) neew-&gt;str, (char *) old-&gt;str, (unsigned int) *old-&gt;str);</div><div class='add'>+</div><div class='add'>+	old = old-&gt;next;</div><div class='add'>+	while (old != NULL)</div><div class='add'>+	  {</div><div class='add'>+	     neew-&gt;next = malloc_key((unsigned char *) old-&gt;str);</div><div class='add'>+	     neew = neew-&gt;next;</div><div class='add'>+</div><div class='add'>+	     if (old-&gt;type == SLKEY_F_INTERPRET)</div><div class='add'>+	       neew-&gt;f.s = SLang_create_slstring (old-&gt;f.s);</div><div class='add'>+	     else</div><div class='add'>+	       neew-&gt;f.f = old-&gt;f.f;</div><div class='add'>+</div><div class='add'>+	     neew-&gt;type = old-&gt;type;</div><div class='add'>+	     old = old-&gt;next;</div><div class='add'>+	  }</div><div class='add'>+	neew-&gt;next = NULL;</div><div class='add'>+     }</div><div class='add'>+   return(new_root);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLKeyMap_List_Type *SLang_create_keymap(char *name, SLKeyMap_List_Type *map)</div><div class='add'>+{</div><div class='add'>+   SLang_Key_Type *neew;</div><div class='add'>+   SLKeyMap_List_Type *new_map;</div><div class='add'>+</div><div class='add'>+   if ((NULL == (neew = copy_keymap(map)))</div><div class='add'>+       || (NULL == (new_map = add_keymap(name, neew)))) return NULL;</div><div class='add'>+</div><div class='add'>+   if (map != NULL) new_map -&gt; functions = map -&gt; functions;</div><div class='add'>+</div><div class='add'>+   return new_map;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLKeyMap_List_Type *SLang_find_keymap(char *name)</div><div class='add'>+{</div><div class='add'>+   SLKeyMap_List_Type *kmap, *kmap_max;</div><div class='add'>+</div><div class='add'>+   kmap = SLKeyMap_List;</div><div class='add'>+   kmap_max = kmap + SLANG_MAX_KEYMAPS;</div><div class='add'>+</div><div class='add'>+   while (kmap &lt; kmap_max)</div><div class='add'>+     {</div><div class='add'>+	if ((kmap-&gt;name != NULL)</div><div class='add'>+	    &amp;&amp; (0 == strcmp (kmap-&gt;name, name)))</div><div class='add'>+	  return kmap;</div><div class='add'>+</div><div class='add'>+	kmap++;</div><div class='add'>+     }</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slkeypad.c b/mdk-stage1/slang/slkeypad.c<br/>new file mode 100644<br/>index 000000000..524dc80fa<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slkeypad.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slkeypad.c</a></div><div class='hunk'>@@ -0,0 +1,163 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static SLKeyMap_List_Type *Keymap_List;</div><div class='add'>+</div><div class='add'>+int SLkp_init (void)</div><div class='add'>+{</div><div class='add'>+   char esc_seq[10];</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   if (NULL == (Keymap_List = SLang_create_keymap ("_SLKeypad", NULL)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   esc_seq[1] = 0;</div><div class='add'>+   for (i = 1; i &lt; 256; i++)</div><div class='add'>+     {</div><div class='add'>+	esc_seq[0] = (char) i;</div><div class='add'>+	SLkm_define_keysym (esc_seq, i, Keymap_List);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Now add most common ones. */</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+   SLkm_define_keysym ("^@", 0, Keymap_List);</div><div class='add'>+</div><div class='add'>+   SLkm_define_keysym ("\033[A", SL_KEY_UP, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033OA", SL_KEY_UP, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033[B", SL_KEY_DOWN, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033OB", SL_KEY_DOWN, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033[C", SL_KEY_RIGHT, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033OC", SL_KEY_RIGHT, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033[D", SL_KEY_LEFT, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033OD", SL_KEY_LEFT, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033[2~", SL_KEY_IC, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033[7~", SL_KEY_HOME, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033[5~", SL_KEY_PPAGE, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033[6~", SL_KEY_NPAGE, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033[8~", SL_KEY_END, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("\033[3~", SL_KEY_DELETE, Keymap_List);</div><div class='add'>+#else</div><div class='add'>+   /* Note: This will not work if SLgetkey_map_to_ansi (1) has</div><div class='add'>+    * been called.</div><div class='add'>+    */</div><div class='add'>+   SLkm_define_keysym ("^@\x48", SL_KEY_UP, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("^@\x50", SL_KEY_DOWN, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("^@\x4d", SL_KEY_RIGHT, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("^@\x4b", SL_KEY_LEFT, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("^@\x47", SL_KEY_HOME, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("^@\x49", SL_KEY_PPAGE, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("^@\x51", SL_KEY_NPAGE, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("^@\x4f", SL_KEY_END, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("^@\x52", SL_KEY_IC, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("^@\x53", SL_KEY_DELETE, Keymap_List );</div><div class='add'>+   </div><div class='add'>+   SLkm_define_keysym ("\xE0\x48", SL_KEY_UP, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("\xE0\x50", SL_KEY_DOWN, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("\xE0\x4d", SL_KEY_RIGHT, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("\xE0\x4b", SL_KEY_LEFT, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("\xE0\x47", SL_KEY_HOME, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("\xE0\x49", SL_KEY_PPAGE, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("\xE0\x51", SL_KEY_NPAGE, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("\xE0\x4f", SL_KEY_END, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("\xE0\x52", SL_KEY_IC, Keymap_List );</div><div class='add'>+   SLkm_define_keysym ("\xE0\x53", SL_KEY_DELETE, Keymap_List );</div><div class='add'>+</div><div class='add'>+    strcpy (esc_seq, "^@ ");	       /* guarantees esc_seq[3] = 0. */</div><div class='add'>+</div><div class='add'>+    for (i = 0x3b; i &lt; 0x45; i++)</div><div class='add'>+      {</div><div class='add'>+	 esc_seq [2] = i;</div><div class='add'>+	 SLkm_define_keysym (esc_seq, SL_KEY_F(i - 0x3a), Keymap_List);</div><div class='add'>+      }</div><div class='add'>+   esc_seq[2] = 0x57; SLkm_define_keysym (esc_seq, SL_KEY_F(11), Keymap_List);</div><div class='add'>+   esc_seq[2] = 0x58; SLkm_define_keysym (esc_seq, SL_KEY_F(12), Keymap_List);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+   strcpy (esc_seq, "^(kX)");</div><div class='add'>+   for (i = 0; i &lt;= 9; i++)</div><div class='add'>+     {</div><div class='add'>+	esc_seq[3] = '0' + i;</div><div class='add'>+	SLkm_define_keysym (esc_seq, SL_KEY_F(i), Keymap_List);</div><div class='add'>+     }</div><div class='add'>+   SLkm_define_keysym ("^(k;)", SL_KEY_F(10), Keymap_List);</div><div class='add'>+</div><div class='add'>+   SLkm_define_keysym ("^(ku)", SL_KEY_UP, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(kd)", SL_KEY_DOWN, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(kl)", SL_KEY_LEFT, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(kr)", SL_KEY_RIGHT, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(kP)", SL_KEY_PPAGE, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(kN)", SL_KEY_NPAGE, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(kh)", SL_KEY_HOME, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(@7)", SL_KEY_END, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(K1)", SL_KEY_A1, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(K3)", SL_KEY_A3, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(K2)", SL_KEY_B2, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(K4)", SL_KEY_C1, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(K5)", SL_KEY_C3, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(%0)", SL_KEY_REDO, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(&amp;8)", SL_KEY_UNDO, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(kb)", SL_KEY_BACKSPACE, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(@8)", SL_KEY_ENTER, Keymap_List);</div><div class='add'>+   SLkm_define_keysym ("^(kD)", SL_KEY_DELETE, Keymap_List);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     return -1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLkp_getkey (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Key_Type *key;</div><div class='add'>+</div><div class='add'>+   key = SLang_do_key (Keymap_List, (int (*)(void)) SLang_getkey);</div><div class='add'>+   if ((key == NULL) || (key-&gt;type != SLKEY_F_KEYSYM))</div><div class='add'>+     {</div><div class='add'>+	SLang_flush_input ();</div><div class='add'>+	return SL_KEY_ERR;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return key-&gt;f.keysym;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLkp_define_keysym (char *keystr, unsigned int keysym)</div><div class='add'>+{</div><div class='add'>+   if (SLkm_define_keysym (keystr, keysym, Keymap_List) &lt; 0)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+int main (int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+   int ch;</div><div class='add'>+</div><div class='add'>+   SLtt_get_terminfo ();</div><div class='add'>+</div><div class='add'>+   if (-1 == SLkp_init ())</div><div class='add'>+     return 1;</div><div class='add'>+</div><div class='add'>+   SLang_init_tty (-1, 0, 0);</div><div class='add'>+</div><div class='add'>+   while ('q' != (ch = SLkp_getkey ()))</div><div class='add'>+     {</div><div class='add'>+	fprintf (stdout, "Keycode = %d\r\n", ch);</div><div class='add'>+	fflush (stdout);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_reset_tty ();</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/sllimits.h b/mdk-stage1/slang/sllimits.h<br/>new file mode 100644<br/>index 000000000..c4ae03b83<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sllimits.h?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sllimits.h</a></div><div class='hunk'>@@ -0,0 +1,64 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+/* sllimits.h */</div><div class='add'>+</div><div class='add'>+/* slstring.c: Size of the hash table used for strings (prime numbers) */</div><div class='add'>+#ifdef __MSDOS_16BIT__</div><div class='add'>+# define SLSTRING_HASH_TABLE_SIZE	601</div><div class='add'>+# define SLASSOC_HASH_TABLE_SIZE	601</div><div class='add'>+#else</div><div class='add'>+# define SLSTRING_HASH_TABLE_SIZE	2909</div><div class='add'>+# define SLASSOC_HASH_TABLE_SIZE 	2909</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* slang.c: maximum size of run time stack */</div><div class='add'>+#ifdef __MSDOS_16BIT__</div><div class='add'>+# define SLANG_MAX_STACK_LEN		500</div><div class='add'>+#else</div><div class='add'>+# define SLANG_MAX_STACK_LEN		2500</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* slang.c: This sets the size on the depth of function calls */</div><div class='add'>+#ifdef __MSDOS_16BIT__</div><div class='add'>+# define SLANG_MAX_RECURSIVE_DEPTH	50</div><div class='add'>+#else</div><div class='add'>+# define SLANG_MAX_RECURSIVE_DEPTH	250</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* slang.c: Size of the stack used for local variables */</div><div class='add'>+#ifdef __MSDOS_16BIT__</div><div class='add'>+# define SLANG_MAX_LOCAL_STACK		200</div><div class='add'>+#else</div><div class='add'>+# define SLANG_MAX_LOCAL_STACK		1024</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* slang.c: The size of the hash table used for local and global objects.</div><div class='add'>+ * These should be prime numbers.</div><div class='add'>+ */</div><div class='add'>+#define SLGLOBALS_HASH_TABLE_SIZE	2909</div><div class='add'>+#define SLLOCALS_HASH_TABLE_SIZE	73</div><div class='add'>+#define SLSTATIC_HASH_TABLE_SIZE	73</div><div class='add'>+</div><div class='add'>+/* Size of the keyboard buffer use by the ungetkey routines */</div><div class='add'>+#ifdef __MSDOS_16BIT__</div><div class='add'>+# define SL_MAX_INPUT_BUFFER_LEN	40</div><div class='add'>+#else</div><div class='add'>+# define SL_MAX_INPUT_BUFFER_LEN	1024</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Maximum number of nested switch statements */</div><div class='add'>+#define SLANG_MAX_NESTED_SWITCH		10</div><div class='add'>+</div><div class='add'>+/* Size of the block stack (used in byte-compiling) */</div><div class='add'>+#define SLANG_MAX_BLOCK_STACK_LEN	50</div><div class='add'>+</div><div class='add'>+/* slfile.c: Max number of open file pointers */</div><div class='add'>+#ifdef __MSDOS_16BIT__</div><div class='add'>+# define SL_MAX_FILES			32</div><div class='add'>+#else</div><div class='add'>+# define SL_MAX_FILES			256</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slmalloc.c b/mdk-stage1/slang/slmalloc.c<br/>new file mode 100644<br/>index 000000000..914e1e0ef<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmalloc.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmalloc.c</a></div><div class='hunk'>@@ -0,0 +1,165 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#ifdef SL_MALLOC_DEBUG</div><div class='add'>+# undef SL_MALLOC_DEBUG</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifdef __alpha</div><div class='add'>+# define Chunk 8</div><div class='add'>+#else</div><div class='add'>+# define Chunk 4</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static long Total_Allocated;</div><div class='add'>+static long Max_Single_Allocation;</div><div class='add'>+static long Max_Allocated;</div><div class='add'>+/* #define SLDEBUG_DOUT */</div><div class='add'>+</div><div class='add'>+#ifdef SLDEBUG_DOUT</div><div class='add'>+static FILE *dout;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+void SLmalloc_dump_statistics (void)</div><div class='add'>+{</div><div class='add'>+#ifdef SLDEBUG_DOUT</div><div class='add'>+   fflush (dout);</div><div class='add'>+#endif</div><div class='add'>+   fprintf (stderr, "Total Allocated: %ld\nHighest single allocation: %ld\nHighest Total Allocated:%ld\n",</div><div class='add'>+	    Total_Allocated, Max_Single_Allocation, Max_Allocated);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void register_at_exit_fun (void)</div><div class='add'>+{</div><div class='add'>+   static int is_registered = 0;</div><div class='add'>+   if (is_registered)</div><div class='add'>+     return;</div><div class='add'>+   is_registered = 1;</div><div class='add'>+</div><div class='add'>+#ifdef SLDEBUG_DOUT</div><div class='add'>+   if (dout == NULL) dout = fopen ("malloc.out", "w");</div><div class='add'>+#endif</div><div class='add'>+   SLang_add_cleanup_function (SLmalloc_dump_statistics);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void fixup (unsigned char *p, unsigned long n, char *what)</div><div class='add'>+{</div><div class='add'>+   register_at_exit_fun ();</div><div class='add'>+</div><div class='add'>+   p += Chunk;</div><div class='add'>+   *(p - 4)= (unsigned char) ((n &gt;&gt; 24) &amp; 0xFF);</div><div class='add'>+   *(p - 3) = (unsigned char) ((n &gt;&gt; 16) &amp; 0xFF);</div><div class='add'>+   *(p - 2) = (unsigned char) ((n &gt;&gt; 8) &amp; 0xFF);</div><div class='add'>+   *(p - 1) = (unsigned char) (n &amp; 0xFF);</div><div class='add'>+   *(p + (int) n) = 27;</div><div class='add'>+   *(p + (int) (n + 1)) = 182;</div><div class='add'>+   *(p + (int) (n + 2)) = 81;</div><div class='add'>+   *(p + (int) (n + 3)) = 86;</div><div class='add'>+   Total_Allocated += (long) n;</div><div class='add'>+   if (Total_Allocated &gt; Max_Allocated) Max_Allocated = Total_Allocated;</div><div class='add'>+   if ((long) n &gt; Max_Single_Allocation)</div><div class='add'>+     Max_Single_Allocation = (long) n;</div><div class='add'>+</div><div class='add'>+#ifdef SLDEBUG_DOUT</div><div class='add'>+   fprintf (dout, "ALLOC: %s\t%p %ld\n", what, p, (long) n);</div><div class='add'>+#else</div><div class='add'>+   (void) what;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void SLmalloc_doerror (char *buf)</div><div class='add'>+{</div><div class='add'>+   SLang_doerror (buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int check_memory (unsigned char *p, char *what)</div><div class='add'>+{</div><div class='add'>+   char buf[128];</div><div class='add'>+   unsigned long n;</div><div class='add'>+</div><div class='add'>+   register_at_exit_fun ();</div><div class='add'>+</div><div class='add'>+   n = ((unsigned long) *(p - 4)) &lt;&lt; 24;</div><div class='add'>+   n |= ((unsigned long) *(p - 3)) &lt;&lt; 16;</div><div class='add'>+   n |= ((unsigned long) *(p - 2)) &lt;&lt; 8;</div><div class='add'>+   n |= (unsigned long) *(p - 1);</div><div class='add'>+</div><div class='add'>+   if (n == 0xFFFFFFFFUL)</div><div class='add'>+     {</div><div class='add'>+	sprintf (buf, "%s: %p: Already FREE! Abort NOW.", what, p - Chunk);</div><div class='add'>+	SLmalloc_doerror (buf);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((*(p + (int) n) != 27)</div><div class='add'>+       || (*(p + (int) (n + 1)) != 182)</div><div class='add'>+       || (*(p + (int) (n + 2)) != 81)</div><div class='add'>+       || (*(p + (int) (n + 3)) != 86))</div><div class='add'>+     {</div><div class='add'>+	sprintf (buf, "\007%s: %p: Memory corrupt! Abort NOW.", what, p);</div><div class='add'>+	SLmalloc_doerror (buf);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *(p - 4) = *(p - 3) = *(p - 2) = *(p - 1) = 0xFF;</div><div class='add'>+</div><div class='add'>+   Total_Allocated -= (long) n;</div><div class='add'>+   if (Total_Allocated &lt; 0)</div><div class='add'>+     {</div><div class='add'>+	sprintf (buf, "\007%s: %p\nFreed %ld, Allocated is: %ld!\n",</div><div class='add'>+		 what, p, (long) n, Total_Allocated);</div><div class='add'>+	SLang_doerror (buf);</div><div class='add'>+     }</div><div class='add'>+#ifdef SLDEBUG_DOUT</div><div class='add'>+   fprintf (dout, "FREE: %s:\t%p %ld\n", what, p, (long) n);</div><div class='add'>+#endif</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLdebug_free (char *p)</div><div class='add'>+{</div><div class='add'>+   if (p == NULL) return;</div><div class='add'>+   if (-1 == check_memory ((unsigned char *) p, "FREE")) return;</div><div class='add'>+</div><div class='add'>+   SLFREE (p - Chunk);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLdebug_malloc (unsigned long n)</div><div class='add'>+{</div><div class='add'>+   char *p;</div><div class='add'>+</div><div class='add'>+   if ((p = (char *) SLMALLOC (n + 2 * Chunk)) == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+   fixup ((unsigned char *) p, n, "MALLOC");</div><div class='add'>+   return p + Chunk;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLdebug_realloc (char *p, unsigned long n)</div><div class='add'>+{</div><div class='add'>+   if (-1 == check_memory ((unsigned char *) p, "REALLOC")) return NULL;</div><div class='add'>+   if ((p = (char *) SLREALLOC (p - Chunk, n + 2 * Chunk)) == NULL) return NULL;</div><div class='add'>+   fixup ((unsigned char *) p, n, "REALLOC");</div><div class='add'>+   return p + Chunk;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLdebug_calloc (unsigned long n, unsigned long size)</div><div class='add'>+{</div><div class='add'>+   char *p;</div><div class='add'>+   int m;</div><div class='add'>+</div><div class='add'>+   /* This is tough -- hope this is a good assumption!! */</div><div class='add'>+   if (size &gt;= Chunk) m = 1; else m = Chunk;</div><div class='add'>+</div><div class='add'>+   if ((p = (char *) SLCALLOC (n + m + m, size)) == NULL) return NULL;</div><div class='add'>+   fixup ((unsigned char *) p, size * n, "CALLOC");</div><div class='add'>+   return p + Chunk;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slmath.c b/mdk-stage1/slang/slmath.c<br/>new file mode 100644<br/>index 000000000..1d61e14d3<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmath.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmath.c</a></div><div class='hunk'>@@ -0,0 +1,565 @@</div><div class='add'>+/* sin, cos, etc, for S-Lang */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include &lt;math.h&gt;</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifdef PI</div><div class='add'>+# undef PI</div><div class='add'>+#endif</div><div class='add'>+#define PI 3.14159265358979323846264338327950288</div><div class='add'>+</div><div class='add'>+#if defined(__unix__)</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#define SIGNAL  SLsignal</div><div class='add'>+</div><div class='add'>+static void math_floating_point_exception (int sig)</div><div class='add'>+{</div><div class='add'>+   sig = errno;</div><div class='add'>+   if (SLang_Error == 0) SLang_Error = SL_FLOATING_EXCEPTION;</div><div class='add'>+   (void) SIGNAL (SIGFPE, math_floating_point_exception);</div><div class='add'>+   errno = sig;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+double SLmath_hypot (double x, double y)</div><div class='add'>+{</div><div class='add'>+   double fr, fi, ratio;</div><div class='add'>+</div><div class='add'>+   fr = fabs(x);</div><div class='add'>+   fi = fabs(y);</div><div class='add'>+</div><div class='add'>+   if (fr &gt; fi)</div><div class='add'>+     {</div><div class='add'>+	ratio = y / x;</div><div class='add'>+	x = fr * sqrt (1.0 + ratio * ratio);</div><div class='add'>+     }</div><div class='add'>+   else if (fi == 0.0) x = 0.0;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	ratio = x / y;</div><div class='add'>+	x = fi * sqrt (1.0 + ratio * ratio);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return x;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* usage here is a1 a2 ... an n x ==&gt; a1x^n + a2 x ^(n - 1) + ... + an */</div><div class='add'>+static double math_poly (void)</div><div class='add'>+{</div><div class='add'>+   int n;</div><div class='add'>+   double xn = 1.0, sum = 0.0;</div><div class='add'>+   double an, x;</div><div class='add'>+</div><div class='add'>+   if ((SLang_pop_double(&amp;x, NULL, NULL))</div><div class='add'>+       || (SLang_pop_integer(&amp;n))) return(0.0);</div><div class='add'>+</div><div class='add'>+   while (n-- &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	if (SLang_pop_double(&amp;an, NULL, NULL)) break;</div><div class='add'>+	sum += an * xn;</div><div class='add'>+	xn = xn * x;</div><div class='add'>+     }</div><div class='add'>+   return (double) sum;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int double_math_op_result (int op, unsigned char a, unsigned char *b)</div><div class='add'>+{</div><div class='add'>+   (void) op;</div><div class='add'>+</div><div class='add'>+   if (a != SLANG_FLOAT_TYPE)</div><div class='add'>+     *b = SLANG_DOUBLE_TYPE;</div><div class='add'>+   else</div><div class='add'>+     *b = a;</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_ASINH</div><div class='add'>+# define ASINH_FUN	asinh</div><div class='add'>+#else</div><div class='add'>+# define ASINH_FUN	my_asinh</div><div class='add'>+static double my_asinh (double x)</div><div class='add'>+{</div><div class='add'>+   return log (x + sqrt (x*x + 1));</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_ACOSH</div><div class='add'>+# define ACOSH_FUN	acosh</div><div class='add'>+#else</div><div class='add'>+# define ACOSH_FUN	my_acosh</div><div class='add'>+static double my_acosh (double x)</div><div class='add'>+{</div><div class='add'>+   return log (x + sqrt(x*x - 1));     /* x &gt;= 1 */</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_ATANH</div><div class='add'>+# define ATANH_FUN	atanh</div><div class='add'>+#else</div><div class='add'>+# define ATANH_FUN	my_atanh</div><div class='add'>+static double my_atanh (double x)</div><div class='add'>+{</div><div class='add'>+   return 0.5 * log ((1.0 + x)/(1.0 - x)); /* 0 &lt;= x^2 &lt; 1 */</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int double_math_op (int op,</div><div class='add'>+			   unsigned char type, VOID_STAR ap, unsigned int na,</div><div class='add'>+			   VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   double *a, *b;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   double (*fun) (double);</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   a = (double *) ap;</div><div class='add'>+   b = (double *) bp;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLMATH_SINH:</div><div class='add'>+	fun = sinh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_COSH:</div><div class='add'>+	fun = cosh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_TANH:</div><div class='add'>+	fun = tanh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_TAN:</div><div class='add'>+	fun = tan;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ASIN:</div><div class='add'>+	fun = asin;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ACOS:</div><div class='add'>+	fun = acos;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ATAN:</div><div class='add'>+	fun = atan;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_EXP:</div><div class='add'>+	fun = exp;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_LOG:</div><div class='add'>+	fun = log;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_LOG10:</div><div class='add'>+	fun = log10;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_SQRT:</div><div class='add'>+	fun = sqrt;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_SIN:</div><div class='add'>+	fun = sin;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_COS:</div><div class='add'>+	fun = cos;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLMATH_ASINH:</div><div class='add'>+	fun = ASINH_FUN;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ATANH:</div><div class='add'>+	fun = ATANH_FUN;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ACOSH:</div><div class='add'>+	fun = ACOSH_FUN;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLMATH_CONJ:</div><div class='add'>+      case SLMATH_REAL:</div><div class='add'>+	for (i = 0; i &lt; na; i++)</div><div class='add'>+	  b[i] = a[i];</div><div class='add'>+	return 1;</div><div class='add'>+      case SLMATH_IMAG:</div><div class='add'>+	for (i = 0; i &lt; na; i++)</div><div class='add'>+	  b[i] = 0.0;</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; na; i++)</div><div class='add'>+     b[i] = (*fun) (a[i]);</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int float_math_op (int op,</div><div class='add'>+			  unsigned char type, VOID_STAR ap, unsigned int na,</div><div class='add'>+			  VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   float *a, *b;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   double (*fun) (double);</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   a = (float *) ap;</div><div class='add'>+   b = (float *) bp;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLMATH_SINH:</div><div class='add'>+	fun = sinh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_COSH:</div><div class='add'>+	fun = cosh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_TANH:</div><div class='add'>+	fun = tanh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_TAN:</div><div class='add'>+	fun = tan;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ASIN:</div><div class='add'>+	fun = asin;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ACOS:</div><div class='add'>+	fun = acos;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ATAN:</div><div class='add'>+	fun = atan;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_EXP:</div><div class='add'>+	fun = exp;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_LOG:</div><div class='add'>+	fun = log;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_LOG10:</div><div class='add'>+	fun = log10;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_SQRT:</div><div class='add'>+	fun = sqrt;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_SIN:</div><div class='add'>+	fun = sin;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_COS:</div><div class='add'>+	fun = cos;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLMATH_ASINH:</div><div class='add'>+	fun = ASINH_FUN;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ATANH:</div><div class='add'>+	fun = ATANH_FUN;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ACOSH:</div><div class='add'>+	fun = ACOSH_FUN;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLMATH_CONJ:</div><div class='add'>+      case SLMATH_REAL:</div><div class='add'>+	for (i = 0; i &lt; na; i++)</div><div class='add'>+	  b[i] = a[i];</div><div class='add'>+	return 1;</div><div class='add'>+      case SLMATH_IMAG:</div><div class='add'>+	for (i = 0; i &lt; na; i++)</div><div class='add'>+	  b[i] = 0.0;</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; na; i++)</div><div class='add'>+     b[i] = (float) (*fun) ((double) a[i]);</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int generic_math_op (int op,</div><div class='add'>+			    unsigned char type, VOID_STAR ap, unsigned int na,</div><div class='add'>+			    VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   double *b;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   SLang_To_Double_Fun_Type to_double;</div><div class='add'>+   double (*fun) (double);</div><div class='add'>+   unsigned int da;</div><div class='add'>+   char *a;</div><div class='add'>+</div><div class='add'>+   if (NULL == (to_double = SLarith_get_to_double_fun (type, &amp;da)))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   b = (double *) bp;</div><div class='add'>+   a = (char *) ap;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLMATH_SINH:</div><div class='add'>+	fun = sinh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_COSH:</div><div class='add'>+	fun = cosh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_TANH:</div><div class='add'>+	fun = tanh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_TAN:</div><div class='add'>+	fun = tan;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ASIN:</div><div class='add'>+	fun = asin;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ACOS:</div><div class='add'>+	fun = acos;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ATAN:</div><div class='add'>+	fun = atan;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_EXP:</div><div class='add'>+	fun = exp;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_LOG:</div><div class='add'>+	fun = log;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_LOG10:</div><div class='add'>+	fun = log10;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_SQRT:</div><div class='add'>+	fun = sqrt;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_SIN:</div><div class='add'>+	fun = sin;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_COS:</div><div class='add'>+	fun = cos;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLMATH_ASINH:</div><div class='add'>+	fun = ASINH_FUN;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ATANH:</div><div class='add'>+	fun = ATANH_FUN;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ACOSH:</div><div class='add'>+	fun = ACOSH_FUN;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+      case SLMATH_CONJ:</div><div class='add'>+      case SLMATH_REAL:</div><div class='add'>+	for (i = 0; i &lt; na; i++)</div><div class='add'>+	  {</div><div class='add'>+	     b[i] = to_double((VOID_STAR) a);</div><div class='add'>+	     a += da;</div><div class='add'>+	  }</div><div class='add'>+	return 1;</div><div class='add'>+</div><div class='add'>+      case SLMATH_IMAG:</div><div class='add'>+	for (i = 0; i &lt; na; i++)</div><div class='add'>+	  b[i] = 0.0;</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; na; i++)</div><div class='add'>+     {</div><div class='add'>+	b[i] = (*fun) (to_double ((VOID_STAR) a));</div><div class='add'>+	a += da;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+static int complex_math_op_result (int op, unsigned char a, unsigned char *b)</div><div class='add'>+{</div><div class='add'>+   (void) a;</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	*b = SLANG_COMPLEX_TYPE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLMATH_REAL:</div><div class='add'>+      case SLMATH_IMAG:</div><div class='add'>+	*b = SLANG_DOUBLE_TYPE;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int complex_math_op (int op,</div><div class='add'>+			    unsigned char type, VOID_STAR ap, unsigned int na,</div><div class='add'>+			    VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   double *a, *b;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   unsigned int na2 = na * 2;</div><div class='add'>+   double *(*fun) (double *, double *);</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   a = (double *) ap;</div><div class='add'>+   b = (double *) bp;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLMATH_REAL:</div><div class='add'>+	for (i = 0; i &lt; na; i++)</div><div class='add'>+	  b[i] = a[2 * i];</div><div class='add'>+	return 1;</div><div class='add'>+</div><div class='add'>+      case SLMATH_IMAG:</div><div class='add'>+	for (i = 0; i &lt; na; i++)</div><div class='add'>+	  b[i] = a[2 * i + 1];</div><div class='add'>+	return 1;</div><div class='add'>+</div><div class='add'>+      case SLMATH_CONJ:</div><div class='add'>+	for (i = 0; i &lt; na2; i += 2)</div><div class='add'>+	  {</div><div class='add'>+	     b[i] = a[i];</div><div class='add'>+	     b[i+1] = -a[i+1];</div><div class='add'>+	  }</div><div class='add'>+	return 1;</div><div class='add'>+</div><div class='add'>+      case SLMATH_ATANH:</div><div class='add'>+	fun = SLcomplex_atanh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ACOSH:</div><div class='add'>+	fun = SLcomplex_acosh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ASINH:</div><div class='add'>+	fun = SLcomplex_asinh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_EXP:</div><div class='add'>+	fun = SLcomplex_exp;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_LOG:</div><div class='add'>+	fun = SLcomplex_log;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_LOG10:</div><div class='add'>+	fun = SLcomplex_log10;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_SQRT:</div><div class='add'>+	fun = SLcomplex_sqrt;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_SIN:</div><div class='add'>+	fun = SLcomplex_sin;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_COS:</div><div class='add'>+	fun = SLcomplex_cos;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_SINH:</div><div class='add'>+	fun = SLcomplex_sinh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_COSH:</div><div class='add'>+	fun = SLcomplex_cosh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_TANH:</div><div class='add'>+	fun = SLcomplex_tanh;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_TAN:</div><div class='add'>+	fun = SLcomplex_tan;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ASIN:</div><div class='add'>+	fun = SLcomplex_asin;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ACOS:</div><div class='add'>+	fun = SLcomplex_acos;</div><div class='add'>+	break;</div><div class='add'>+      case SLMATH_ATAN:</div><div class='add'>+	fun = SLcomplex_atan;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; na2; i += 2)</div><div class='add'>+     (void) (*fun) (b + i, a + i);</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_DConstant_Type DConst_Table [] =</div><div class='add'>+{</div><div class='add'>+   MAKE_DCONSTANT("E", 2.718281828459045),</div><div class='add'>+   MAKE_DCONSTANT("PI", 3.14159265358979323846264338327950288),</div><div class='add'>+   SLANG_END_DCONST_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static SLang_Math_Unary_Type SLmath_Table [] =</div><div class='add'>+{</div><div class='add'>+   MAKE_MATH_UNARY("sinh", SLMATH_SINH),</div><div class='add'>+   MAKE_MATH_UNARY("asinh", SLMATH_ASINH),</div><div class='add'>+   MAKE_MATH_UNARY("cosh", SLMATH_COSH),</div><div class='add'>+   MAKE_MATH_UNARY("acosh", SLMATH_ACOSH),</div><div class='add'>+   MAKE_MATH_UNARY("tanh", SLMATH_TANH),</div><div class='add'>+   MAKE_MATH_UNARY("atanh", SLMATH_ATANH),</div><div class='add'>+   MAKE_MATH_UNARY("sin", SLMATH_SIN),</div><div class='add'>+   MAKE_MATH_UNARY("cos", SLMATH_COS),</div><div class='add'>+   MAKE_MATH_UNARY("tan", SLMATH_TAN),</div><div class='add'>+   MAKE_MATH_UNARY("atan", SLMATH_ATAN),</div><div class='add'>+   MAKE_MATH_UNARY("acos", SLMATH_ACOS),</div><div class='add'>+   MAKE_MATH_UNARY("asin", SLMATH_ASIN),</div><div class='add'>+   MAKE_MATH_UNARY("exp", SLMATH_EXP),</div><div class='add'>+   MAKE_MATH_UNARY("log", SLMATH_LOG),</div><div class='add'>+   MAKE_MATH_UNARY("sqrt", SLMATH_SQRT),</div><div class='add'>+   MAKE_MATH_UNARY("log10", SLMATH_LOG10),</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+   MAKE_MATH_UNARY("Real", SLMATH_REAL),</div><div class='add'>+   MAKE_MATH_UNARY("Imag", SLMATH_IMAG),</div><div class='add'>+   MAKE_MATH_UNARY("Conj", SLMATH_CONJ),</div><div class='add'>+#endif</div><div class='add'>+   SLANG_END_MATH_UNARY_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type SLang_Math_Table [] =</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_0("polynom", math_poly, SLANG_DOUBLE_TYPE),</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLang_init_slmath (void)</div><div class='add'>+{</div><div class='add'>+   unsigned char *int_types;</div><div class='add'>+</div><div class='add'>+#if defined(__unix__)</div><div class='add'>+   (void) SIGNAL (SIGFPE, math_floating_point_exception);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   int_types = _SLarith_Arith_Types;</div><div class='add'>+</div><div class='add'>+   while (*int_types != SLANG_FLOAT_TYPE)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLclass_add_math_op (*int_types, generic_math_op, double_math_op_result))</div><div class='add'>+	  return -1;</div><div class='add'>+	int_types++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLclass_add_math_op (SLANG_FLOAT_TYPE, float_math_op, double_math_op_result))</div><div class='add'>+       || (-1 == SLclass_add_math_op (SLANG_DOUBLE_TYPE, double_math_op, double_math_op_result))</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+       || (-1 == SLclass_add_math_op (SLANG_COMPLEX_TYPE, complex_math_op, complex_math_op_result))</div><div class='add'>+#endif</div><div class='add'>+       )</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLadd_math_unary_table (SLmath_Table, "__SLMATH__"))</div><div class='add'>+       || (-1 == SLadd_intrin_fun_table (SLang_Math_Table, NULL))</div><div class='add'>+       || (-1 == SLadd_dconstant_table (DConst_Table, NULL)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slmemchr.c b/mdk-stage1/slang/slmemchr.c<br/>new file mode 100644<br/>index 000000000..1417bc549<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmemchr.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemchr.c</a></div><div class='hunk'>@@ -0,0 +1,47 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* These routines are fast memcpy, memset routines.  When available, I</div><div class='add'>+   use system rouines.  For msdos, I use inline assembly. */</div><div class='add'>+</div><div class='add'>+/* The current versions only work in the forward direction only!! */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+char *SLmemchr(register char *p, register char c, register int n)</div><div class='add'>+{</div><div class='add'>+   int n2;</div><div class='add'>+   register char *pmax;</div><div class='add'>+</div><div class='add'>+   pmax = p + (n - 32);</div><div class='add'>+</div><div class='add'>+   while (p &lt;= pmax)</div><div class='add'>+     {</div><div class='add'>+	if ((*p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+	    || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+	    || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+	    || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+	    || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+	    || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+	    || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)</div><div class='add'>+	    || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c))</div><div class='add'>+	  return p;</div><div class='add'>+	p++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   n2 = n % 32;</div><div class='add'>+</div><div class='add'>+   while (n2--)</div><div class='add'>+     {</div><div class='add'>+	if (*p == c) return p;</div><div class='add'>+	p++;</div><div class='add'>+     }</div><div class='add'>+   return(NULL);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slmemcmp.c b/mdk-stage1/slang/slmemcmp.c<br/>new file mode 100644<br/>index 000000000..c5ed50095<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmemcmp.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemcmp.c</a></div><div class='hunk'>@@ -0,0 +1,76 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* These routines are fast memcpy, memset routines.  When available, I</div><div class='add'>+   use system rouines.  For msdos, I use inline assembly. */</div><div class='add'>+</div><div class='add'>+/* The current versions only work in the forward direction only!! */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* This is an UNSIGNED comparison designed for systems that either do not have</div><div class='add'>+* this function or performed a signed comparison (SunOS)</div><div class='add'>+*/</div><div class='add'>+int SLmemcmp(register char *s1, register char *s2, int n)</div><div class='add'>+{</div><div class='add'>+   register int cmp;</div><div class='add'>+   register char *s1max;</div><div class='add'>+</div><div class='add'>+   s1max = s1 + (n - 32);</div><div class='add'>+</div><div class='add'>+   while (s1 &lt;= s1max)</div><div class='add'>+     {</div><div class='add'>+	if (*s1 != *s2) return ((unsigned char) *s1 - (unsigned char) *s2);</div><div class='add'>+	if (*(s1 + 1) != *(s2 + 1)) return ((unsigned char) *(s1 + 1) - (unsigned char) *(s2 + 1));</div><div class='add'>+	if (*(s1 + 2) != *(s2 + 2)) return ((unsigned char) *(s1 + 2) - (unsigned char) *(s2 + 2));</div><div class='add'>+	if (*(s1 + 3) != *(s2 + 3)) return ((unsigned char) *(s1 + 3) - (unsigned char) *(s2 + 3));</div><div class='add'>+	if (*(s1 + 4) != *(s2 + 4)) return ((unsigned char) *(s1 + 4) - (unsigned char) *(s2 + 4));</div><div class='add'>+	if (*(s1 + 5) != *(s2 + 5)) return ((unsigned char) *(s1 + 5) - (unsigned char) *(s2 + 5));</div><div class='add'>+	if (*(s1 + 6) != *(s2 + 6)) return ((unsigned char) *(s1 + 6) - (unsigned char) *(s2 + 6));</div><div class='add'>+	if (*(s1 + 7) != *(s2 + 7)) return ((unsigned char) *(s1 + 7) - (unsigned char) *(s2 + 7));</div><div class='add'>+	if (*(s1 + 8) != *(s2 + 8)) return ((unsigned char) *(s1 + 8) - (unsigned char) *(s2 + 8));</div><div class='add'>+	if (*(s1 + 9) != *(s2 + 9)) return ((unsigned char) *(s1 + 9) - (unsigned char) *(s2 + 9));</div><div class='add'>+	if (*(s1 + 10) != *(s2 + 10)) return ((unsigned char) *(s1 + 10) - (unsigned char) *(s2 + 10));</div><div class='add'>+	if (*(s1 + 11) != *(s2 + 11)) return ((unsigned char) *(s1 + 11) - (unsigned char) *(s2 + 11));</div><div class='add'>+	if (*(s1 + 12) != *(s2 + 12)) return ((unsigned char) *(s1 + 12) - (unsigned char) *(s2 + 12));</div><div class='add'>+	if (*(s1 + 13) != *(s2 + 13)) return ((unsigned char) *(s1 + 13) - (unsigned char) *(s2 + 13));</div><div class='add'>+	if (*(s1 + 14) != *(s2 + 14)) return ((unsigned char) *(s1 + 14) - (unsigned char) *(s2 + 14));</div><div class='add'>+	if (*(s1 + 15) != *(s2 + 15)) return ((unsigned char) *(s1 + 15) - (unsigned char) *(s2 + 15));</div><div class='add'>+	if (*(s1 + 16) != *(s2 + 16)) return ((unsigned char) *(s1 + 16) - (unsigned char) *(s2 + 16));</div><div class='add'>+	if (*(s1 + 17) != *(s2 + 17)) return ((unsigned char) *(s1 + 17) - (unsigned char) *(s2 + 17));</div><div class='add'>+	if (*(s1 + 18) != *(s2 + 18)) return ((unsigned char) *(s1 + 18) - (unsigned char) *(s2 + 18));</div><div class='add'>+	if (*(s1 + 19) != *(s2 + 19)) return ((unsigned char) *(s1 + 19) - (unsigned char) *(s2 + 19));</div><div class='add'>+	if (*(s1 + 20) != *(s2 + 20)) return ((unsigned char) *(s1 + 20) - (unsigned char) *(s2 + 20));</div><div class='add'>+	if (*(s1 + 21) != *(s2 + 21)) return ((unsigned char) *(s1 + 21) - (unsigned char) *(s2 + 21));</div><div class='add'>+	if (*(s1 + 22) != *(s2 + 22)) return ((unsigned char) *(s1 + 22) - (unsigned char) *(s2 + 22));</div><div class='add'>+	if (*(s1 + 23) != *(s2 + 23)) return ((unsigned char) *(s1 + 23) - (unsigned char) *(s2 + 23));</div><div class='add'>+	if (*(s1 + 24) != *(s2 + 24)) return ((unsigned char) *(s1 + 24) - (unsigned char) *(s2 + 24));</div><div class='add'>+	if (*(s1 + 25) != *(s2 + 25)) return ((unsigned char) *(s1 + 25) - (unsigned char) *(s2 + 25));</div><div class='add'>+	if (*(s1 + 26) != *(s2 + 26)) return ((unsigned char) *(s1 + 26) - (unsigned char) *(s2 + 26));</div><div class='add'>+	if (*(s1 + 27) != *(s2 + 27)) return ((unsigned char) *(s1 + 27) - (unsigned char) *(s2 + 27));</div><div class='add'>+	if (*(s1 + 28) != *(s2 + 28)) return ((unsigned char) *(s1 + 28) - (unsigned char) *(s2 + 28));</div><div class='add'>+	if (*(s1 + 29) != *(s2 + 29)) return ((unsigned char) *(s1 + 29) - (unsigned char) *(s2 + 29));</div><div class='add'>+	if (*(s1 + 30) != *(s2 + 30)) return ((unsigned char) *(s1 + 30) - (unsigned char) *(s2 + 30));</div><div class='add'>+	if (*(s1 + 31) != *(s2 + 31)) return ((unsigned char) *(s1 + 31) - (unsigned char) *(s2 + 31));</div><div class='add'>+	s1 += 32; s2 += 32;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   s1max = s1 + (n % 32);</div><div class='add'>+</div><div class='add'>+   while (s1 &lt; s1max)</div><div class='add'>+     {</div><div class='add'>+	cmp = (unsigned char) *s1 - (unsigned char) *s2;</div><div class='add'>+	if (cmp) return(cmp);</div><div class='add'>+	s1++;</div><div class='add'>+	s2++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return(0);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slmemcpy.c b/mdk-stage1/slang/slmemcpy.c<br/>new file mode 100644<br/>index 000000000..e8665e4c6<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmemcpy.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemcpy.c</a></div><div class='hunk'>@@ -0,0 +1,49 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* These routines are fast memcpy, memset routines.  When available, I</div><div class='add'>+   use system rouines.  For msdos, I use inline assembly. */</div><div class='add'>+</div><div class='add'>+/* The current versions only work in the forward direction only!! */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+char *SLmemcpy(char *s1, char *s2, int n)</div><div class='add'>+{</div><div class='add'>+#if defined(__BORLANDC__) &amp;&amp; defined(__MSDOS__)</div><div class='add'>+   asm mov ax, ds</div><div class='add'>+   asm mov bx, si</div><div class='add'>+   asm mov dx, di</div><div class='add'>+   asm mov cx, n</div><div class='add'>+   asm les di, s1</div><div class='add'>+   asm lds si, s2</div><div class='add'>+   asm cld</div><div class='add'>+   asm rep movsb</div><div class='add'>+   asm mov ds, ax</div><div class='add'>+   asm mov si, bx</div><div class='add'>+   asm mov di, dx</div><div class='add'>+   return(s1);</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+   register char *smax, *s = s1;</div><div class='add'>+   int n2;</div><div class='add'>+</div><div class='add'>+   n2 = n % 4;</div><div class='add'>+   smax = s + (n - 4);</div><div class='add'>+   while (s &lt;= smax)</div><div class='add'>+     {</div><div class='add'>+	*s = *s2; *(s + 1) = *(s2 + 1); *(s + 2) = *(s2 + 2); *(s + 3) = *(s2 + 3);</div><div class='add'>+	s += 4;</div><div class='add'>+	s2 += 4;</div><div class='add'>+     }</div><div class='add'>+   while (n2--) *s++ = *s2++;</div><div class='add'>+   return(s1);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slmemset.c b/mdk-stage1/slang/slmemset.c<br/>new file mode 100644<br/>index 000000000..3851663c5<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmemset.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmemset.c</a></div><div class='hunk'>@@ -0,0 +1,39 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* These routines are fast memcpy, memset routines.  When available, I</div><div class='add'>+   use system rouines.  For msdos, I use inline assembly. */</div><div class='add'>+</div><div class='add'>+/* The current versions only work in the forward direction only!! */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+void SLmemset(char *p, char space, int n)</div><div class='add'>+{</div><div class='add'>+#if defined(__BORLANDC__) &amp;&amp; defined(__MSDOS__)</div><div class='add'>+   asm mov al, space</div><div class='add'>+   asm mov dx, di</div><div class='add'>+   asm mov cx, n</div><div class='add'>+   asm les di, p</div><div class='add'>+   asm cld</div><div class='add'>+   asm rep stosb</div><div class='add'>+   asm mov di, dx</div><div class='add'>+#else</div><div class='add'>+   register char *pmax;</div><div class='add'>+</div><div class='add'>+   pmax = p + (n - 4);</div><div class='add'>+   n = n % 4;</div><div class='add'>+   while (p &lt;= pmax)</div><div class='add'>+     {</div><div class='add'>+	*p++ = space; *p++ = space; *p++ = space; *p++= space;</div><div class='add'>+     }</div><div class='add'>+   while (n--) *p++ = space;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slmisc.c b/mdk-stage1/slang/slmisc.c<br/>new file mode 100644<br/>index 000000000..ccc7a9bdf<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slmisc.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slmisc.c</a></div><div class='hunk'>@@ -0,0 +1,330 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#define DEBUG_MALLOC 0</div><div class='add'>+</div><div class='add'>+#if DEBUG_MALLOC</div><div class='add'>+# define SLREALLOC_FUN	SLdebug_realloc</div><div class='add'>+# define SLMALLOC_FUN	SLdebug_malloc</div><div class='add'>+# define SLFREE_FUN	SLdebug_free</div><div class='add'>+#else</div><div class='add'>+# define SLREALLOC_FUN	SLREALLOC</div><div class='add'>+# define SLMALLOC_FUN	SLMALLOC</div><div class='add'>+# define SLFREE_FUN	SLFREE</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* Version information goes here since this file is always needed. */</div><div class='add'>+int SLang_Version = SLANG_VERSION;</div><div class='add'>+char *SLang_Version_String = SLANG_VERSION_STRING;</div><div class='add'>+</div><div class='add'>+char *SLmake_string(char *str)</div><div class='add'>+{</div><div class='add'>+   return SLmake_nstring(str, strlen (str));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLmake_nstring (char *str, unsigned int n)</div><div class='add'>+{</div><div class='add'>+   char *ptr;</div><div class='add'>+</div><div class='add'>+   if (NULL == (ptr = SLmalloc(n + 1)))</div><div class='add'>+     {</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   SLMEMCPY (ptr, str, n);</div><div class='add'>+   ptr[n] = 0;</div><div class='add'>+   return(ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLmake_lut (unsigned char *lut, unsigned char *range, unsigned char reverse)</div><div class='add'>+{</div><div class='add'>+   register unsigned char *l = lut, *lmax = lut + 256;</div><div class='add'>+   int i, r1, r2;</div><div class='add'>+</div><div class='add'>+   while (l &lt; lmax) *l++ = reverse;</div><div class='add'>+   reverse = !reverse;</div><div class='add'>+</div><div class='add'>+   r1 = *range++;</div><div class='add'>+   while (r1)</div><div class='add'>+     {</div><div class='add'>+	r2 = *range++;</div><div class='add'>+	if ((r2 == '-') &amp;&amp; (*range != 0))</div><div class='add'>+	  {</div><div class='add'>+	     r2 = *range++;</div><div class='add'>+	     for (i = r1; i &lt;= r2; i++) lut[i] = reverse;</div><div class='add'>+	     r1 = *range++;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+	lut[r1] = reverse;</div><div class='add'>+	r1 = r2;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLmalloc (unsigned int len)</div><div class='add'>+{</div><div class='add'>+   char *p;</div><div class='add'>+</div><div class='add'>+   p = (char *) SLMALLOC_FUN (len);</div><div class='add'>+   if (p == NULL)</div><div class='add'>+     SLang_Error = SL_MALLOC_ERROR;</div><div class='add'>+</div><div class='add'>+   return p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLfree (char *p)</div><div class='add'>+{</div><div class='add'>+   if (p != NULL) SLFREE_FUN (p);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLrealloc (char *p, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   if (len == 0)</div><div class='add'>+     {</div><div class='add'>+	SLfree (p);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (p == NULL) p = SLmalloc (len);</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	p = (char *)SLREALLOC_FUN (p, len);</div><div class='add'>+	if (p == NULL)</div><div class='add'>+	  SLang_Error = SL_MALLOC_ERROR;</div><div class='add'>+     }</div><div class='add'>+   return p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLcalloc (unsigned int nelems, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   char *p;</div><div class='add'>+</div><div class='add'>+   len = nelems * len;</div><div class='add'>+   p = SLmalloc (len);</div><div class='add'>+   if (p != NULL) SLMEMSET (p, 0, len);</div><div class='add'>+   return p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* p and ch may point to the same buffer */</div><div class='add'>+char *_SLexpand_escaped_char(char *p, char *ch)</div><div class='add'>+{</div><div class='add'>+   int i = 0;</div><div class='add'>+   int max = 0, num, base = 0;</div><div class='add'>+   char ch1;</div><div class='add'>+</div><div class='add'>+   ch1 = *p++;</div><div class='add'>+</div><div class='add'>+   switch (ch1)</div><div class='add'>+     {</div><div class='add'>+      default: num = ch1; break;</div><div class='add'>+      case 'n': num = '\n'; break;</div><div class='add'>+      case 't': num = '\t'; break;</div><div class='add'>+      case 'v': num = '\v'; break;</div><div class='add'>+      case 'b': num = '\b'; break;</div><div class='add'>+      case 'r': num = '\r'; break;</div><div class='add'>+      case 'f': num = '\f'; break;</div><div class='add'>+      case 'E': case 'e': num = 27; break;</div><div class='add'>+      case 'a': num = 7;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+	/* octal */</div><div class='add'>+      case '0': case '1': case '2': case '3':</div><div class='add'>+      case '4': case '5': case '6': case '7':</div><div class='add'>+	max = '7';</div><div class='add'>+	base = 8; i = 2; num = ch1 - '0';</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'd':			       /* decimal -- S-Lang extension */</div><div class='add'>+	base = 10;</div><div class='add'>+	i = 3;</div><div class='add'>+	max = '9';</div><div class='add'>+	num = 0;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'x':			       /* hex */</div><div class='add'>+	base = 16;</div><div class='add'>+	max = '9';</div><div class='add'>+	i = 2;</div><div class='add'>+	num = 0;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (i--)</div><div class='add'>+     {</div><div class='add'>+	ch1 = *p;</div><div class='add'>+</div><div class='add'>+	if ((ch1 &lt;= max) &amp;&amp; (ch1 &gt;= '0'))</div><div class='add'>+	  {</div><div class='add'>+	     num = base * num + (ch1 - '0');</div><div class='add'>+	  }</div><div class='add'>+	else if (base == 16)</div><div class='add'>+	  {</div><div class='add'>+	     ch1 |= 0x20;</div><div class='add'>+	     if ((ch1 &lt; 'a') || ((ch1 &gt; 'f'))) break;</div><div class='add'>+	     num = base * num + 10 + (ch1 - 'a');</div><div class='add'>+	  }</div><div class='add'>+	else break;</div><div class='add'>+	p++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *ch = (char) num;</div><div class='add'>+   return p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* s and t could represent the same space */</div><div class='add'>+void SLexpand_escaped_string (register char *s, register char *t,</div><div class='add'>+			      register char *tmax)</div><div class='add'>+{</div><div class='add'>+   char ch;</div><div class='add'>+</div><div class='add'>+   while (t &lt; tmax)</div><div class='add'>+     {</div><div class='add'>+	ch = *t++;</div><div class='add'>+	if (ch == '\\')</div><div class='add'>+	  {</div><div class='add'>+	     t = _SLexpand_escaped_char (t, &amp;ch);</div><div class='add'>+	  }</div><div class='add'>+	*s++ = ch;</div><div class='add'>+     }</div><div class='add'>+   *s = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLextract_list_element (char *list, unsigned int nth, char delim,</div><div class='add'>+			    char *elem, unsigned int buflen)</div><div class='add'>+{</div><div class='add'>+   char *el, *elmax;</div><div class='add'>+   char ch;</div><div class='add'>+</div><div class='add'>+   while (nth &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	while ((0 != (ch = *list)) &amp;&amp; (ch != delim))</div><div class='add'>+	  list++;</div><div class='add'>+</div><div class='add'>+	if (ch == 0) return -1;</div><div class='add'>+</div><div class='add'>+	list++;</div><div class='add'>+	nth--;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   el = elem;</div><div class='add'>+   elmax = el + (buflen - 1);</div><div class='add'>+</div><div class='add'>+   while ((0 != (ch = *list)) &amp;&amp; (ch != delim) &amp;&amp; (el &lt; elmax))</div><div class='add'>+     *el++ = *list++;</div><div class='add'>+   *el = 0;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_VSNPRINTF</div><div class='add'>+int _SLvsnprintf (char *buf, unsigned int buflen, char *fmt, va_list ap)</div><div class='add'>+{</div><div class='add'>+#if 1</div><div class='add'>+   unsigned int len;</div><div class='add'>+</div><div class='add'>+   /* On some systems vsprintf returns useless information.  So, punt */</div><div class='add'>+   vsprintf (buf, fmt, ap);</div><div class='add'>+   len = strlen (buf);</div><div class='add'>+   if (len &gt;= buflen)</div><div class='add'>+     {</div><div class='add'>+	SLang_exit_error ("\</div><div class='add'>+Your system lacks the vsnprintf system call and vsprintf overflowed a buffer.\n\</div><div class='add'>+The integrity of this program has been violated.\n");</div><div class='add'>+	return EOF;		       /* NOT reached */</div><div class='add'>+     }</div><div class='add'>+   return (int)len;</div><div class='add'>+#else</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   status = vsprintf (buf, fmt, ap);</div><div class='add'>+   if (status &gt;= (int) buflen)</div><div class='add'>+     {</div><div class='add'>+	/* If we are lucky, we will get this far.  The real solution is to</div><div class='add'>+	 * provide a working version of vsnprintf</div><div class='add'>+	 */</div><div class='add'>+	SLang_exit_error ("\</div><div class='add'>+Your system lacks the vsnprintf system call and vsprintf overflowed a buffer.\n\</div><div class='add'>+The integrity of this program has been violated.\n");</div><div class='add'>+	return EOF;		       /* NOT reached */</div><div class='add'>+     }</div><div class='add'>+   return status;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_SNPRINTF</div><div class='add'>+int _SLsnprintf (char *buf, unsigned int buflen, char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   va_list ap;</div><div class='add'>+</div><div class='add'>+   va_start (ap, fmt);</div><div class='add'>+   status = _SLvsnprintf (buf, buflen, fmt, ap);</div><div class='add'>+   va_end (ap);</div><div class='add'>+</div><div class='add'>+   return status;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct _Cleanup_Function_Type</div><div class='add'>+{</div><div class='add'>+   struct _Cleanup_Function_Type *next;</div><div class='add'>+   void (*f)(void);</div><div class='add'>+}</div><div class='add'>+Cleanup_Function_Type;</div><div class='add'>+</div><div class='add'>+static Cleanup_Function_Type *Cleanup_Function_List;</div><div class='add'>+</div><div class='add'>+static void cleanup_slang (void)</div><div class='add'>+{</div><div class='add'>+   while (Cleanup_Function_List != NULL)</div><div class='add'>+     {</div><div class='add'>+	Cleanup_Function_Type *next = Cleanup_Function_List-&gt;next;</div><div class='add'>+	(*Cleanup_Function_List-&gt;f)();</div><div class='add'>+	SLFREE_FUN ((char *) Cleanup_Function_List);</div><div class='add'>+	Cleanup_Function_List = next;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_ATEXIT</div><div class='add'>+# ifdef HAVE_ON_EXIT</div><div class='add'>+static void on_exit_cleanup_slang (int arg_unused)</div><div class='add'>+{</div><div class='add'>+   (void) arg_unused;</div><div class='add'>+   cleanup_slang ();</div><div class='add'>+}</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLang_add_cleanup_function (void (*f)(void))</div><div class='add'>+{</div><div class='add'>+   Cleanup_Function_Type *l;</div><div class='add'>+</div><div class='add'>+   l = (Cleanup_Function_Type *) SLMALLOC_FUN (sizeof (Cleanup_Function_Type));</div><div class='add'>+   if (l == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   l-&gt;f = f;</div><div class='add'>+   l-&gt;next = Cleanup_Function_List;</div><div class='add'>+</div><div class='add'>+   if (Cleanup_Function_List == NULL)</div><div class='add'>+     {</div><div class='add'>+#ifdef HAVE_ATEXIT</div><div class='add'>+	(void) atexit (cleanup_slang);</div><div class='add'>+#else</div><div class='add'>+# ifdef HAVE_ON_EXIT</div><div class='add'>+	(void) on_exit (on_exit_cleanup_slang, 0);</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+   Cleanup_Function_List = l;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slnspace.c b/mdk-stage1/slang/slnspace.c<br/>new file mode 100644<br/>index 000000000..174ba7c81<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slnspace.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slnspace.c</a></div><div class='hunk'>@@ -0,0 +1,242 @@</div><div class='add'>+/* -*- mode: C; mode: fold; -*- */</div><div class='add'>+/* slnspace.c  --- Name Space implementation */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static SLang_NameSpace_Type *Namespace_Tables;</div><div class='add'>+</div><div class='add'>+static SLang_NameSpace_Type *find_name_table (char *name)</div><div class='add'>+{</div><div class='add'>+   SLang_NameSpace_Type *table_list;</div><div class='add'>+</div><div class='add'>+   table_list = Namespace_Tables;</div><div class='add'>+   while (table_list != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (0 == strcmp (table_list-&gt;name, name))</div><div class='add'>+	  break;</div><div class='add'>+	table_list = table_list-&gt;next;</div><div class='add'>+     }</div><div class='add'>+   return table_list;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_NameSpace_Type *_SLns_find_namespace (char *name)</div><div class='add'>+{</div><div class='add'>+   SLang_NameSpace_Type *table_list;</div><div class='add'>+</div><div class='add'>+   table_list = Namespace_Tables;</div><div class='add'>+   while (table_list != NULL)</div><div class='add'>+     {</div><div class='add'>+	if ((table_list-&gt;namespace_name != NULL)</div><div class='add'>+	    &amp;&amp; (0 == strcmp (table_list-&gt;namespace_name, name)))</div><div class='add'>+	  break;</div><div class='add'>+	table_list = table_list-&gt;next;</div><div class='add'>+     }</div><div class='add'>+   return table_list;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_NameSpace_Type *_SLns_allocate_namespace (char *name, unsigned int size)</div><div class='add'>+{</div><div class='add'>+   SLang_NameSpace_Type *table_list;</div><div class='add'>+   SLang_Name_Type **nt;</div><div class='add'>+   </div><div class='add'>+   if (NULL != (table_list = find_name_table (name)))</div><div class='add'>+     return table_list;</div><div class='add'>+</div><div class='add'>+   if (NULL == (name = SLang_create_slstring (name)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   if (NULL == (table_list = (SLang_NameSpace_Type *)</div><div class='add'>+		SLmalloc (sizeof (SLang_NameSpace_Type))))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (name);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (NULL == (nt = (SLang_Name_Type **) SLmalloc (sizeof (SLang_Name_Type *) * size)))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (name);</div><div class='add'>+	SLfree ((char *)table_list);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   memset ((char *)nt, 0, size * sizeof (SLang_Name_Type *));</div><div class='add'>+   memset ((char *) table_list, 0, sizeof (SLang_NameSpace_Type));</div><div class='add'>+</div><div class='add'>+   table_list-&gt;name = name;</div><div class='add'>+   table_list-&gt;table = nt;</div><div class='add'>+   table_list-&gt;table_size = size;</div><div class='add'>+</div><div class='add'>+   table_list-&gt;next = Namespace_Tables;</div><div class='add'>+   Namespace_Tables = table_list;</div><div class='add'>+</div><div class='add'>+   return table_list;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLns_set_namespace_name (SLang_NameSpace_Type *t, char *name)</div><div class='add'>+{</div><div class='add'>+   SLang_NameSpace_Type *t1;</div><div class='add'>+   </div><div class='add'>+   t1 = _SLns_find_namespace (name);</div><div class='add'>+   if (t1 == NULL)</div><div class='add'>+     t1 = t;</div><div class='add'>+   </div><div class='add'>+   if ((t != t1) || (*name == 0))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INTRINSIC_ERROR, "Namespace \"%s\" already exists",</div><div class='add'>+		      name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (name = SLang_create_slstring (name)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   SLang_free_slstring (t-&gt;namespace_name);   /* NULL ok */</div><div class='add'>+   t-&gt;namespace_name = name;</div><div class='add'>+   </div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Array_Type *_SLnspace_apropos (SLang_NameSpace_Type *ns, char *pat, unsigned int what)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   unsigned int table_size;</div><div class='add'>+   SLang_Name_Type *t, **table;</div><div class='add'>+   int num_matches;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   SLRegexp_Type rexp;</div><div class='add'>+   unsigned char rbuf[512];</div><div class='add'>+   unsigned int two;</div><div class='add'>+   </div><div class='add'>+   at = NULL;</div><div class='add'>+</div><div class='add'>+   if ((ns == NULL)</div><div class='add'>+       || ((table = ns-&gt;table) == NULL))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   memset ((char *) &amp;rexp, 0, sizeof (SLRegexp_Type));</div><div class='add'>+   rexp.case_sensitive = 1;</div><div class='add'>+   rexp.buf = rbuf;</div><div class='add'>+   rexp.buf_len = sizeof (rbuf);</div><div class='add'>+   rexp.pat = (unsigned char *)pat;</div><div class='add'>+</div><div class='add'>+   if (0 != SLang_regexp_compile (&amp;rexp))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Invalid regular expression: %s", pat);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   table_size = ns-&gt;table_size;</div><div class='add'>+</div><div class='add'>+   two = 2;</div><div class='add'>+   while (two != 0)</div><div class='add'>+     {</div><div class='add'>+	two--;</div><div class='add'>+	</div><div class='add'>+	num_matches = 0;</div><div class='add'>+	for (i = 0; i &lt; table_size; i++)</div><div class='add'>+	  {</div><div class='add'>+	     t = table[i];</div><div class='add'>+	     while (t != NULL)</div><div class='add'>+	       {</div><div class='add'>+		  unsigned int flags;</div><div class='add'>+		  char *name = t-&gt;name;</div><div class='add'>+</div><div class='add'>+		  switch (t-&gt;name_type)</div><div class='add'>+		    {</div><div class='add'>+		     case SLANG_GVARIABLE:</div><div class='add'>+		       flags = 8;</div><div class='add'>+		       break;</div><div class='add'>+		       </div><div class='add'>+		     case SLANG_ICONSTANT:</div><div class='add'>+		     case SLANG_DCONSTANT:</div><div class='add'>+		     case SLANG_RVARIABLE:</div><div class='add'>+		     case SLANG_IVARIABLE:</div><div class='add'>+		       flags = 4;</div><div class='add'>+		       break;</div><div class='add'>+</div><div class='add'>+		     case SLANG_INTRINSIC:</div><div class='add'>+		     case SLANG_MATH_UNARY:</div><div class='add'>+		     case SLANG_APP_UNARY:</div><div class='add'>+		       flags = 1;</div><div class='add'>+		       break;</div><div class='add'>+		       </div><div class='add'>+		     case SLANG_FUNCTION:</div><div class='add'>+		       flags = 2;</div><div class='add'>+		       break;</div><div class='add'>+		       </div><div class='add'>+		     default:</div><div class='add'>+		       flags = 0;</div><div class='add'>+		       break;</div><div class='add'>+		    }</div><div class='add'>+		  </div><div class='add'>+		  if ((flags &amp; what)</div><div class='add'>+		      &amp;&amp; (NULL != SLang_regexp_match ((unsigned char *)name, strlen (name), &amp;rexp)))</div><div class='add'>+		    {</div><div class='add'>+		       if (at != NULL)</div><div class='add'>+			 {</div><div class='add'>+			    if (-1 == SLang_set_array_element (at, &amp;num_matches, (VOID_STAR)&amp;name))</div><div class='add'>+			      goto return_error;</div><div class='add'>+			 }</div><div class='add'>+		       num_matches++;</div><div class='add'>+		    }</div><div class='add'>+		  t = t-&gt;next;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	</div><div class='add'>+	if (at == NULL)</div><div class='add'>+	  {</div><div class='add'>+	     at = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &amp;num_matches, 1);</div><div class='add'>+	     if (at == NULL)</div><div class='add'>+	       goto return_error;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   return at;</div><div class='add'>+   </div><div class='add'>+   return_error:</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_NameSpace_Type *SLns_create_namespace (char *namespace_name)</div><div class='add'>+{   </div><div class='add'>+   SLang_NameSpace_Type *ns;</div><div class='add'>+   static int num;</div><div class='add'>+   char name[64];</div><div class='add'>+</div><div class='add'>+   if (namespace_name == NULL)</div><div class='add'>+     namespace_name = "Global";</div><div class='add'>+</div><div class='add'>+   ns = _SLns_find_namespace (namespace_name);</div><div class='add'>+   if (ns != NULL)</div><div class='add'>+     return ns;</div><div class='add'>+   </div><div class='add'>+   sprintf (name, " *** internal ns &lt;%d&gt; *** ", num);</div><div class='add'>+</div><div class='add'>+   if (NULL == (ns = _SLns_allocate_namespace (name, SLSTATIC_HASH_TABLE_SIZE)))</div><div class='add'>+     return NULL;</div><div class='add'>+   </div><div class='add'>+   num++;</div><div class='add'>+   if (-1 == _SLns_set_namespace_name (ns, namespace_name))</div><div class='add'>+     {</div><div class='add'>+	SLns_delete_namespace (ns);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   return ns;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLns_delete_namespace (SLang_NameSpace_Type *ns)</div><div class='add'>+{</div><div class='add'>+   (void) ns;</div><div class='add'>+   /* V2.0 */</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slospath.c b/mdk-stage1/slang/slospath.c<br/>new file mode 100644<br/>index 000000000..644931e81<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slospath.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slospath.c</a></div><div class='hunk'>@@ -0,0 +1,73 @@</div><div class='add'>+/* Pathname intrinsic functions */</div><div class='add'>+/* Copyright (c) 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static void path_concat (char *a, char *b)</div><div class='add'>+{</div><div class='add'>+   SLang_push_malloced_string (SLpath_dircat (a,b));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void path_extname (char *path)</div><div class='add'>+{</div><div class='add'>+#ifdef VMS</div><div class='add'>+   char *p;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   path = SLpath_extname (path);</div><div class='add'>+#ifndef VMS</div><div class='add'>+   SLang_push_string (path);</div><div class='add'>+#else</div><div class='add'>+   p = strchr (path, ';');</div><div class='add'>+   if (p == NULL)</div><div class='add'>+     (void)SLang_push_string (p);</div><div class='add'>+   else</div><div class='add'>+     (void)SLang_push_malloced_string (SLmake_nstring (path, (unsigned int)(p - path)));</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void path_basename (char *path)</div><div class='add'>+{</div><div class='add'>+   (void) SLang_push_string (SLpath_basename (path));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void path_dirname (char *path)</div><div class='add'>+{</div><div class='add'>+   (void) SLang_push_malloced_string (SLpath_dirname (path));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void path_sans_extname (char *path)</div><div class='add'>+{</div><div class='add'>+   (void) SLang_push_malloced_string (SLpath_pathname_sans_extname (path));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Path_Name_Table [] =</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_SS("path_concat", path_concat, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("path_extname", path_extname, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("path_dirname", path_dirname, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("path_basename", path_basename, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("path_sans_extname", path_sans_extname, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("path_is_absolute", SLpath_is_absolute_path, SLANG_INT_TYPE),</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLang_init_ospath (void)</div><div class='add'>+{</div><div class='add'>+   if (-1 == SLadd_intrin_fun_table(Path_Name_Table, "__OSPATH__"))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slpack.c b/mdk-stage1/slang/slpack.c<br/>new file mode 100644<br/>index 000000000..53ef63643<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slpack.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slpack.c</a></div><div class='hunk'>@@ -0,0 +1,785 @@</div><div class='add'>+/* Pack objects as a binary string */</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifndef isdigit</div><div class='add'>+# define isdigit(c) (((c)&gt;='0')&amp;&amp;((c)&lt;= '9'))</div><div class='add'>+#endif</div><div class='add'>+#ifndef isspace</div><div class='add'>+# define isspace(c) (((c)==' ') || ((c)=='\t') || ((c)=='\n'))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* format description:</div><div class='add'>+ *</div><div class='add'>+ *    s = string (null padded)</div><div class='add'>+ *    S = string (space padded)</div><div class='add'>+ *    c = signed char</div><div class='add'>+ *    C = unsigned char</div><div class='add'>+ *    h = short</div><div class='add'>+ *    H = unsigned short</div><div class='add'>+ *    i = int</div><div class='add'>+ *    I = unsigned int</div><div class='add'>+ *    l = long</div><div class='add'>+ *    L = unsigned long</div><div class='add'>+ *    j = 16 bit signed integer (short)</div><div class='add'>+ *    J = 16 bit unsigned integer (short)</div><div class='add'>+ *    k = 32 bit signed integer (long)</div><div class='add'>+ *    K = 32 bit unsigned integer (long)</div><div class='add'>+ *    f = float (native format)</div><div class='add'>+ *    F = 32 bit double</div><div class='add'>+ *    d = double (native format)</div><div class='add'>+ *    D = 64 bit double</div><div class='add'>+ *    x = null pad byte</div><div class='add'>+ *    &gt; = big-endian mode</div><div class='add'>+ *    &lt; = little-endian mode</div><div class='add'>+ *    = = native mode</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define NATIVE_ORDER		0</div><div class='add'>+#define BIGENDIAN_ORDER		1</div><div class='add'>+#define LILENDIAN_ORDER		2</div><div class='add'>+static int Native_Byte_Order = NATIVE_ORDER;</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char format_type;</div><div class='add'>+   unsigned char data_type;</div><div class='add'>+   unsigned int repeat;</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   char pad;</div><div class='add'>+   int byteorder;</div><div class='add'>+   int is_scalar;</div><div class='add'>+}</div><div class='add'>+Format_Type;</div><div class='add'>+</div><div class='add'>+static int get_int_type_for_size (unsigned int size, unsigned char *s, unsigned char *u)</div><div class='add'>+{</div><div class='add'>+   if (sizeof (int) == size)</div><div class='add'>+     {</div><div class='add'>+	if (s != NULL) *s = SLANG_INT_TYPE;</div><div class='add'>+	if (u != NULL) *u = SLANG_UINT_TYPE;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (sizeof (short) == size)</div><div class='add'>+     {</div><div class='add'>+	if (s != NULL) *s = SLANG_SHORT_TYPE;</div><div class='add'>+	if (u != NULL) *u = SLANG_USHORT_TYPE;</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (sizeof (long) == size)</div><div class='add'>+     {</div><div class='add'>+	if (s != NULL) *s = SLANG_LONG_TYPE;</div><div class='add'>+	if (u != NULL) *u = SLANG_ULONG_TYPE;</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (s != NULL) *s = 0;</div><div class='add'>+   if (u != NULL) *u = 0;</div><div class='add'>+   SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		 "This OS does not support a %u byte int", size);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_float_type_for_size (unsigned int size, unsigned char *s)</div><div class='add'>+{</div><div class='add'>+   if (sizeof (float) == size)</div><div class='add'>+     {</div><div class='add'>+	*s = SLANG_FLOAT_TYPE;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (sizeof (double) == size)</div><div class='add'>+     {</div><div class='add'>+	*s = SLANG_DOUBLE_TYPE;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		 "This OS does not support a %u byte float", size);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_a_format (char **format, Format_Type *ft)</div><div class='add'>+{</div><div class='add'>+   char *f;</div><div class='add'>+   char ch;</div><div class='add'>+   unsigned repeat;</div><div class='add'>+</div><div class='add'>+   f = *format;</div><div class='add'>+</div><div class='add'>+   while (((ch = *f++) != 0)</div><div class='add'>+	  &amp;&amp; isspace (ch))</div><div class='add'>+     ;</div><div class='add'>+</div><div class='add'>+   switch (ch)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	ft-&gt;byteorder = NATIVE_ORDER;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '=':</div><div class='add'>+	ft-&gt;byteorder = NATIVE_ORDER;</div><div class='add'>+	ch = *f++;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '&gt;':</div><div class='add'>+	ft-&gt;byteorder = BIGENDIAN_ORDER;</div><div class='add'>+	ch = *f++;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '&lt;':</div><div class='add'>+	ft-&gt;byteorder = LILENDIAN_ORDER;</div><div class='add'>+	ch = *f++;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (ch == 0)</div><div class='add'>+     {</div><div class='add'>+	f--;</div><div class='add'>+	*format = f;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   ft-&gt;format_type = ch;</div><div class='add'>+   ft-&gt;repeat = 1;</div><div class='add'>+</div><div class='add'>+   if (isdigit (*f))</div><div class='add'>+     {</div><div class='add'>+	repeat = (unsigned int) (*f - '0');</div><div class='add'>+	f++;</div><div class='add'>+</div><div class='add'>+	while (isdigit (*f))</div><div class='add'>+	  {</div><div class='add'>+	     unsigned int repeat10 = 10 * repeat + (unsigned int)(*f - '0');</div><div class='add'>+</div><div class='add'>+	     /* Check overflow */</div><div class='add'>+	     if (repeat != repeat10 / 10)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_verror (SL_OVERFLOW,</div><div class='add'>+				"Repeat count too large in [un]pack format");</div><div class='add'>+		  return -1;</div><div class='add'>+	       }</div><div class='add'>+	     repeat = repeat10;</div><div class='add'>+	     f++;</div><div class='add'>+	  }</div><div class='add'>+	ft-&gt;repeat = repeat;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *format = f;</div><div class='add'>+</div><div class='add'>+   ft-&gt;is_scalar = 1;</div><div class='add'>+   ft-&gt;pad = 0;</div><div class='add'>+</div><div class='add'>+   switch (ft-&gt;format_type)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "[un]pack format character '%c' not supported", ft-&gt;format_type);</div><div class='add'>+	return -1;</div><div class='add'>+</div><div class='add'>+      case 'D':</div><div class='add'>+	ft-&gt;sizeof_type = 8;</div><div class='add'>+	if (-1 == get_float_type_for_size (8, &amp;ft-&gt;data_type))</div><div class='add'>+	  return -1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'd':</div><div class='add'>+	ft-&gt;data_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+	ft-&gt;sizeof_type = sizeof (double);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'F':</div><div class='add'>+	ft-&gt;sizeof_type = 4;</div><div class='add'>+	if (-1 == get_float_type_for_size (4, &amp;ft-&gt;data_type))</div><div class='add'>+	  return -1;</div><div class='add'>+	break;</div><div class='add'>+      case 'f':</div><div class='add'>+	ft-&gt;data_type = SLANG_FLOAT_TYPE;</div><div class='add'>+	ft-&gt;sizeof_type = sizeof (float);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'h':</div><div class='add'>+	ft-&gt;data_type = SLANG_SHORT_TYPE;</div><div class='add'>+	ft-&gt;sizeof_type = sizeof (short);</div><div class='add'>+	break;</div><div class='add'>+      case 'H':</div><div class='add'>+	ft-&gt;data_type = SLANG_USHORT_TYPE;</div><div class='add'>+	ft-&gt;sizeof_type = sizeof (unsigned short);</div><div class='add'>+	break;</div><div class='add'>+      case 'i':</div><div class='add'>+	ft-&gt;data_type = SLANG_INT_TYPE;</div><div class='add'>+	ft-&gt;sizeof_type = sizeof (int);</div><div class='add'>+	break;</div><div class='add'>+      case 'I':</div><div class='add'>+	ft-&gt;data_type = SLANG_UINT_TYPE;</div><div class='add'>+	ft-&gt;sizeof_type = sizeof (unsigned int);</div><div class='add'>+	break;</div><div class='add'>+      case 'l':</div><div class='add'>+	ft-&gt;data_type = SLANG_LONG_TYPE;</div><div class='add'>+	ft-&gt;sizeof_type = sizeof (long);</div><div class='add'>+	break;</div><div class='add'>+      case 'L':</div><div class='add'>+	ft-&gt;data_type = SLANG_ULONG_TYPE;</div><div class='add'>+	ft-&gt;sizeof_type = sizeof (unsigned long);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+	/* 16 bit ints */</div><div class='add'>+      case 'j':</div><div class='add'>+	ft-&gt;sizeof_type = 2;</div><div class='add'>+	if (-1 == get_int_type_for_size (2, &amp;ft-&gt;data_type, NULL))</div><div class='add'>+	  return -1;</div><div class='add'>+	break;</div><div class='add'>+      case 'J':</div><div class='add'>+	ft-&gt;sizeof_type = 2;</div><div class='add'>+	if (-1 == get_int_type_for_size (2, NULL, &amp;ft-&gt;data_type))</div><div class='add'>+	  return -1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+	/* 32 bit ints */</div><div class='add'>+      case 'k':</div><div class='add'>+	ft-&gt;sizeof_type = 4;</div><div class='add'>+	if (-1 == get_int_type_for_size (4, &amp;ft-&gt;data_type, NULL))</div><div class='add'>+	  return -1;</div><div class='add'>+	break;</div><div class='add'>+      case 'K':</div><div class='add'>+	ft-&gt;sizeof_type = 4;</div><div class='add'>+	if (-1 == get_int_type_for_size (4, NULL, &amp;ft-&gt;data_type))</div><div class='add'>+	  return -1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'x':</div><div class='add'>+	ft-&gt;sizeof_type = 1;</div><div class='add'>+	ft-&gt;data_type = 0;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'c':</div><div class='add'>+	ft-&gt;sizeof_type = 1;</div><div class='add'>+	ft-&gt;data_type = SLANG_CHAR_TYPE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'C':</div><div class='add'>+	ft-&gt;data_type = SLANG_UCHAR_TYPE;</div><div class='add'>+	ft-&gt;sizeof_type = 1;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 'S':</div><div class='add'>+      case 'A':</div><div class='add'>+	ft-&gt;pad = ' ';</div><div class='add'>+      case 'a':</div><div class='add'>+      case 's':</div><div class='add'>+	ft-&gt;data_type = SLANG_BSTRING_TYPE;</div><div class='add'>+	ft-&gt;sizeof_type = 1;</div><div class='add'>+	ft-&gt;is_scalar = 0;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int compute_size_for_format (char *format, unsigned int *num_bytes)</div><div class='add'>+{</div><div class='add'>+   unsigned int size;</div><div class='add'>+   Format_Type ft;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   *num_bytes = size = 0;</div><div class='add'>+</div><div class='add'>+   while (1 == (status = parse_a_format (&amp;format, &amp;ft)))</div><div class='add'>+     size += ft.repeat * ft.sizeof_type;</div><div class='add'>+</div><div class='add'>+   *num_bytes = size;</div><div class='add'>+   return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void byte_swap64 (unsigned char *ss, unsigned int n) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   unsigned char *p, *pmax, ch;</div><div class='add'>+</div><div class='add'>+   if (n == 0) return;</div><div class='add'>+   p = (unsigned char *) ss;</div><div class='add'>+   pmax = p + 8 * n;</div><div class='add'>+   while (p &lt; pmax)</div><div class='add'>+     {</div><div class='add'>+	ch = *p;</div><div class='add'>+	*p = *(p + 7);</div><div class='add'>+	*(p + 7) = ch;</div><div class='add'>+</div><div class='add'>+	ch = *(p + 6);</div><div class='add'>+	*(p + 6) = *(p + 1);</div><div class='add'>+	*(p + 1) = ch;</div><div class='add'>+</div><div class='add'>+	ch = *(p + 5);</div><div class='add'>+	*(p + 5) = *(p + 2);</div><div class='add'>+	*(p + 2) = ch;</div><div class='add'>+</div><div class='add'>+	ch = *(p + 4);</div><div class='add'>+	*(p + 4) = *(p + 3);</div><div class='add'>+	*(p + 3) = ch;</div><div class='add'>+</div><div class='add'>+	p += 8;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+static void byte_swap32 (unsigned char *ss, unsigned int n) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   unsigned char *p, *pmax, ch;</div><div class='add'>+</div><div class='add'>+   p = (unsigned char *) ss;</div><div class='add'>+   pmax = p + 4 * n;</div><div class='add'>+   while (p &lt; pmax)</div><div class='add'>+     {</div><div class='add'>+	ch = *p;</div><div class='add'>+	*p = *(p + 3);</div><div class='add'>+	*(p + 3) = ch;</div><div class='add'>+</div><div class='add'>+	ch = *(p + 1);</div><div class='add'>+	*(p + 1) = *(p + 2);</div><div class='add'>+	*(p + 2) = ch;</div><div class='add'>+	p += 4;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+static void byte_swap16 (unsigned char *p, unsigned int nread) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   unsigned char *pmax, ch;</div><div class='add'>+</div><div class='add'>+   pmax = p + 2 * nread;</div><div class='add'>+   while (p &lt; pmax)</div><div class='add'>+     {</div><div class='add'>+	ch = *p;</div><div class='add'>+	*p = *(p + 1);</div><div class='add'>+	*(p + 1) = ch;</div><div class='add'>+	p += 2;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int byteswap (int order, unsigned char *b,  unsigned int size, unsigned int num)</div><div class='add'>+{</div><div class='add'>+   if (Native_Byte_Order == order)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   switch (size)</div><div class='add'>+     {</div><div class='add'>+      case 2:</div><div class='add'>+	byte_swap16 (b, num);</div><div class='add'>+	break;</div><div class='add'>+      case 4:</div><div class='add'>+	byte_swap32 (b, num);</div><div class='add'>+	break;</div><div class='add'>+      case 8:</div><div class='add'>+	byte_swap64 (b, num);</div><div class='add'>+	break;</div><div class='add'>+      default:</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void check_native_byte_order (void)</div><div class='add'>+{</div><div class='add'>+   unsigned short x;</div><div class='add'>+</div><div class='add'>+   if (Native_Byte_Order != NATIVE_ORDER)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   x = 0xFF;</div><div class='add'>+   if (*(unsigned char *)&amp;x == 0xFF)</div><div class='add'>+     Native_Byte_Order = LILENDIAN_ORDER;</div><div class='add'>+   else</div><div class='add'>+     Native_Byte_Order = BIGENDIAN_ORDER;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_BString_Type *</div><div class='add'>+pack_according_to_format (char *format, unsigned int nitems)</div><div class='add'>+{</div><div class='add'>+   unsigned int size, num;</div><div class='add'>+   unsigned char *buf, *b;</div><div class='add'>+   SLang_BString_Type *bs;</div><div class='add'>+   Format_Type ft;</div><div class='add'>+</div><div class='add'>+   buf = NULL;</div><div class='add'>+</div><div class='add'>+   if (-1 == compute_size_for_format (format, &amp;size))</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   if (NULL == (buf = (unsigned char *) SLmalloc (size + 1)))</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   b = buf;</div><div class='add'>+</div><div class='add'>+   while (1 == parse_a_format (&amp;format, &amp;ft))</div><div class='add'>+     {</div><div class='add'>+	unsigned char *ptr;</div><div class='add'>+	unsigned int repeat;</div><div class='add'>+</div><div class='add'>+	repeat = ft.repeat;</div><div class='add'>+	if (ft.data_type == 0)</div><div class='add'>+	  {</div><div class='add'>+	     memset ((char *) b, ft.pad, repeat);</div><div class='add'>+	     b += repeat;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (ft.is_scalar)</div><div class='add'>+	  {</div><div class='add'>+	     unsigned char *bstart;</div><div class='add'>+	     num = repeat;</div><div class='add'>+</div><div class='add'>+	     bstart = b;</div><div class='add'>+	     while (repeat != 0)</div><div class='add'>+	       {</div><div class='add'>+		  unsigned int nelements;</div><div class='add'>+		  SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+		  if (nitems == 0)</div><div class='add'>+		    {</div><div class='add'>+		       SLang_verror (SL_INVALID_PARM,</div><div class='add'>+				     "Not enough items for pack format");</div><div class='add'>+		       goto return_error;</div><div class='add'>+		    }</div><div class='add'>+</div><div class='add'>+		  if (-1 == SLang_pop_array_of_type (&amp;at, ft.data_type))</div><div class='add'>+		    goto return_error;</div><div class='add'>+</div><div class='add'>+		  nelements = at-&gt;num_elements;</div><div class='add'>+		  if (repeat &lt; nelements)</div><div class='add'>+		    nelements = repeat;</div><div class='add'>+		  repeat -= nelements;</div><div class='add'>+</div><div class='add'>+		  nelements = nelements * ft.sizeof_type;</div><div class='add'>+		  memcpy ((char *)b, (char *)at-&gt;data, nelements);</div><div class='add'>+</div><div class='add'>+		  b += nelements;</div><div class='add'>+		  SLang_free_array (at);</div><div class='add'>+		  nitems--;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     if (ft.byteorder != NATIVE_ORDER)</div><div class='add'>+	       byteswap (ft.byteorder, bstart, ft.sizeof_type, num);</div><div class='add'>+</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* Otherwise we have a string */</div><div class='add'>+	if (-1 == SLang_pop_bstring (&amp;bs))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	ptr = SLbstring_get_pointer (bs, &amp;num);</div><div class='add'>+	if (repeat &lt; num) num = repeat;</div><div class='add'>+	memcpy ((char *)b, (char *)ptr, num);</div><div class='add'>+	b += num;</div><div class='add'>+	repeat -= num;</div><div class='add'>+	memset ((char *)b, ft.pad, repeat);</div><div class='add'>+	SLbstring_free (bs);</div><div class='add'>+	b += repeat;</div><div class='add'>+	nitems--;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *b = 0;</div><div class='add'>+   bs = SLbstring_create_malloced (buf, size, 0);</div><div class='add'>+   if (bs == NULL)</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   SLdo_pop_n (nitems);</div><div class='add'>+   return bs;</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   SLdo_pop_n (nitems);</div><div class='add'>+   if (buf != NULL)</div><div class='add'>+     SLfree ((char *) buf);</div><div class='add'>+</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLpack (void)</div><div class='add'>+{</div><div class='add'>+   SLang_BString_Type *bs;</div><div class='add'>+   char *fmt;</div><div class='add'>+   int nitems;</div><div class='add'>+</div><div class='add'>+   check_native_byte_order ();</div><div class='add'>+</div><div class='add'>+   nitems = SLang_Num_Function_Args;</div><div class='add'>+   if (nitems &lt;= 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_SYNTAX_ERROR,</div><div class='add'>+		      "pack: not enough arguments");</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLreverse_stack (nitems))</div><div class='add'>+       || (-1 == SLang_pop_slstring (&amp;fmt)))</div><div class='add'>+     bs = NULL;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	bs = pack_according_to_format (fmt, (unsigned int)nitems - 1);</div><div class='add'>+	SLang_free_slstring (fmt);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_push_bstring (bs);</div><div class='add'>+   SLbstring_free (bs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLunpack (char *format, SLang_BString_Type *bs)</div><div class='add'>+{</div><div class='add'>+   Format_Type ft;</div><div class='add'>+   unsigned char *b;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   unsigned int num_bytes;</div><div class='add'>+</div><div class='add'>+   check_native_byte_order ();</div><div class='add'>+</div><div class='add'>+   if (-1 == compute_size_for_format (format, &amp;num_bytes))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   b = SLbstring_get_pointer (bs, &amp;len);</div><div class='add'>+   if (b == NULL)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (len &lt; num_bytes)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM,</div><div class='add'>+		      "unpack format %s is too large for input string",</div><div class='add'>+		      format);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (1 == parse_a_format (&amp;format, &amp;ft))</div><div class='add'>+     {</div><div class='add'>+	char *str, *s;</div><div class='add'>+</div><div class='add'>+	if (ft.repeat == 0)</div><div class='add'>+	  continue;</div><div class='add'>+</div><div class='add'>+	if (ft.data_type == 0)</div><div class='add'>+	  {			       /* skip padding */</div><div class='add'>+	     b += ft.repeat;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (ft.is_scalar)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_Array_Type *at;</div><div class='add'>+	     int dims;</div><div class='add'>+</div><div class='add'>+	     if (ft.repeat == 1)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+		  cl = _SLclass_get_class (ft.data_type);</div><div class='add'>+		  memcpy ((char *)cl-&gt;cl_transfer_buf, (char *)b, ft.sizeof_type);</div><div class='add'>+		  if (ft.byteorder != NATIVE_ORDER)</div><div class='add'>+		    byteswap (ft.byteorder, (unsigned char *)cl-&gt;cl_transfer_buf, ft.sizeof_type, 1);</div><div class='add'>+</div><div class='add'>+		  if (-1 == (cl-&gt;cl_apush (ft.data_type, cl-&gt;cl_transfer_buf)))</div><div class='add'>+		    return;</div><div class='add'>+		  b += ft.sizeof_type;</div><div class='add'>+		  continue;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     dims = (int) ft.repeat;</div><div class='add'>+	     at = SLang_create_array (ft.data_type, 0, NULL, &amp;dims, 1);</div><div class='add'>+	     if (at == NULL)</div><div class='add'>+	       return;</div><div class='add'>+</div><div class='add'>+	     num_bytes = ft.repeat * ft.sizeof_type;</div><div class='add'>+	     memcpy ((char *)at-&gt;data, (char *)b, num_bytes);</div><div class='add'>+	     if (ft.byteorder != NATIVE_ORDER)</div><div class='add'>+	       byteswap (ft.byteorder, (unsigned char *)at-&gt;data, ft.sizeof_type, ft.repeat);</div><div class='add'>+</div><div class='add'>+	     if (-1 == SLang_push_array (at, 1))</div><div class='add'>+	       return;</div><div class='add'>+</div><div class='add'>+	     b += num_bytes;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	len = ft.repeat;</div><div class='add'>+	str = SLmalloc (len + 1);</div><div class='add'>+	if (str == NULL)</div><div class='add'>+	  return;</div><div class='add'>+</div><div class='add'>+	memcpy ((char *) str, (char *)b, len);</div><div class='add'>+	str [len] = 0;</div><div class='add'>+</div><div class='add'>+	if (ft.pad == ' ')</div><div class='add'>+	  {</div><div class='add'>+	     unsigned int new_len;</div><div class='add'>+</div><div class='add'>+	     s = str + len;</div><div class='add'>+	     while (s &gt; str)</div><div class='add'>+	       {</div><div class='add'>+		  s--;</div><div class='add'>+		  if ((*s != ' ') &amp;&amp; (*s != 0))</div><div class='add'>+		    {</div><div class='add'>+		       s++;</div><div class='add'>+		       break;</div><div class='add'>+		    }</div><div class='add'>+		  *s = 0;</div><div class='add'>+	       }</div><div class='add'>+	     new_len = (unsigned int) (s - str);</div><div class='add'>+</div><div class='add'>+	     if (new_len != len)</div><div class='add'>+	       {</div><div class='add'>+		  s = SLrealloc (str, new_len + 1);</div><div class='add'>+		  if (s == NULL)</div><div class='add'>+		    {</div><div class='add'>+		       SLfree (str);</div><div class='add'>+		       return;</div><div class='add'>+		    }</div><div class='add'>+		  str = s;</div><div class='add'>+		  len = new_len;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* Avoid a bstring if possible */</div><div class='add'>+	s = SLmemchr (str, 0, len);</div><div class='add'>+	if (s == NULL)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == SLang_push_malloced_string (str))</div><div class='add'>+	       return;</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     SLang_BString_Type *new_bs;</div><div class='add'>+</div><div class='add'>+	     new_bs = SLbstring_create_malloced ((unsigned char *)str, len, 1);</div><div class='add'>+	     if (new_bs == NULL)</div><div class='add'>+	       return;</div><div class='add'>+</div><div class='add'>+	     if (-1 == SLang_push_bstring (new_bs))</div><div class='add'>+	       {</div><div class='add'>+		  SLfree (str);</div><div class='add'>+		  return;</div><div class='add'>+	       }</div><div class='add'>+	     SLbstring_free (new_bs);</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	b += ft.repeat;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int _SLpack_compute_size (char *format)</div><div class='add'>+{</div><div class='add'>+   unsigned int n;</div><div class='add'>+</div><div class='add'>+   n = 0;</div><div class='add'>+   (void) compute_size_for_format (format, &amp;n);</div><div class='add'>+   return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLpack_pad_format (char *format)</div><div class='add'>+{</div><div class='add'>+   unsigned int len, max_len;</div><div class='add'>+   Format_Type ft;</div><div class='add'>+   char *buf, *b;</div><div class='add'>+</div><div class='add'>+   check_native_byte_order ();</div><div class='add'>+</div><div class='add'>+   /* Just check the syntax */</div><div class='add'>+   if (-1 == compute_size_for_format (format, &amp;max_len))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   /* This should be sufficient to handle any needed xyy padding characters.</div><div class='add'>+    * I cannot see how this will be overrun</div><div class='add'>+    */</div><div class='add'>+   max_len = 4 * (strlen (format) + 1);</div><div class='add'>+   if (NULL == (buf = SLmalloc (max_len + 1)))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   b = buf;</div><div class='add'>+   len = 0;</div><div class='add'>+   while (1 == parse_a_format (&amp;format, &amp;ft))</div><div class='add'>+     {</div><div class='add'>+	struct { char a; short b; } s_h;</div><div class='add'>+	struct { char a; int b; } s_i;</div><div class='add'>+	struct { char a; long b; } s_l;</div><div class='add'>+	struct { char a; float b; } s_f;</div><div class='add'>+	struct { char a; double b; } s_d;</div><div class='add'>+	unsigned int pad;</div><div class='add'>+</div><div class='add'>+	if (ft.repeat == 0)</div><div class='add'>+	  continue;</div><div class='add'>+</div><div class='add'>+	if (ft.data_type == 0)</div><div class='add'>+	  {			       /* pad */</div><div class='add'>+	     sprintf (b, "x%u", ft.repeat);</div><div class='add'>+	     b += strlen (b);</div><div class='add'>+	     len += ft.repeat;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	switch (ft.data_type)</div><div class='add'>+	  {</div><div class='add'>+	   default:</div><div class='add'>+	   case SLANG_STRING_TYPE:</div><div class='add'>+	   case SLANG_BSTRING_TYPE:</div><div class='add'>+	   case SLANG_CHAR_TYPE:</div><div class='add'>+	   case SLANG_UCHAR_TYPE:</div><div class='add'>+	     pad = 0;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case SLANG_SHORT_TYPE:</div><div class='add'>+	   case SLANG_USHORT_TYPE:</div><div class='add'>+	     pad = ((unsigned int) ((char *)&amp;s_h.b - (char *)&amp;s_h.a));</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case SLANG_INT_TYPE:</div><div class='add'>+	   case SLANG_UINT_TYPE:</div><div class='add'>+	     pad = ((unsigned int) ((char *)&amp;s_i.b - (char *)&amp;s_i.a));</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case SLANG_LONG_TYPE:</div><div class='add'>+	   case SLANG_ULONG_TYPE:</div><div class='add'>+	     pad = ((unsigned int) ((char *)&amp;s_l.b - (char *)&amp;s_l.a));</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case SLANG_FLOAT_TYPE:</div><div class='add'>+	     pad = ((unsigned int) ((char *)&amp;s_f.b - (char *)&amp;s_f.a));</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case SLANG_DOUBLE_TYPE:</div><div class='add'>+	     pad = ((unsigned int) ((char *)&amp;s_d.b - (char *)&amp;s_d.a));</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* Pad to a length that is an integer multiple of pad. */</div><div class='add'>+	if (pad)</div><div class='add'>+	  pad = pad * ((len + pad - 1)/pad) - len;</div><div class='add'>+</div><div class='add'>+	if (pad)</div><div class='add'>+	  {</div><div class='add'>+	     sprintf (b, "x%u", pad);</div><div class='add'>+	     b += strlen (b);</div><div class='add'>+	     len += pad;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	*b++ = ft.format_type;</div><div class='add'>+	if (ft.repeat &gt; 1)</div><div class='add'>+	  {</div><div class='add'>+	     sprintf (b, "%u", ft.repeat);</div><div class='add'>+	     b += strlen (b);</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	len += ft.repeat * ft.sizeof_type;</div><div class='add'>+     }</div><div class='add'>+   *b = 0;</div><div class='add'>+</div><div class='add'>+   (void) SLang_push_malloced_string (buf);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slparse.c b/mdk-stage1/slang/slparse.c<br/>new file mode 100644<br/>index 000000000..bc709d1fb<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slparse.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slparse.c</a></div><div class='hunk'>@@ -0,0 +1,1970 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static SLang_Load_Type *LLT;</div><div class='add'>+int _SLang_Compile_Line_Num_Info;</div><div class='add'>+</div><div class='add'>+static void free_token (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   register unsigned int nrefs = t-&gt;num_refs;</div><div class='add'>+</div><div class='add'>+   if (nrefs == 0)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (nrefs == 1)</div><div class='add'>+     {</div><div class='add'>+	if (t-&gt;free_sval_flag)</div><div class='add'>+	  {</div><div class='add'>+	     if (t-&gt;type == BSTRING_TOKEN)</div><div class='add'>+	       SLbstring_free (t-&gt;v.b_val);</div><div class='add'>+	     else</div><div class='add'>+	       _SLfree_hashed_string (t-&gt;v.s_val, strlen (t-&gt;v.s_val), t-&gt;hash);</div><div class='add'>+	     t-&gt;v.s_val = NULL;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   t-&gt;num_refs = nrefs - 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void init_token (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   memset ((char *) t, 0, sizeof (_SLang_Token_Type));</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   t-&gt;line_number = -1;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Allow room for one push back of a token.  This is necessary for</div><div class='add'>+ * multiple assignment.</div><div class='add'>+ */</div><div class='add'>+static unsigned int Use_Next_Token;</div><div class='add'>+static _SLang_Token_Type Next_Token;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+static int Last_Line_Number = -1;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int unget_token (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     return -1;</div><div class='add'>+   if (Use_Next_Token != 0)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("unget_token failed", ctok, 0);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Use_Next_Token++;</div><div class='add'>+   Next_Token = *ctok;</div><div class='add'>+   init_token (ctok);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_token (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   if (ctok-&gt;num_refs)</div><div class='add'>+     free_token (ctok);</div><div class='add'>+</div><div class='add'>+   if (Use_Next_Token)</div><div class='add'>+     {</div><div class='add'>+	Use_Next_Token--;</div><div class='add'>+	*ctok = Next_Token;</div><div class='add'>+	return ctok-&gt;type;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return _SLget_token (ctok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int compile_token (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   if (_SLang_Compile_Line_Num_Info</div><div class='add'>+       &amp;&amp; (t-&gt;line_number != Last_Line_Number)</div><div class='add'>+       &amp;&amp; (t-&gt;line_number != -1))</div><div class='add'>+     {</div><div class='add'>+	_SLang_Token_Type tok;</div><div class='add'>+	tok.type = LINE_NUM_TOKEN;</div><div class='add'>+	tok.v.long_val = Last_Line_Number = t-&gt;line_number;</div><div class='add'>+	(*_SLcompile_ptr) (&amp;tok);</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   (*_SLcompile_ptr) (t);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+#define USE_PARANOID_MAGIC	0</div><div class='add'>+#if USE_PARANOID_MAGIC</div><div class='add'>+   unsigned long magic;</div><div class='add'>+#endif</div><div class='add'>+   _SLang_Token_Type *stack;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   unsigned int size;</div><div class='add'>+}</div><div class='add'>+Token_List_Type;</div><div class='add'>+</div><div class='add'>+#define MAX_TOKEN_LISTS 16</div><div class='add'>+static Token_List_Type Token_List_Stack [MAX_TOKEN_LISTS];</div><div class='add'>+static unsigned int Token_List_Stack_Depth = 0;</div><div class='add'>+static Token_List_Type *Token_List = NULL;</div><div class='add'>+</div><div class='add'>+static void init_token_list (Token_List_Type *t)</div><div class='add'>+{</div><div class='add'>+   t-&gt;size = 0;</div><div class='add'>+   t-&gt;len = 0;</div><div class='add'>+   t-&gt;stack = NULL;</div><div class='add'>+#if USE_PARANOID_MAGIC</div><div class='add'>+   t-&gt;magic = 0xABCDEF12;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_token_list (Token_List_Type *t)</div><div class='add'>+{</div><div class='add'>+   _SLang_Token_Type *s;</div><div class='add'>+</div><div class='add'>+   if (t == NULL)</div><div class='add'>+     return;</div><div class='add'>+#if USE_PARANOID_MAGIC</div><div class='add'>+   if (t-&gt;magic != 0xABCDEF12)</div><div class='add'>+     {</div><div class='add'>+	SLang_doerror ("Magic error.");</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   s = t-&gt;stack;</div><div class='add'>+   if (s != NULL)</div><div class='add'>+     {</div><div class='add'>+	_SLang_Token_Type *smax = s + t-&gt;len;</div><div class='add'>+	while (s != smax)</div><div class='add'>+	  {</div><div class='add'>+	     if (s-&gt;num_refs) free_token (s);</div><div class='add'>+	     s++;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	SLfree ((char *) t-&gt;stack);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   memset ((char *) t, 0, sizeof (Token_List_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static Token_List_Type *push_token_list (void)</div><div class='add'>+{</div><div class='add'>+   if (Token_List_Stack_Depth == MAX_TOKEN_LISTS)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("Token list stack size exceeded", NULL, 0);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Token_List = Token_List_Stack + Token_List_Stack_Depth;</div><div class='add'>+   Token_List_Stack_Depth++;</div><div class='add'>+   init_token_list (Token_List);</div><div class='add'>+   return Token_List;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_token_list (int do_free)</div><div class='add'>+{</div><div class='add'>+   if (Token_List_Stack_Depth == 0)</div><div class='add'>+     {</div><div class='add'>+	if (SLang_Error == 0)</div><div class='add'>+	  _SLparse_error ("Token list stack underflow", NULL, 0);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   Token_List_Stack_Depth--;</div><div class='add'>+</div><div class='add'>+   if (do_free) free_token_list (Token_List);</div><div class='add'>+</div><div class='add'>+   if (Token_List_Stack_Depth != 0)</div><div class='add'>+     Token_List = Token_List_Stack + (Token_List_Stack_Depth - 1);</div><div class='add'>+   else</div><div class='add'>+     Token_List = NULL;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int check_token_list_space (Token_List_Type *t, unsigned int delta_size)</div><div class='add'>+{</div><div class='add'>+   _SLang_Token_Type *st;</div><div class='add'>+   unsigned int len;</div><div class='add'>+#if USE_PARANOID_MAGIC</div><div class='add'>+   if (t-&gt;magic != 0xABCDEF12)</div><div class='add'>+     {</div><div class='add'>+	SLang_doerror ("Magic error.");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   len = t-&gt;len + delta_size;</div><div class='add'>+   if (len &lt;= t-&gt;size) return 0;</div><div class='add'>+</div><div class='add'>+   if (delta_size &lt; 4)</div><div class='add'>+     {</div><div class='add'>+	delta_size = 4;</div><div class='add'>+	len = t-&gt;len + delta_size;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   st = (_SLang_Token_Type *) SLrealloc((char *) t-&gt;stack,</div><div class='add'>+					len * sizeof(_SLang_Token_Type));</div><div class='add'>+   if (st == NULL)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("Malloc error", NULL, 0);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   memset ((char *) (st + t-&gt;len), 0, delta_size);</div><div class='add'>+</div><div class='add'>+   t-&gt;stack = st;</div><div class='add'>+   t-&gt;size = len;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int append_token (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+   if (-1 == check_token_list_space (Token_List, 1))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   Token_List-&gt;stack [Token_List-&gt;len] = *t;</div><div class='add'>+   Token_List-&gt;len += 1;</div><div class='add'>+   t-&gt;num_refs = 0;		       /* stealing it */</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int append_token_of_type (unsigned char t)</div><div class='add'>+{</div><div class='add'>+   _SLang_Token_Type *tok;</div><div class='add'>+</div><div class='add'>+   if (-1 == check_token_list_space (Token_List, 1))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* The memset when the list was created ensures that the other fields</div><div class='add'>+    * are properly initialized.</div><div class='add'>+    */</div><div class='add'>+   tok = Token_List-&gt;stack + Token_List-&gt;len;</div><div class='add'>+   init_token (tok);</div><div class='add'>+   tok-&gt;type = t;</div><div class='add'>+   Token_List-&gt;len += 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static _SLang_Token_Type *get_last_token (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int len;</div><div class='add'>+</div><div class='add'>+   if ((Token_List == NULL)</div><div class='add'>+       || (0 == (len = Token_List-&gt;len)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   len--;</div><div class='add'>+   return Token_List-&gt;stack + len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function does NOT free the list. */</div><div class='add'>+static int compile_token_list_with_fun (int dir, Token_List_Type *list,</div><div class='add'>+					int (*f)(_SLang_Token_Type *))</div><div class='add'>+{</div><div class='add'>+   _SLang_Token_Type *t0, *t1;</div><div class='add'>+</div><div class='add'>+   if (list == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (f == NULL)</div><div class='add'>+     f = compile_token;</div><div class='add'>+</div><div class='add'>+   t0 = list-&gt;stack;</div><div class='add'>+   t1 = t0 + list-&gt;len;</div><div class='add'>+</div><div class='add'>+   if (dir &lt; 0)</div><div class='add'>+     {</div><div class='add'>+	/* backwards */</div><div class='add'>+</div><div class='add'>+	while ((SLang_Error == 0) &amp;&amp; (t1 &gt; t0))</div><div class='add'>+	  {</div><div class='add'>+	     t1--;</div><div class='add'>+	     (*f) (t1);</div><div class='add'>+	  }</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* forward */</div><div class='add'>+   while ((SLang_Error == 0) &amp;&amp; (t0 &lt; t1))</div><div class='add'>+     {</div><div class='add'>+	(*f) (t0);</div><div class='add'>+	t0++;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int compile_token_list (void)</div><div class='add'>+{</div><div class='add'>+   if (Token_List == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   compile_token_list_with_fun (1, Token_List, NULL);</div><div class='add'>+   pop_token_list (1);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Take all elements in the list from pos2 to the end and exchange them</div><div class='add'>+ * with the elements at pos1, e.g.,</div><div class='add'>+ * ...ABCDEabc ==&gt; ...abcABCDE</div><div class='add'>+ * where pos1 denotes A and pos2 denotes a.</div><div class='add'>+ */</div><div class='add'>+static int token_list_element_exchange (unsigned int pos1, unsigned int pos2)</div><div class='add'>+{</div><div class='add'>+   _SLang_Token_Type *s, *s1, *s2;</div><div class='add'>+   unsigned int len, nloops;</div><div class='add'>+</div><div class='add'>+   if (Token_List == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   s = Token_List-&gt;stack;</div><div class='add'>+   len = Token_List-&gt;len;</div><div class='add'>+</div><div class='add'>+   if ((s == NULL) || (len == 0)</div><div class='add'>+       || (pos2 &gt;= len))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* This may not be the most efficient algorithm but the number to swap</div><div class='add'>+    * is most-likely going to be small, e.g, 3</div><div class='add'>+    * The algorithm is to rotate the list.  The particular rotation</div><div class='add'>+    * direction was chosen to make insert_token fast.</div><div class='add'>+    * It works like:</div><div class='add'>+    * @ ABCabcde --&gt; BCabcdeA --&gt; CabcdeAB --&gt;  abcdefAB</div><div class='add'>+    * which is optimal for Abcdef sequence produced by function calls.</div><div class='add'>+    *</div><div class='add'>+    * Profiling indicates that nloops is almost always 1, whereas the inner</div><div class='add'>+    * loop can loop many times (e.g., 9 times).</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   s2 = s + (len - 1);</div><div class='add'>+   s1 = s + pos1;</div><div class='add'>+   nloops = pos2 - pos1;</div><div class='add'>+</div><div class='add'>+   while (nloops)</div><div class='add'>+     {</div><div class='add'>+	_SLang_Token_Type save;</div><div class='add'>+</div><div class='add'>+	s = s1;</div><div class='add'>+	save = *s;</div><div class='add'>+</div><div class='add'>+	while (s &lt; s2)</div><div class='add'>+	  {</div><div class='add'>+	     *s = *(s + 1);</div><div class='add'>+	     s++;</div><div class='add'>+	  }</div><div class='add'>+	*s = save;</div><div class='add'>+</div><div class='add'>+	nloops--;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+static int insert_token (_SLang_Token_Type *t, unsigned int pos)</div><div class='add'>+{</div><div class='add'>+   if (-1 == append_token (t))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return token_list_element_exchange (pos, Token_List-&gt;len - 1);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+static void compile_token_of_type (unsigned char t)</div><div class='add'>+{</div><div class='add'>+   _SLang_Token_Type tok;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   tok.line_number = -1;</div><div class='add'>+#endif</div><div class='add'>+   tok.type = t;</div><div class='add'>+   compile_token(&amp;tok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void statement (_SLang_Token_Type *);</div><div class='add'>+static void compound_statement (_SLang_Token_Type *);</div><div class='add'>+static void expression_with_parenthesis (_SLang_Token_Type *);</div><div class='add'>+static void handle_semicolon (_SLang_Token_Type *);</div><div class='add'>+static void statement_list (_SLang_Token_Type *);</div><div class='add'>+static void variable_list (_SLang_Token_Type *, unsigned char);</div><div class='add'>+static void struct_declaration (_SLang_Token_Type *);</div><div class='add'>+static void define_function_args (_SLang_Token_Type *);</div><div class='add'>+static void typedef_definition (_SLang_Token_Type *);</div><div class='add'>+static void function_args_expression (_SLang_Token_Type *, int);</div><div class='add'>+static void expression (_SLang_Token_Type *);</div><div class='add'>+static void expression_with_commas (_SLang_Token_Type *, int);</div><div class='add'>+static void simple_expression (_SLang_Token_Type *);</div><div class='add'>+static void unary_expression (_SLang_Token_Type *);</div><div class='add'>+static void postfix_expression (_SLang_Token_Type *);</div><div class='add'>+static int check_for_lvalue (unsigned char, _SLang_Token_Type *);</div><div class='add'>+/* static void primary_expression (_SLang_Token_Type *); */</div><div class='add'>+static void block (_SLang_Token_Type *);</div><div class='add'>+static void inline_array_expression (_SLang_Token_Type *);</div><div class='add'>+static void array_index_expression (_SLang_Token_Type *);</div><div class='add'>+static void do_multiple_assignment (_SLang_Token_Type *);</div><div class='add'>+static void try_multiple_assignment (_SLang_Token_Type *);</div><div class='add'>+#if 0</div><div class='add'>+static void not_implemented (char *what)</div><div class='add'>+{</div><div class='add'>+   char err [256];</div><div class='add'>+   sprintf (err, "Expression not implemented: %s", what);</div><div class='add'>+   _SLparse_error (err, NULL, 0);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+static void rpn_parse_line (_SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+   do</div><div class='add'>+     {</div><div class='add'>+	  /* multiple RPN tokens possible when the file looks like:</div><div class='add'>+	   * . &lt;end of line&gt;</div><div class='add'>+	   * . &lt;end of line&gt;</div><div class='add'>+	   */</div><div class='add'>+	if (tok-&gt;type != RPN_TOKEN)</div><div class='add'>+	  compile_token (tok);</div><div class='add'>+	free_token (tok);</div><div class='add'>+     }</div><div class='add'>+   while (EOF_TOKEN != _SLget_rpn_token (tok));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_identifier_token (_SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+   if (IDENT_TOKEN == get_token (tok))</div><div class='add'>+     return IDENT_TOKEN;</div><div class='add'>+</div><div class='add'>+   _SLparse_error ("Expecting identifier", tok, 0);</div><div class='add'>+   return tok-&gt;type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void define_function (_SLang_Token_Type *ctok, unsigned char type)</div><div class='add'>+{</div><div class='add'>+   _SLang_Token_Type fname;</div><div class='add'>+   </div><div class='add'>+   switch (type)</div><div class='add'>+     {</div><div class='add'>+      case STATIC_TOKEN:</div><div class='add'>+	type = DEFINE_STATIC_TOKEN;</div><div class='add'>+	break;</div><div class='add'>+	</div><div class='add'>+      case PUBLIC_TOKEN:</div><div class='add'>+	type = DEFINE_PUBLIC_TOKEN;</div><div class='add'>+	break;</div><div class='add'>+	</div><div class='add'>+      case PRIVATE_TOKEN:</div><div class='add'>+	type = DEFINE_PRIVATE_TOKEN;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   init_token (&amp;fname);</div><div class='add'>+   if (IDENT_TOKEN != get_identifier_token (&amp;fname))</div><div class='add'>+     {</div><div class='add'>+	free_token (&amp;fname);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   compile_token_of_type(OPAREN_TOKEN);</div><div class='add'>+   get_token (ctok);</div><div class='add'>+   define_function_args (ctok);</div><div class='add'>+   compile_token_of_type(FARG_TOKEN);</div><div class='add'>+</div><div class='add'>+   if (ctok-&gt;type == OBRACE_TOKEN)</div><div class='add'>+     compound_statement(ctok);</div><div class='add'>+</div><div class='add'>+   else if (ctok-&gt;type != SEMICOLON_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error("Expecting {", ctok, 0);</div><div class='add'>+	free_token (&amp;fname);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   fname.type = type;</div><div class='add'>+   compile_token (&amp;fname);</div><div class='add'>+   free_token (&amp;fname);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* statement:</div><div class='add'>+ *	 compound-statement</div><div class='add'>+ *	 if ( expression ) statement</div><div class='add'>+ *	 if ( expression ) statement else statement</div><div class='add'>+ *	 !if ( expression ) statement</div><div class='add'>+ *	 loop ( expression ) statement</div><div class='add'>+ *	 _for ( expression ) statement</div><div class='add'>+ *       foreach ( expression ) statement</div><div class='add'>+ *       foreach (expression ) using (expression-list) statement</div><div class='add'>+ *	 while ( expression ) statement</div><div class='add'>+ *	 do statement while (expression) ;</div><div class='add'>+ *	 for ( expressionopt ; expressionopt ; expressionopt ) statement</div><div class='add'>+ *	 ERROR_BLOCK statement</div><div class='add'>+ *	 EXIT_BLOCK statement</div><div class='add'>+ *	 USER_BLOCK0 statement</div><div class='add'>+ *	 USER_BLOCK1 statement</div><div class='add'>+ *	 USER_BLOCK2 statement</div><div class='add'>+ *	 USER_BLOCK3 statement</div><div class='add'>+ *	 USER_BLOCK4 statement</div><div class='add'>+ *	 forever statement</div><div class='add'>+ *	 break ;</div><div class='add'>+ *	 continue ;</div><div class='add'>+ *	 return expressionopt ;</div><div class='add'>+ *	 variable variable-list ;</div><div class='add'>+ *	 struct struct-decl ;</div><div class='add'>+ *	 define identifier function-args ;</div><div class='add'>+ *	 define identifier function-args compound-statement</div><div class='add'>+ *	 switch ( expression ) statement</div><div class='add'>+ *	 rpn-line</div><div class='add'>+ *	 at-line</div><div class='add'>+ *	 push ( expression )</div><div class='add'>+ *	 ( expression ) = expression ;</div><div class='add'>+ *	 expression ;</div><div class='add'>+ *       expression :</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Note: This function does not return with a new token.  It is up to the</div><div class='add'>+ * calling routine to handle that.</div><div class='add'>+ */</div><div class='add'>+static void statement (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   unsigned char type;</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   LLT-&gt;parse_level += 1;</div><div class='add'>+</div><div class='add'>+   switch (ctok-&gt;type)</div><div class='add'>+     {</div><div class='add'>+      case OBRACE_TOKEN:</div><div class='add'>+	compound_statement (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case IF_TOKEN:</div><div class='add'>+      case IFNOT_TOKEN:</div><div class='add'>+	type = ctok-&gt;type;</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	expression_with_parenthesis (ctok);</div><div class='add'>+	block (ctok);</div><div class='add'>+</div><div class='add'>+	if (ELSE_TOKEN != get_token (ctok))</div><div class='add'>+	  {</div><div class='add'>+	     compile_token_of_type (type);</div><div class='add'>+	     unget_token (ctok);</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	block (ctok);</div><div class='add'>+	if (type == IF_TOKEN) type = ELSE_TOKEN; else type = NOTELSE_TOKEN;</div><div class='add'>+	compile_token_of_type (type);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      /* case IFNOT_TOKEN: */</div><div class='add'>+      case LOOP_TOKEN:</div><div class='add'>+      case _FOR_TOKEN:</div><div class='add'>+	type = ctok-&gt;type;</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	expression_with_parenthesis (ctok);</div><div class='add'>+	block (ctok);</div><div class='add'>+	compile_token_of_type (type);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case FOREACH_TOKEN:</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	expression_with_parenthesis (ctok);</div><div class='add'>+</div><div class='add'>+	if (NULL == push_token_list ())</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	append_token_of_type (ARG_TOKEN);</div><div class='add'>+	if (ctok-&gt;type == USING_TOKEN)</div><div class='add'>+	  {</div><div class='add'>+	     if (OPAREN_TOKEN != get_token (ctok))</div><div class='add'>+	       {</div><div class='add'>+		  _SLparse_error ("Expected 'using ('", ctok, 0);</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     function_args_expression (ctok, 0);</div><div class='add'>+	  }</div><div class='add'>+	append_token_of_type (EARG_TOKEN);</div><div class='add'>+</div><div class='add'>+	compile_token_list ();</div><div class='add'>+</div><div class='add'>+	block (ctok);</div><div class='add'>+	compile_token_of_type (FOREACH_TOKEN);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case WHILE_TOKEN:</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	compile_token_of_type (OBRACE_TOKEN);</div><div class='add'>+	expression_with_parenthesis (ctok);</div><div class='add'>+	compile_token_of_type (CBRACE_TOKEN);</div><div class='add'>+	block (ctok);</div><div class='add'>+	compile_token_of_type (WHILE_TOKEN);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case DO_TOKEN:</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	block (ctok);</div><div class='add'>+</div><div class='add'>+	if (WHILE_TOKEN != get_token (ctok))</div><div class='add'>+	  {</div><div class='add'>+	     _SLparse_error("Expecting while", ctok, 0);</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	get_token (ctok);</div><div class='add'>+</div><div class='add'>+	compile_token_of_type (OBRACE_TOKEN);</div><div class='add'>+	expression_with_parenthesis (ctok);</div><div class='add'>+	compile_token_of_type (CBRACE_TOKEN);</div><div class='add'>+	compile_token_of_type (DOWHILE_TOKEN);</div><div class='add'>+	handle_semicolon (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case FOR_TOKEN:</div><div class='add'>+</div><div class='add'>+	/* Look for (exp_opt ; exp_opt ; exp_opt ) */</div><div class='add'>+</div><div class='add'>+	if (OPAREN_TOKEN != get_token (ctok))</div><div class='add'>+	  {</div><div class='add'>+	     _SLparse_error("Expecting (.", ctok, 0);</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (NULL == push_token_list ())</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	append_token_of_type (OBRACE_TOKEN);</div><div class='add'>+	if (SEMICOLON_TOKEN != get_token (ctok))</div><div class='add'>+	  {</div><div class='add'>+	     expression (ctok);</div><div class='add'>+	     if (ctok-&gt;type != SEMICOLON_TOKEN)</div><div class='add'>+	       {</div><div class='add'>+		  _SLparse_error("Expecting ;", ctok, 0);</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	append_token_of_type (CBRACE_TOKEN);</div><div class='add'>+</div><div class='add'>+	append_token_of_type (OBRACE_TOKEN);</div><div class='add'>+	if (SEMICOLON_TOKEN != get_token (ctok))</div><div class='add'>+	  {</div><div class='add'>+	     expression (ctok);</div><div class='add'>+	     if (ctok-&gt;type != SEMICOLON_TOKEN)</div><div class='add'>+	       {</div><div class='add'>+		  _SLparse_error("Expecting ;", ctok, 0);</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	append_token_of_type (CBRACE_TOKEN);</div><div class='add'>+</div><div class='add'>+	append_token_of_type (OBRACE_TOKEN);</div><div class='add'>+	if (CPAREN_TOKEN != get_token (ctok))</div><div class='add'>+	  {</div><div class='add'>+	     expression (ctok);</div><div class='add'>+	     if (ctok-&gt;type != CPAREN_TOKEN)</div><div class='add'>+	       {</div><div class='add'>+		  _SLparse_error("Expecting ).", ctok, 0);</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	append_token_of_type (CBRACE_TOKEN);</div><div class='add'>+</div><div class='add'>+	compile_token_list ();</div><div class='add'>+</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	block (ctok);</div><div class='add'>+	compile_token_of_type (FOR_TOKEN);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case ERRBLK_TOKEN:</div><div class='add'>+      case EXITBLK_TOKEN:</div><div class='add'>+      case USRBLK0_TOKEN:</div><div class='add'>+      case USRBLK1_TOKEN:</div><div class='add'>+      case USRBLK2_TOKEN:</div><div class='add'>+      case USRBLK3_TOKEN:</div><div class='add'>+      case USRBLK4_TOKEN:</div><div class='add'>+      case FOREVER_TOKEN:</div><div class='add'>+	type = ctok-&gt;type;</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	block (ctok);</div><div class='add'>+	compile_token_of_type (type);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case BREAK_TOKEN:</div><div class='add'>+      case CONT_TOKEN:</div><div class='add'>+	compile_token_of_type (ctok-&gt;type);</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	handle_semicolon (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case RETURN_TOKEN:</div><div class='add'>+	if (SEMICOLON_TOKEN != get_token (ctok))</div><div class='add'>+	  {</div><div class='add'>+	     if (NULL == push_token_list ())</div><div class='add'>+	       break;</div><div class='add'>+</div><div class='add'>+	     expression (ctok);</div><div class='add'>+</div><div class='add'>+	     if (ctok-&gt;type != SEMICOLON_TOKEN)</div><div class='add'>+	       {</div><div class='add'>+		  _SLparse_error ("Expecting ;", ctok, 0);</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	     compile_token_list ();</div><div class='add'>+	  }</div><div class='add'>+	compile_token_of_type (RETURN_TOKEN);</div><div class='add'>+	handle_semicolon (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case STATIC_TOKEN:</div><div class='add'>+      case PRIVATE_TOKEN:</div><div class='add'>+      case PUBLIC_TOKEN:</div><div class='add'>+	type = ctok-&gt;type;</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	if (ctok-&gt;type == VARIABLE_TOKEN)</div><div class='add'>+	  {</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     variable_list (ctok, type);</div><div class='add'>+	     handle_semicolon (ctok);</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	if (ctok-&gt;type == DEFINE_TOKEN)</div><div class='add'>+	  {</div><div class='add'>+	     define_function (ctok, type);</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	_SLparse_error ("Expecting 'variable' or 'define'", ctok, 0);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case VARIABLE_TOKEN:</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	variable_list (ctok, OBRACKET_TOKEN);</div><div class='add'>+	handle_semicolon (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case TYPEDEF_TOKEN:</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	if (NULL == push_token_list ())</div><div class='add'>+	  break;</div><div class='add'>+	typedef_definition (ctok);</div><div class='add'>+	compile_token_list ();</div><div class='add'>+</div><div class='add'>+	handle_semicolon (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case DEFINE_TOKEN:</div><div class='add'>+	define_function (ctok, DEFINE_TOKEN);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SWITCH_TOKEN:</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	expression_with_parenthesis (ctok);</div><div class='add'>+</div><div class='add'>+	while ((SLang_Error == 0)</div><div class='add'>+	       &amp;&amp; (OBRACE_TOKEN == ctok-&gt;type))</div><div class='add'>+	  {</div><div class='add'>+	     compile_token_of_type (OBRACE_TOKEN);</div><div class='add'>+	     compound_statement (ctok);</div><div class='add'>+	     compile_token_of_type (CBRACE_TOKEN);</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	  }</div><div class='add'>+	compile_token_of_type (SWITCH_TOKEN);</div><div class='add'>+	unget_token (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case EOF_TOKEN:</div><div class='add'>+	break;</div><div class='add'>+#if 0</div><div class='add'>+      case PUSH_TOKEN:</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	expression_list_with_parenthesis (ctok);</div><div class='add'>+	handle_semicolon (ctok);</div><div class='add'>+	break;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+      case SEMICOLON_TOKEN:</div><div class='add'>+	handle_semicolon (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case RPN_TOKEN:</div><div class='add'>+	if (POUND_TOKEN == get_token (ctok))</div><div class='add'>+	  _SLcompile_byte_compiled ();</div><div class='add'>+	else if (ctok-&gt;type != EOF_TOKEN)</div><div class='add'>+	  rpn_parse_line (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case OPAREN_TOKEN:	       /* multiple assignment */</div><div class='add'>+	try_multiple_assignment (ctok);</div><div class='add'>+	if (ctok-&gt;type == COLON_TOKEN)</div><div class='add'>+	  compile_token_of_type (COLON_TOKEN);</div><div class='add'>+	else handle_semicolon (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+</div><div class='add'>+	if (NULL == push_token_list ())</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	expression (ctok);</div><div class='add'>+	compile_token_list ();</div><div class='add'>+</div><div class='add'>+	if (ctok-&gt;type == COLON_TOKEN)</div><div class='add'>+	  compile_token_of_type (COLON_TOKEN);</div><div class='add'>+	else handle_semicolon (ctok);</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   LLT-&gt;parse_level -= 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void block (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   compile_token_of_type (OBRACE_TOKEN);</div><div class='add'>+   statement (ctok);</div><div class='add'>+   compile_token_of_type (CBRACE_TOKEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * statement-list:</div><div class='add'>+ *	 statement</div><div class='add'>+ *	 statement-list statement</div><div class='add'>+ */</div><div class='add'>+static void statement_list (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   while ((SLang_Error == 0)</div><div class='add'>+	  &amp;&amp; (ctok-&gt;type != CBRACE_TOKEN)</div><div class='add'>+	  &amp;&amp; (ctok-&gt;type != EOF_TOKEN))</div><div class='add'>+     {</div><div class='add'>+	statement(ctok);</div><div class='add'>+	get_token (ctok);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* compound-statement:</div><div class='add'>+ *	 { statement-list }</div><div class='add'>+ */</div><div class='add'>+static void compound_statement (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   /* ctok-&gt;type is OBRACE_TOKEN here */</div><div class='add'>+   get_token (ctok);</div><div class='add'>+   statement_list(ctok);</div><div class='add'>+   if (CBRACE_TOKEN != ctok-&gt;type)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("Expecting '}'", ctok, 0);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function is only called from statement. */</div><div class='add'>+static void expression_with_parenthesis (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   if (ctok-&gt;type != OPAREN_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error("Expecting (", ctok, 0);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == push_token_list ())</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   get_token (ctok);</div><div class='add'>+   expression (ctok);</div><div class='add'>+</div><div class='add'>+   if (ctok-&gt;type != CPAREN_TOKEN)</div><div class='add'>+     _SLparse_error("Expecting )", ctok, 0);</div><div class='add'>+</div><div class='add'>+   compile_token_list ();</div><div class='add'>+</div><div class='add'>+   get_token (ctok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void handle_semicolon (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   if ((ctok-&gt;type == SEMICOLON_TOKEN)</div><div class='add'>+       || (ctok-&gt;type == EOF_TOKEN))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   _SLparse_error ("Expecting ;", ctok, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLparse_start (SLang_Load_Type *llt)</div><div class='add'>+{</div><div class='add'>+   _SLang_Token_Type ctok;</div><div class='add'>+   SLang_Load_Type *save_llt;</div><div class='add'>+   unsigned int save_use_next_token;</div><div class='add'>+   _SLang_Token_Type save_next_token;</div><div class='add'>+   Token_List_Type *save_list;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   int save_last_line_number = Last_Line_Number;</div><div class='add'>+</div><div class='add'>+   Last_Line_Number = -1;</div><div class='add'>+#endif</div><div class='add'>+   save_use_next_token = Use_Next_Token;</div><div class='add'>+   save_next_token = Next_Token;</div><div class='add'>+   save_list = Token_List;</div><div class='add'>+   save_llt = LLT;</div><div class='add'>+   LLT = llt;</div><div class='add'>+</div><div class='add'>+   init_token (&amp;Next_Token);</div><div class='add'>+   Use_Next_Token = 0;</div><div class='add'>+   init_token (&amp;ctok);</div><div class='add'>+   get_token (&amp;ctok);</div><div class='add'>+</div><div class='add'>+   llt-&gt;parse_level = 0;</div><div class='add'>+   statement_list (&amp;ctok);</div><div class='add'>+</div><div class='add'>+   if ((SLang_Error == 0)</div><div class='add'>+       &amp;&amp; (ctok.type != EOF_TOKEN))</div><div class='add'>+     _SLparse_error ("Parse ended prematurely", &amp;ctok, 0);</div><div class='add'>+   </div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     {</div><div class='add'>+	if (SLang_Error &lt; 0)	       /* severe error */</div><div class='add'>+	  save_list = NULL;</div><div class='add'>+</div><div class='add'>+	while (Token_List != save_list)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == pop_token_list (1))</div><div class='add'>+	       break;		       /* ??? when would this happen? */</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   free_token (&amp;ctok);</div><div class='add'>+   LLT = save_llt;</div><div class='add'>+   if (Use_Next_Token)</div><div class='add'>+     free_token (&amp;Next_Token);</div><div class='add'>+   Use_Next_Token = save_use_next_token;</div><div class='add'>+   Next_Token = save_next_token;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   Last_Line_Number = save_last_line_number;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* variable-list:</div><div class='add'>+ * 	variable-decl</div><div class='add'>+ * 	variable-decl variable-list</div><div class='add'>+ *</div><div class='add'>+ * variable-decl:</div><div class='add'>+ * 	identifier</div><div class='add'>+ * 	identifier = simple-expression</div><div class='add'>+ */</div><div class='add'>+static void variable_list (_SLang_Token_Type *name_token, unsigned char variable_type)</div><div class='add'>+{</div><div class='add'>+   int declaring;</div><div class='add'>+   _SLang_Token_Type tok;</div><div class='add'>+</div><div class='add'>+   if (name_token-&gt;type != IDENT_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("Expecting a variable name", name_token, 0);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   declaring = 0;</div><div class='add'>+   do</div><div class='add'>+     {</div><div class='add'>+	if (declaring == 0)</div><div class='add'>+	  {</div><div class='add'>+	     declaring = 1;</div><div class='add'>+	     compile_token_of_type (variable_type);</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	compile_token (name_token);</div><div class='add'>+</div><div class='add'>+	init_token (&amp;tok);</div><div class='add'>+	if (ASSIGN_TOKEN == get_token (&amp;tok))</div><div class='add'>+	  {</div><div class='add'>+	     compile_token_of_type (CBRACKET_TOKEN);</div><div class='add'>+	     declaring = 0;</div><div class='add'>+</div><div class='add'>+	     get_token (&amp;tok);</div><div class='add'>+</div><div class='add'>+	     push_token_list ();</div><div class='add'>+	     simple_expression (&amp;tok);</div><div class='add'>+	     compile_token_list ();</div><div class='add'>+</div><div class='add'>+	     name_token-&gt;type = _SCALAR_ASSIGN_TOKEN;</div><div class='add'>+	     compile_token (name_token);</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	free_token (name_token);</div><div class='add'>+	*name_token = tok;</div><div class='add'>+     }</div><div class='add'>+   while ((name_token-&gt;type == COMMA_TOKEN)</div><div class='add'>+	  &amp;&amp; (IDENT_TOKEN == get_token (name_token)));</div><div class='add'>+</div><div class='add'>+   if (declaring) compile_token_of_type (CBRACKET_TOKEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* struct-declaration:</div><div class='add'>+ * 	struct { struct-field-list };</div><div class='add'>+ *</div><div class='add'>+ * struct-field-list:</div><div class='add'>+ * 	struct-field-name , struct-field-list</div><div class='add'>+ * 	struct-field-name</div><div class='add'>+ *</div><div class='add'>+ * Generates code: "field-name-1" ... "field-name-N" N STRUCT_TOKEN</div><div class='add'>+ */</div><div class='add'>+static void struct_declaration (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   int n;</div><div class='add'>+   _SLang_Token_Type num_tok;</div><div class='add'>+</div><div class='add'>+   if (ctok-&gt;type != OBRACE_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("Expecting {", ctok, 0);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   n = 0;</div><div class='add'>+   while (IDENT_TOKEN == get_token (ctok))</div><div class='add'>+     {</div><div class='add'>+	n++;</div><div class='add'>+	ctok-&gt;type = STRING_TOKEN;</div><div class='add'>+	append_token (ctok);</div><div class='add'>+	if (COMMA_TOKEN != get_token (ctok))</div><div class='add'>+	  break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (ctok-&gt;type != CBRACE_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("Expecting }", ctok, 0);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   if (n == 0)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("struct requires at least 1 field", ctok, 0);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   init_token (&amp;num_tok);</div><div class='add'>+   num_tok.type = INT_TOKEN;</div><div class='add'>+   num_tok.v.long_val = n;</div><div class='add'>+   append_token (&amp;num_tok);</div><div class='add'>+   append_token_of_type (STRUCT_TOKEN);</div><div class='add'>+</div><div class='add'>+   get_token (ctok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* struct-declaration:</div><div class='add'>+ * 	typedef struct { struct-field-list } Type_Name;</div><div class='add'>+ *</div><div class='add'>+ * struct-field-list:</div><div class='add'>+ * 	struct-field-name , struct-field-list</div><div class='add'>+ * 	struct-field-name</div><div class='add'>+ *</div><div class='add'>+ * Generates code: "field-name-1" ... "field-name-N" N STRUCT_TOKEN typedef</div><div class='add'>+ */</div><div class='add'>+static void typedef_definition (_SLang_Token_Type *t)</div><div class='add'>+{</div><div class='add'>+</div><div class='add'>+   if (t-&gt;type != STRUCT_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("Expecting `struct'", t, 0);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   get_token (t);</div><div class='add'>+</div><div class='add'>+   struct_declaration (t);</div><div class='add'>+   if (t-&gt;type != IDENT_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("Expecting identifier", t, 0);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   t-&gt;type = STRING_TOKEN;</div><div class='add'>+   append_token (t);</div><div class='add'>+   append_token_of_type (TYPEDEF_TOKEN);</div><div class='add'>+</div><div class='add'>+   get_token (t);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* function-args:</div><div class='add'>+ * 	( args-dec-opt )</div><div class='add'>+ *</div><div class='add'>+ * args-decl-opt:</div><div class='add'>+ * 	identifier</div><div class='add'>+ * 	args-decl , identifier</div><div class='add'>+ */</div><div class='add'>+static void define_function_args (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   if (CPAREN_TOKEN == get_token (ctok))</div><div class='add'>+     {</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   compile_token_of_type(OBRACKET_TOKEN);</div><div class='add'>+</div><div class='add'>+   while ((SLang_Error == 0)</div><div class='add'>+	  &amp;&amp; (ctok-&gt;type == IDENT_TOKEN))</div><div class='add'>+     {</div><div class='add'>+	compile_token (ctok);</div><div class='add'>+	if (COMMA_TOKEN != get_token (ctok))</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	get_token (ctok);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (CPAREN_TOKEN != ctok-&gt;type)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error("Expecting )", ctok, 0);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   compile_token_of_type(CBRACKET_TOKEN);</div><div class='add'>+</div><div class='add'>+   get_token (ctok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void try_multiple_assignment (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   /* This is called with ctok-&gt;type == OPAREN_TOKEN.  We have no idea</div><div class='add'>+    * what follows this.  There are various possibilities such as:</div><div class='add'>+    * @  () = x;</div><div class='add'>+    * @  ( expression ) = x;</div><div class='add'>+    * @  ( expression ) ;</div><div class='add'>+    * @  ( expression ) OP expression;</div><div class='add'>+    * @  ( expression ) [expression] = expression;</div><div class='add'>+    * and only the first two constitute a multiple assignment.  The last</div><div class='add'>+    * two forms create the difficulty.</div><div class='add'>+    *</div><div class='add'>+    * Here is the plan.  First parse (expression) and then check next token.</div><div class='add'>+    * If it is an equal operator, then it will be parsed as a multiple</div><div class='add'>+    * assignment.  In fact, that is the easy part.</div><div class='add'>+    *</div><div class='add'>+    * The hard part stems from the fact that by parsing (expression), we</div><div class='add'>+    * have effectly truncated the parse if (expression) is part of a binary</div><div class='add'>+    * or unary expression.  Somehow, the parsing must be resumed.  The trick</div><div class='add'>+    * here is to use a dummy literal that generates no code: NO_OP_LITERAL</div><div class='add'>+    * Using it, we just call 'expression' and proceed.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   if (NULL == push_token_list ())</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   get_token (ctok);</div><div class='add'>+</div><div class='add'>+   if (ctok-&gt;type != CPAREN_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	expression_with_commas (ctok, 1);</div><div class='add'>+	if (ctok-&gt;type != CPAREN_TOKEN)</div><div class='add'>+	  {</div><div class='add'>+	     _SLparse_error ("Expecting )", ctok, 0);</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   switch (get_token (ctok))</div><div class='add'>+     {</div><div class='add'>+      case ASSIGN_TOKEN:</div><div class='add'>+      case PLUSEQS_TOKEN:</div><div class='add'>+      case MINUSEQS_TOKEN:</div><div class='add'>+      case TIMESEQS_TOKEN:</div><div class='add'>+      case DIVEQS_TOKEN:</div><div class='add'>+      case BOREQS_TOKEN:</div><div class='add'>+      case BANDEQS_TOKEN:</div><div class='add'>+	do_multiple_assignment (ctok);</div><div class='add'>+	pop_token_list (1);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	unget_token (ctok);</div><div class='add'>+	ctok-&gt;type = NO_OP_LITERAL;</div><div class='add'>+	expression (ctok);</div><div class='add'>+	compile_token_list ();</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note:  expression never gets compiled directly.  Rather, it gets</div><div class='add'>+ *        appended to the token list and then compiled by a calling</div><div class='add'>+ *        routine.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* expression:</div><div class='add'>+ *	 simple_expression</div><div class='add'>+ *	 simple-expression , expression</div><div class='add'>+ *       &lt;none&gt;</div><div class='add'>+ */</div><div class='add'>+static void expression_with_commas (_SLang_Token_Type *ctok, int save_comma)</div><div class='add'>+{</div><div class='add'>+   while (SLang_Error == 0)</div><div class='add'>+     {</div><div class='add'>+	if (ctok-&gt;type != COMMA_TOKEN)</div><div class='add'>+	  {</div><div class='add'>+	     if (ctok-&gt;type == CPAREN_TOKEN)</div><div class='add'>+	       return;</div><div class='add'>+</div><div class='add'>+	     simple_expression (ctok);</div><div class='add'>+</div><div class='add'>+	     if (ctok-&gt;type != COMMA_TOKEN)</div><div class='add'>+	       break;</div><div class='add'>+	  }</div><div class='add'>+	if (save_comma) append_token (ctok);</div><div class='add'>+	get_token (ctok);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void expression (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   expression_with_commas (ctok, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* priority levels of binary operations */</div><div class='add'>+static unsigned char Binop_Level[] =</div><div class='add'>+{</div><div class='add'>+/* ADD_TOKEN */		2,</div><div class='add'>+/* SUB_TOKEN */		2,</div><div class='add'>+/* MUL_TOKEN */		1,</div><div class='add'>+/* DIV_TOKEN */		1,</div><div class='add'>+/* LT_TOKEN */		4,</div><div class='add'>+/* LE_TOKEN */		4,</div><div class='add'>+/* GT_TOKEN */		4,</div><div class='add'>+/* GE_TOKEN */		4,</div><div class='add'>+/* EQ_TOKEN */		5,</div><div class='add'>+/* NE_TOKEN */		5,</div><div class='add'>+/* AND_TOKEN */		9,</div><div class='add'>+/* OR_TOKEN */		10,</div><div class='add'>+/* MOD_TOKEN */		1,</div><div class='add'>+/* BAND_TOKEN */	6,</div><div class='add'>+/* SHL_TOKEN */		3,</div><div class='add'>+/* SHR_TOKEN */		3,</div><div class='add'>+/* BXOR_TOKEN */	7,</div><div class='add'>+/* BOR_TOKEN */		8,</div><div class='add'>+/* POUND_TOKEN */	1  /* Matrix Multiplication */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/* % Note: simple-expression groups operators OP1 at same level.  The</div><div class='add'>+ * % actual implementation will not do this.</div><div class='add'>+ * simple-expression:</div><div class='add'>+ *	 unary-expression</div><div class='add'>+ *	 binary-expression BINARY-OP unary-expression</div><div class='add'>+ *       andelse xxelse-expression-list</div><div class='add'>+ *       orelse xxelse-expression-list</div><div class='add'>+ *</div><div class='add'>+ * xxelse-expression-list:</div><div class='add'>+ * 	{ expression }</div><div class='add'>+ * 	xxelse-expression-list { expression }</div><div class='add'>+ * binary-expression:</div><div class='add'>+ *      unary-expression</div><div class='add'>+ *      unary-expression BINARY-OP binary-expression</div><div class='add'>+ */</div><div class='add'>+static void simple_expression (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   unsigned char type;</div><div class='add'>+   unsigned char op_stack [64];</div><div class='add'>+   unsigned char level_stack [64];</div><div class='add'>+   unsigned char level;</div><div class='add'>+   unsigned int op_num;</div><div class='add'>+</div><div class='add'>+   switch (ctok-&gt;type)</div><div class='add'>+     {</div><div class='add'>+      case ANDELSE_TOKEN:</div><div class='add'>+      case ORELSE_TOKEN:</div><div class='add'>+	type = ctok-&gt;type;</div><div class='add'>+	if (OBRACE_TOKEN != get_token (ctok))</div><div class='add'>+	  {</div><div class='add'>+	     _SLparse_error ("Expecting '{'", ctok, 0);</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	while (ctok-&gt;type == OBRACE_TOKEN)</div><div class='add'>+	  {</div><div class='add'>+	     append_token (ctok);</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     expression (ctok);</div><div class='add'>+	     if (CBRACE_TOKEN != ctok-&gt;type)</div><div class='add'>+	       {</div><div class='add'>+		  _SLparse_error("Expecting }", ctok, 0);</div><div class='add'>+		  return;</div><div class='add'>+	       }</div><div class='add'>+	     append_token (ctok);</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	  }</div><div class='add'>+	append_token_of_type (type);</div><div class='add'>+	return;</div><div class='add'>+</div><div class='add'>+	/* avoid unary-expression if possible */</div><div class='add'>+      case STRING_TOKEN:</div><div class='add'>+	append_token (ctok);</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	unary_expression (ctok);</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (SEMICOLON_TOKEN == (type = ctok-&gt;type))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   op_num = 0;</div><div class='add'>+</div><div class='add'>+   while ((SLang_Error == 0)</div><div class='add'>+	  &amp;&amp; (IS_BINARY_OP(type)))</div><div class='add'>+     {</div><div class='add'>+	level = Binop_Level[type - FIRST_BINARY_OP];</div><div class='add'>+</div><div class='add'>+	while ((op_num &gt; 0) &amp;&amp; (level_stack [op_num - 1] &lt;= level))</div><div class='add'>+	  append_token_of_type (op_stack [--op_num]);</div><div class='add'>+</div><div class='add'>+	if (op_num &gt;= sizeof (op_stack) - 1)</div><div class='add'>+	  {</div><div class='add'>+	     _SLparse_error ("Binary op stack overflow", ctok, 0);</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	op_stack [op_num] = type;</div><div class='add'>+	level_stack [op_num] = level;</div><div class='add'>+	op_num++;</div><div class='add'>+</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	unary_expression (ctok);</div><div class='add'>+	type = ctok-&gt;type;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (op_num &gt; 0)</div><div class='add'>+     append_token_of_type(op_stack[--op_num]);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* unary-expression:</div><div class='add'>+ *	 postfix-expression</div><div class='add'>+ *	 ++ postfix-expression</div><div class='add'>+ *	 -- postfix-expression</div><div class='add'>+ *	 case unary-expression</div><div class='add'>+ *	 OP3 unary-expression</div><div class='add'>+ *	 (OP3: + - ~ &amp; not @)</div><div class='add'>+ *</div><div class='add'>+ * Note:  This grammar permits: case case case WHATEVER</div><div class='add'>+ */</div><div class='add'>+static void unary_expression (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   unsigned char save_unary_ops [16];</div><div class='add'>+   unsigned int num_unary_ops;</div><div class='add'>+   unsigned char type;</div><div class='add'>+   _SLang_Token_Type *last_token;</div><div class='add'>+</div><div class='add'>+   num_unary_ops = 0;</div><div class='add'>+   while (SLang_Error == 0)</div><div class='add'>+     {</div><div class='add'>+	type = ctok-&gt;type;</div><div class='add'>+</div><div class='add'>+	switch (type)</div><div class='add'>+	  {</div><div class='add'>+	   case PLUSPLUS_TOKEN:</div><div class='add'>+	   case MINUSMINUS_TOKEN:</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     postfix_expression (ctok);</div><div class='add'>+	     check_for_lvalue (type, NULL);</div><div class='add'>+	     goto out_of_switch;</div><div class='add'>+</div><div class='add'>+	   case ADD_TOKEN:</div><div class='add'>+	     get_token (ctok);	       /* skip it-- it's unary here */</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case SUB_TOKEN:</div><div class='add'>+	     (void) get_token (ctok);</div><div class='add'>+	     if (IS_INTEGER_TOKEN (ctok-&gt;type))</div><div class='add'>+	       {</div><div class='add'>+		  ctok-&gt;v.long_val = -ctok-&gt;v.long_val;</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     if (num_unary_ops == 16)</div><div class='add'>+	       goto stack_overflow_error;</div><div class='add'>+	     save_unary_ops [num_unary_ops++] = CHS_TOKEN;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case DEREF_TOKEN:</div><div class='add'>+	   case BNOT_TOKEN:</div><div class='add'>+	   case NOT_TOKEN:</div><div class='add'>+	   case CASE_TOKEN:</div><div class='add'>+	     if (num_unary_ops == 16)</div><div class='add'>+	       goto stack_overflow_error;</div><div class='add'>+</div><div class='add'>+	     save_unary_ops [num_unary_ops++] = type;</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	     /* Try to avoid -&gt;postfix_expression-&gt;primary_expression</div><div class='add'>+	      * subroutine calls.</div><div class='add'>+	      */</div><div class='add'>+	   case STRING_TOKEN:</div><div class='add'>+	     append_token (ctok);</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     goto out_of_switch;</div><div class='add'>+</div><div class='add'>+	   default:</div><div class='add'>+	     postfix_expression (ctok);</div><div class='add'>+	     goto out_of_switch;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   out_of_switch:</div><div class='add'>+   if (num_unary_ops == 0)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if ((DEREF_TOKEN == save_unary_ops[num_unary_ops - 1])</div><div class='add'>+       &amp;&amp; (NULL != (last_token = get_last_token ()))</div><div class='add'>+       &amp;&amp; (IS_ASSIGN_TOKEN(last_token-&gt;type)))</div><div class='add'>+     {</div><div class='add'>+	/* FIXME: Priority=medium</div><div class='add'>+	 * This needs generalized so that things like @a.y = 1 will work properly.</div><div class='add'>+	 */</div><div class='add'>+	if ((num_unary_ops != 1)</div><div class='add'>+	    || (last_token-&gt;type != _SCALAR_ASSIGN_TOKEN))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_NOT_IMPLEMENTED, </div><div class='add'>+			   "Only derefence assignments to simple variables are possible");</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	last_token-&gt;type += (_DEREF_ASSIGN_TOKEN - _SCALAR_ASSIGN_TOKEN);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (num_unary_ops)</div><div class='add'>+     {</div><div class='add'>+	num_unary_ops--;</div><div class='add'>+	append_token_of_type (save_unary_ops [num_unary_ops]);</div><div class='add'>+     }</div><div class='add'>+   return;</div><div class='add'>+</div><div class='add'>+   stack_overflow_error:</div><div class='add'>+   _SLparse_error ("Too many unary operators.", ctok, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int combine_namespace_tokens (_SLang_Token_Type *a, _SLang_Token_Type *b)</div><div class='add'>+{</div><div class='add'>+   char *sa, *sb, *sc;</div><div class='add'>+   unsigned int lena, lenb;</div><div class='add'>+   unsigned long hash;</div><div class='add'>+</div><div class='add'>+   /* This is somewhat of a hack.  Combine the TWO identifier names</div><div class='add'>+    * (NAMESPACE) and (name) into the form NAMESPACE-&gt;name.  Then when the</div><div class='add'>+    * byte compiler compiles the object it will not be found.  It will then</div><div class='add'>+    * check for this hack and make the appropriate namespace lookup.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   sa = a-&gt;v.s_val;</div><div class='add'>+   sb = b-&gt;v.s_val;</div><div class='add'>+</div><div class='add'>+   lena = strlen (sa);</div><div class='add'>+   lenb = strlen (sb);</div><div class='add'>+</div><div class='add'>+   sc = SLmalloc (lena + lenb + 3);</div><div class='add'>+   if (sc == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   strcpy (sc, sa);</div><div class='add'>+   strcpy (sc + lena, "-&gt;");</div><div class='add'>+   strcpy (sc + lena + 2, sb);</div><div class='add'>+</div><div class='add'>+   sb = _SLstring_make_hashed_string (sc, lena + lenb + 2, &amp;hash);</div><div class='add'>+   SLfree (sc);</div><div class='add'>+   if (sb == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* I can free this string because no other token should be referencing it.</div><div class='add'>+    * (num_refs == 1).</div><div class='add'>+    */</div><div class='add'>+   _SLfree_hashed_string (sa, lena, a-&gt;hash);</div><div class='add'>+   a-&gt;v.s_val = sb;</div><div class='add'>+   a-&gt;hash = hash;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void append_identifier_token (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   _SLang_Token_Type *last_token;</div><div class='add'>+</div><div class='add'>+   append_token (ctok);</div><div class='add'>+</div><div class='add'>+   if (NAMESPACE_TOKEN != get_token (ctok))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (IDENT_TOKEN != get_token (ctok))</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("Expecting name-space identifier", ctok, 0);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   last_token = get_last_token ();</div><div class='add'>+   if (-1 == combine_namespace_tokens (last_token, ctok))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   (void) get_token (ctok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_identifier_expr_token (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   _SLang_Token_Type next_token;</div><div class='add'>+</div><div class='add'>+   if (IDENT_TOKEN != get_identifier_token (ctok))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   init_token (&amp;next_token);</div><div class='add'>+   if (NAMESPACE_TOKEN != get_token (&amp;next_token))</div><div class='add'>+     {</div><div class='add'>+	unget_token (&amp;next_token);</div><div class='add'>+	return IDENT_TOKEN;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (IDENT_TOKEN != get_identifier_token (&amp;next_token))</div><div class='add'>+     {</div><div class='add'>+	free_token (&amp;next_token);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == combine_namespace_tokens (ctok, &amp;next_token))</div><div class='add'>+     {</div><div class='add'>+	free_token (&amp;next_token);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   free_token (&amp;next_token);</div><div class='add'>+   return IDENT_TOKEN;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* postfix-expression:</div><div class='add'>+ *	 primary-expression</div><div class='add'>+ *	 postfix-expression [ expression ]</div><div class='add'>+ *	 postfix-expression ( function-args-expression )</div><div class='add'>+ *	 postfix-expression . identifier</div><div class='add'>+ *       postfix-expression ^ unary-expression</div><div class='add'>+ *	 postfix-expression ++</div><div class='add'>+ *	 postfix-expression --</div><div class='add'>+ *	 postfix-expression = simple-expression</div><div class='add'>+ *	 postfix-expression += simple-expression</div><div class='add'>+ *	 postfix-expression -= simple-expression</div><div class='add'>+ *</div><div class='add'>+ * primary-expression:</div><div class='add'>+ *	literal</div><div class='add'>+ *	identifier-expr</div><div class='add'>+ *	( expression_opt )</div><div class='add'>+ * 	[ inline-array-expression ]</div><div class='add'>+ * 	&amp;identifier-expr</div><div class='add'>+ *      struct-definition</div><div class='add'>+ *      __tmp(identifier-expr)</div><div class='add'>+ *</div><div class='add'>+ * identifier-expr:</div><div class='add'>+ *      identifier</div><div class='add'>+ *      identifier-&gt;identifier</div><div class='add'>+ */</div><div class='add'>+static void postfix_expression (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   unsigned int start_pos, end_pos;</div><div class='add'>+   unsigned char type;</div><div class='add'>+</div><div class='add'>+   if (Token_List == NULL)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   start_pos = Token_List-&gt;len;</div><div class='add'>+</div><div class='add'>+   switch (ctok-&gt;type)</div><div class='add'>+     {</div><div class='add'>+      case IDENT_TOKEN:</div><div class='add'>+	append_identifier_token (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case CHAR_TOKEN:</div><div class='add'>+      case SHORT_TOKEN:</div><div class='add'>+      case INT_TOKEN:</div><div class='add'>+      case LONG_TOKEN:</div><div class='add'>+      case UCHAR_TOKEN:</div><div class='add'>+      case USHORT_TOKEN:</div><div class='add'>+      case UINT_TOKEN:</div><div class='add'>+      case ULONG_TOKEN:</div><div class='add'>+      case STRING_TOKEN:</div><div class='add'>+      case BSTRING_TOKEN:</div><div class='add'>+#ifdef SLANG_HAS_FLOAT</div><div class='add'>+      case DOUBLE_TOKEN:</div><div class='add'>+      case FLOAT_TOKEN:</div><div class='add'>+#endif</div><div class='add'>+#ifdef SLANG_HAS_COMPLEX</div><div class='add'>+      case COMPLEX_TOKEN:</div><div class='add'>+#endif</div><div class='add'>+	append_token (ctok);</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case OPAREN_TOKEN:</div><div class='add'>+	if (CPAREN_TOKEN != get_token (ctok))</div><div class='add'>+	  {</div><div class='add'>+	     expression (ctok);</div><div class='add'>+	     if (ctok-&gt;type != CPAREN_TOKEN)</div><div class='add'>+	       _SLparse_error("Expecting )", ctok, 0);</div><div class='add'>+	  }</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case BAND_TOKEN:</div><div class='add'>+	if (IDENT_TOKEN != get_identifier_expr_token (ctok))</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	ctok-&gt;type = _REF_TOKEN;</div><div class='add'>+	append_token (ctok);</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case OBRACKET_TOKEN:</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	inline_array_expression (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case NO_OP_LITERAL:</div><div class='add'>+	/* This token was introduced by try_multiple_assignment.  There,</div><div class='add'>+	 * a new token_list was pushed and (expression) was evaluated.</div><div class='add'>+	 * NO_OP_LITERAL represents the result of expression.  However,</div><div class='add'>+	 * we need to tweak the start_pos variable to point to the beginning</div><div class='add'>+	 * of the token list to complete the equivalence.</div><div class='add'>+	 */</div><div class='add'>+	start_pos = 0;</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case STRUCT_TOKEN:</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	struct_declaration (ctok);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case TMP_TOKEN:</div><div class='add'>+	get_token (ctok);</div><div class='add'>+	if (ctok-&gt;type == OPAREN_TOKEN)</div><div class='add'>+	  {</div><div class='add'>+	     if (IDENT_TOKEN == get_identifier_expr_token (ctok))</div><div class='add'>+	       {</div><div class='add'>+		  ctok-&gt;type = TMP_TOKEN;</div><div class='add'>+		  append_token (ctok);</div><div class='add'>+		  get_token (ctok);</div><div class='add'>+		  if (ctok-&gt;type == CPAREN_TOKEN)</div><div class='add'>+		    {</div><div class='add'>+		       get_token (ctok);</div><div class='add'>+		       break;</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	_SLparse_error ("Expecting form __tmp(NAME)", ctok, 0);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	if (IS_INTERNAL_FUNC(ctok-&gt;type))</div><div class='add'>+	  {</div><div class='add'>+	     append_token (ctok);</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  _SLparse_error("Expecting a PRIMARY", ctok, 0);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (SLang_Error == 0)</div><div class='add'>+     {</div><div class='add'>+	end_pos = Token_List-&gt;len;</div><div class='add'>+	type = ctok-&gt;type;</div><div class='add'>+	switch (type)</div><div class='add'>+	  {</div><div class='add'>+	   case OBRACKET_TOKEN:	       /* X[args] ==&gt; [args] X ARRAY */</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     append_token_of_type (ARG_TOKEN);</div><div class='add'>+	     if (ctok-&gt;type != CBRACKET_TOKEN) </div><div class='add'>+	       array_index_expression (ctok);</div><div class='add'>+</div><div class='add'>+	     if (ctok-&gt;type != CBRACKET_TOKEN)</div><div class='add'>+	       {</div><div class='add'>+		  _SLparse_error ("Expecting ']'", ctok, 0);</div><div class='add'>+		  return;</div><div class='add'>+	       }</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     /* append_token_of_type (EARG_TOKEN); -- ARRAY_TOKEN implicitely does this */</div><div class='add'>+	     token_list_element_exchange (start_pos, end_pos);</div><div class='add'>+	     append_token_of_type (ARRAY_TOKEN);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case OPAREN_TOKEN:</div><div class='add'>+	     /* f(args) ==&gt; args f */</div><div class='add'>+	     if (CPAREN_TOKEN != get_token (ctok))</div><div class='add'>+	       {</div><div class='add'>+		  function_args_expression (ctok, 1);</div><div class='add'>+		  token_list_element_exchange (start_pos, end_pos);</div><div class='add'>+	       }</div><div class='add'>+	     else get_token (ctok);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case DOT_TOKEN:</div><div class='add'>+	     /* S.a ==&gt; "a" S DOT</div><div class='add'>+	      * This means that if S is X[b], then X[b].a ==&gt; a b X ARRAY DOT</div><div class='add'>+	      * and f(a).X[b].c ==&gt; "c" b "X" a f . ARRAY .</div><div class='add'>+	      * Also, f(a).X[b] = g(x); ==&gt; x g b "X" a f .</div><div class='add'>+	      */</div><div class='add'>+	     if (IDENT_TOKEN != get_identifier_token (ctok))</div><div class='add'>+	       return;</div><div class='add'>+</div><div class='add'>+	     ctok-&gt;type = DOT_TOKEN;</div><div class='add'>+	     append_token (ctok);</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case PLUSPLUS_TOKEN:</div><div class='add'>+	   case MINUSMINUS_TOKEN:</div><div class='add'>+	     check_for_lvalue (type, NULL);</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case ASSIGN_TOKEN:</div><div class='add'>+	   case PLUSEQS_TOKEN:</div><div class='add'>+	   case MINUSEQS_TOKEN:</div><div class='add'>+	   case TIMESEQS_TOKEN:</div><div class='add'>+	   case DIVEQS_TOKEN:</div><div class='add'>+	   case BOREQS_TOKEN:</div><div class='add'>+	   case BANDEQS_TOKEN:</div><div class='add'>+	     check_for_lvalue (type, NULL);</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     simple_expression (ctok);</div><div class='add'>+	     token_list_element_exchange (start_pos, end_pos);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case POW_TOKEN:</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     unary_expression (ctok);</div><div class='add'>+	     append_token_of_type (POW_TOKEN);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   default:</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void function_args_expression (_SLang_Token_Type *ctok, int handle_num_args)</div><div class='add'>+{</div><div class='add'>+   unsigned char last_type, this_type;</div><div class='add'>+</div><div class='add'>+   if (handle_num_args) append_token_of_type (ARG_TOKEN);</div><div class='add'>+</div><div class='add'>+   last_type = COMMA_TOKEN;</div><div class='add'>+</div><div class='add'>+   while (SLang_Error == 0)</div><div class='add'>+     {</div><div class='add'>+	this_type = ctok-&gt;type;</div><div class='add'>+</div><div class='add'>+	switch (this_type)</div><div class='add'>+	  {</div><div class='add'>+	   case COMMA_TOKEN:</div><div class='add'>+	     if (last_type == COMMA_TOKEN)</div><div class='add'>+	       append_token_of_type (_NULL_TOKEN);</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case CPAREN_TOKEN:</div><div class='add'>+	     if (last_type == COMMA_TOKEN)</div><div class='add'>+	       append_token_of_type (_NULL_TOKEN);</div><div class='add'>+	     if (handle_num_args) append_token_of_type (EARG_TOKEN);</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     return;</div><div class='add'>+</div><div class='add'>+	   default:</div><div class='add'>+	     simple_expression (ctok);</div><div class='add'>+	     if ((ctok-&gt;type != COMMA_TOKEN)</div><div class='add'>+		 &amp;&amp; (ctok-&gt;type != CPAREN_TOKEN))</div><div class='add'>+	       {</div><div class='add'>+		  _SLparse_error ("Expecting ')'", ctok, 0);</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	last_type = this_type;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int check_for_lvalue (unsigned char eqs_type, _SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   unsigned char type;</div><div class='add'>+</div><div class='add'>+   if ((ctok == NULL)</div><div class='add'>+       &amp;&amp; (NULL == (ctok = get_last_token ())))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   type = ctok-&gt;type;</div><div class='add'>+</div><div class='add'>+   eqs_type -= ASSIGN_TOKEN;</div><div class='add'>+</div><div class='add'>+   if (type == IDENT_TOKEN)</div><div class='add'>+     eqs_type += _SCALAR_ASSIGN_TOKEN;</div><div class='add'>+   else if (type == ARRAY_TOKEN)</div><div class='add'>+     eqs_type += _ARRAY_ASSIGN_TOKEN;</div><div class='add'>+   else if (type == DOT_TOKEN)</div><div class='add'>+     eqs_type += _STRUCT_ASSIGN_TOKEN;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("Expecting LVALUE", ctok, 0);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   ctok-&gt;type = eqs_type;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void array_index_expression (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   unsigned int num_commas;</div><div class='add'>+</div><div class='add'>+   num_commas = 0;</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	switch (ctok-&gt;type)</div><div class='add'>+	  {</div><div class='add'>+	   case COLON_TOKEN:</div><div class='add'>+	     if (num_commas)</div><div class='add'>+	       _SLparse_error ("Misplaced ':'", ctok, 0);</div><div class='add'>+	     return;</div><div class='add'>+	     </div><div class='add'>+	   case TIMES_TOKEN:</div><div class='add'>+	     append_token_of_type (_INLINE_WILDCARD_ARRAY_TOKEN);</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     break;</div><div class='add'>+	     </div><div class='add'>+	   case COMMA_TOKEN:</div><div class='add'>+	     _SLparse_error ("Misplaced ','", ctok, 0);</div><div class='add'>+	     return;</div><div class='add'>+	     </div><div class='add'>+	   default:</div><div class='add'>+	     simple_expression (ctok);</div><div class='add'>+	  }</div><div class='add'>+	</div><div class='add'>+	if (ctok-&gt;type != COMMA_TOKEN)</div><div class='add'>+	  return;</div><div class='add'>+	num_commas++;</div><div class='add'>+	get_token (ctok);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* inline-array-expression:</div><div class='add'>+ *    array_index_expression</div><div class='add'>+ *    simple_expression : simple_expression</div><div class='add'>+ *    simple_expression : simple_expression : simple_expression</div><div class='add'>+ */</div><div class='add'>+static void inline_array_expression (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   int num_colons = 0;</div><div class='add'>+</div><div class='add'>+   append_token_of_type (ARG_TOKEN);</div><div class='add'>+</div><div class='add'>+   if (ctok-&gt;type == COLON_TOKEN)	       /* [:...] */</div><div class='add'>+     append_token_of_type (_NULL_TOKEN);</div><div class='add'>+   else if (ctok-&gt;type != CBRACKET_TOKEN) </div><div class='add'>+     array_index_expression (ctok);</div><div class='add'>+</div><div class='add'>+   if (ctok-&gt;type == COLON_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	num_colons++;</div><div class='add'>+	if ((COLON_TOKEN == get_token (ctok))</div><div class='add'>+	    || (ctok-&gt;type == CBRACKET_TOKEN))</div><div class='add'>+	  append_token_of_type (_NULL_TOKEN);</div><div class='add'>+	else</div><div class='add'>+	  simple_expression (ctok);</div><div class='add'>+</div><div class='add'>+	if (ctok-&gt;type == COLON_TOKEN)</div><div class='add'>+	  {</div><div class='add'>+	     num_colons++;</div><div class='add'>+	     get_token (ctok);</div><div class='add'>+	     simple_expression (ctok);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (ctok-&gt;type != CBRACKET_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("Expecting ']'", ctok, 0);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* append_token_of_type (EARG_TOKEN); */</div><div class='add'>+   if (num_colons)</div><div class='add'>+     append_token_of_type (_INLINE_IMPLICIT_ARRAY_TOKEN);</div><div class='add'>+   else</div><div class='add'>+     append_token_of_type (_INLINE_ARRAY_TOKEN);</div><div class='add'>+   get_token (ctok);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_multiple_assignment (_SLang_Token_Type *ctok)</div><div class='add'>+{</div><div class='add'>+   _SLang_Token_Type *s;</div><div class='add'>+   unsigned int i, k, len;</div><div class='add'>+   unsigned char assign_type;</div><div class='add'>+</div><div class='add'>+   assign_type = ctok-&gt;type;</div><div class='add'>+</div><div class='add'>+   /* The LHS token list has already been pushed.  Here we do the RHS</div><div class='add'>+    * so push to another token list, process it, then come back to</div><div class='add'>+    * LHS for assignment.</div><div class='add'>+    */</div><div class='add'>+   if (NULL == push_token_list ())</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   get_token (ctok);</div><div class='add'>+   expression (ctok);</div><div class='add'>+   compile_token_list ();</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   /* Finally compile the LHS of the assignment expression</div><div class='add'>+    * that has been saved.</div><div class='add'>+    */</div><div class='add'>+   s = Token_List-&gt;stack;</div><div class='add'>+   len = Token_List-&gt;len;</div><div class='add'>+</div><div class='add'>+   if (len == 0)</div><div class='add'>+     {</div><div class='add'>+	compile_token_of_type (POP_TOKEN);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (len &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	/* List is of form:</div><div class='add'>+	 *    a , b, c d e, f , g , , , h ,</div><div class='add'>+	 * The missing expressions will be replaced by a POP</div><div class='add'>+	 * ,,a</div><div class='add'>+	 */</div><div class='add'>+</div><div class='add'>+	/* Start from back looking for a COMMA */</div><div class='add'>+	k = len - 1;</div><div class='add'>+	if (s[k].type == COMMA_TOKEN)</div><div class='add'>+	  {</div><div class='add'>+	     compile_token_of_type (POP_TOKEN);</div><div class='add'>+	     len = k;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (-1 == check_for_lvalue (assign_type, s + k))</div><div class='add'>+	  return;</div><div class='add'>+</div><div class='add'>+	i = 0;</div><div class='add'>+	while (1)</div><div class='add'>+	  {</div><div class='add'>+	     if (s[k].type == COMMA_TOKEN)</div><div class='add'>+	       {</div><div class='add'>+		  i = k + 1;</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     if (k == 0)</div><div class='add'>+	       break;</div><div class='add'>+</div><div class='add'>+	     k--;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	while (i &lt; len)</div><div class='add'>+	  {</div><div class='add'>+	     compile_token (s + i);</div><div class='add'>+	     i++;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	len = k;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (s[0].type == COMMA_TOKEN)</div><div class='add'>+     compile_token_of_type (POP_TOKEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slpath.c b/mdk-stage1/slang/slpath.c<br/>new file mode 100644<br/>index 000000000..831bd34df<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slpath.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slpath.c</a></div><div class='hunk'>@@ -0,0 +1,344 @@</div><div class='add'>+/* Pathname and filename functions */</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_IO_H</div><div class='add'>+# include &lt;io.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* In this file, all file names are assumed to be specified in the Unix</div><div class='add'>+ * format, or in the native format.</div><div class='add'>+ *</div><div class='add'>+ * Aboout VMS:</div><div class='add'>+ * VMS pathnames are a mess.  In general, they look like</div><div class='add'>+ * node::device:[dir.dir]file.ext;version</div><div class='add'>+ * and I do not know of a well-defined Unix representation for them.  So,</div><div class='add'>+ * I am going to punt and encourage users to stick to the native</div><div class='add'>+ * representation.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#if defined(IBMPC_SYSTEM)</div><div class='add'>+# define PATH_SEP		'\\'</div><div class='add'>+# define DRIVE_SPECIFIER	':'</div><div class='add'>+# define SEARCH_PATH_DELIMITER	';'</div><div class='add'>+# define THIS_DIR_STRING	"."</div><div class='add'>+#else</div><div class='add'>+# if defined(VMS)</div><div class='add'>+#  define PATH_SEP		']'</div><div class='add'>+#  define DRIVE_SPECIFIER	':'</div><div class='add'>+#  define SEARCH_PATH_DELIMITER	' '</div><div class='add'>+#  define THIS_DIR_STRING	"[]"   /* Is this correct?? */</div><div class='add'>+# else</div><div class='add'>+#  define PATH_SEP		'/'</div><div class='add'>+#  define UNIX_PATHNAMES_OK</div><div class='add'>+#  define SEARCH_PATH_DELIMITER	':'</div><div class='add'>+#  define THIS_DIR_STRING	"."</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef UNIX_PATHNAMES_OK</div><div class='add'>+# define IS_PATH_SEP(x) ((x) == PATH_SEP)</div><div class='add'>+#else</div><div class='add'>+# define IS_PATH_SEP(x)	(((x) == PATH_SEP) || ((x) == '/'))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* If file is /a/b/c/basename, this function returns a pointer to basename */</div><div class='add'>+char *SLpath_basename (char *file)</div><div class='add'>+{</div><div class='add'>+   char *b;</div><div class='add'>+</div><div class='add'>+   if (file == NULL) return NULL;</div><div class='add'>+   b = file + strlen (file);</div><div class='add'>+</div><div class='add'>+   while (b != file)</div><div class='add'>+     {</div><div class='add'>+	b--;</div><div class='add'>+	if (IS_PATH_SEP(*b))</div><div class='add'>+	  return b + 1;</div><div class='add'>+#ifdef DRIVE_SPECIFIER</div><div class='add'>+	if (*b == DRIVE_SPECIFIER)</div><div class='add'>+	  return b + 1;</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return b;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Returns a malloced string */</div><div class='add'>+char *SLpath_pathname_sans_extname (char *file)</div><div class='add'>+{</div><div class='add'>+   char *b;</div><div class='add'>+</div><div class='add'>+   file = SLmake_string (file);</div><div class='add'>+   if (file == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   b = file + strlen (file);</div><div class='add'>+</div><div class='add'>+   while (b != file)</div><div class='add'>+     {</div><div class='add'>+	b--;</div><div class='add'>+	if (*b == '.')</div><div class='add'>+	  {</div><div class='add'>+	     *b = 0;</div><div class='add'>+	     return file;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return file;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* If path looks like: A/B/C/D/whatever, it returns A/B/C/D as a malloced </div><div class='add'>+ * string.</div><div class='add'>+ */</div><div class='add'>+char *SLpath_dirname (char *file)</div><div class='add'>+{</div><div class='add'>+   char *b;</div><div class='add'>+</div><div class='add'>+   if (file == NULL) return NULL;</div><div class='add'>+   b = file + strlen (file);</div><div class='add'>+</div><div class='add'>+   while (b != file)</div><div class='add'>+     {</div><div class='add'>+	b--;</div><div class='add'>+	if (IS_PATH_SEP(*b))</div><div class='add'>+	  {</div><div class='add'>+	     if (b == file) b++;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+#ifdef DRIVE_SPECIFIER</div><div class='add'>+	if (*b == DRIVE_SPECIFIER)</div><div class='add'>+	  {</div><div class='add'>+	     b++;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (b == file)</div><div class='add'>+     return SLmake_string (THIS_DIR_STRING);</div><div class='add'>+   </div><div class='add'>+   return SLmake_nstring (file, (unsigned int) (b - file));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note: VMS filenames also contain version numbers.  The caller will have</div><div class='add'>+ * to deal with that.</div><div class='add'>+ * </div><div class='add'>+ * The extension includes the '.'.  If no extension is present, "" is returned.</div><div class='add'>+ */</div><div class='add'>+char *SLpath_extname (char *file)</div><div class='add'>+{</div><div class='add'>+   char *b;</div><div class='add'>+</div><div class='add'>+   if (NULL == (file = SLpath_basename (file)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   b = file + strlen (file);</div><div class='add'>+   while (b != file)</div><div class='add'>+     {</div><div class='add'>+	b--;</div><div class='add'>+	if (*b == '.')</div><div class='add'>+	  return b;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (*b == '.')</div><div class='add'>+     return b;</div><div class='add'>+</div><div class='add'>+   /* Do not return a literal "" */</div><div class='add'>+   return file + strlen (file);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+static void convert_slashes (char *f)</div><div class='add'>+{</div><div class='add'>+   while (*f)</div><div class='add'>+     {</div><div class='add'>+	if (*f == '/') *f = PATH_SEP;</div><div class='add'>+	f++;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLpath_is_absolute_path (char *name)</div><div class='add'>+{</div><div class='add'>+#ifdef UNIX_PATHNAMES_OK</div><div class='add'>+   return (*name == '/');</div><div class='add'>+#else</div><div class='add'>+   if (IS_PATH_SEP (*name))</div><div class='add'>+     return 1;</div><div class='add'>+</div><div class='add'>+# ifdef DRIVE_SPECIFIER</div><div class='add'>+   /* Look for a drive specifier */</div><div class='add'>+   while (*name)</div><div class='add'>+     {</div><div class='add'>+	if (*name == DRIVE_SPECIFIER)</div><div class='add'>+	  return 1;</div><div class='add'>+</div><div class='add'>+	name++;</div><div class='add'>+     }</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This returns a MALLOCED string */</div><div class='add'>+char *SLpath_dircat (char *dir, char *name)</div><div class='add'>+{</div><div class='add'>+   unsigned int len, dirlen;</div><div class='add'>+   char *file;</div><div class='add'>+#ifndef VMS</div><div class='add'>+   int requires_fixup;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (name == NULL)</div><div class='add'>+     name = "";</div><div class='add'>+</div><div class='add'>+   if ((dir == NULL) || (SLpath_is_absolute_path (name)))</div><div class='add'>+     dir = "";</div><div class='add'>+</div><div class='add'>+   /* Both VMS and MSDOS have default directories associated with each drive.</div><div class='add'>+    * That is, the meaning of something like C:X depends upon more than just</div><div class='add'>+    * the syntax of the string.  Since this concept has more power under VMS</div><div class='add'>+    * it will be honored here.  However, I am going to treat C:X as C:\X</div><div class='add'>+    * under MSDOS.</div><div class='add'>+    *</div><div class='add'>+    * Note!!!</div><div class='add'>+    * VMS has problems of its own regarding path names, so I am simply</div><div class='add'>+    * going to strcat.  Hopefully the VMS RTL is smart enough to deal with</div><div class='add'>+    * the result.</div><div class='add'>+    */</div><div class='add'>+   dirlen = strlen (dir);</div><div class='add'>+#ifndef VMS</div><div class='add'>+   requires_fixup = (dirlen &amp;&amp; (0 == IS_PATH_SEP(dir[dirlen - 1])));</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   len = dirlen + strlen (name) + 2;</div><div class='add'>+   if (NULL == (file = SLmalloc (len)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   strcpy (file, dir);</div><div class='add'>+</div><div class='add'>+#ifndef VMS</div><div class='add'>+   if (requires_fixup)</div><div class='add'>+     file[dirlen++] = PATH_SEP;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   strcpy (file + dirlen, name);</div><div class='add'>+</div><div class='add'>+#if defined(IBMPC_SYSTEM)</div><div class='add'>+   convert_slashes (file);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   return file;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLpath_file_exists (char *file)</div><div class='add'>+{</div><div class='add'>+   struct stat st;</div><div class='add'>+   int m;</div><div class='add'>+</div><div class='add'>+#if defined(__os2__) &amp;&amp; !defined(S_IFMT)</div><div class='add'>+/* IBM VA3 doesn't declare S_IFMT */</div><div class='add'>+# define	S_IFMT	(S_IFDIR | S_IFCHR | S_IFREG)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef _S_IFDIR</div><div class='add'>+# ifndef S_IFDIR</div><div class='add'>+#  define S_IFDIR _S_IFDIR</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISDIR</div><div class='add'>+# ifdef S_IFDIR</div><div class='add'>+#  define S_ISDIR(m) (((m) &amp; S_IFMT) == S_IFDIR)</div><div class='add'>+# else</div><div class='add'>+#  define S_ISDIR(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (file == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (stat(file, &amp;st) &lt; 0) return 0;</div><div class='add'>+   m = st.st_mode;</div><div class='add'>+</div><div class='add'>+   if (S_ISDIR(m)) return (2);</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLpath_find_file_in_path (char *path, char *name)</div><div class='add'>+{</div><div class='add'>+   unsigned int max_path_len;</div><div class='add'>+   unsigned int this_path_len;</div><div class='add'>+   char *file, *dir;</div><div class='add'>+   char *p;</div><div class='add'>+   unsigned int nth;</div><div class='add'>+</div><div class='add'>+   if ((path == NULL) || (*path == 0)</div><div class='add'>+       || (name == NULL) || (*name == 0))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   max_path_len = 0;</div><div class='add'>+   this_path_len = 0;</div><div class='add'>+   p = path;</div><div class='add'>+   while (*p != 0)</div><div class='add'>+     {</div><div class='add'>+	if (*p++ == SEARCH_PATH_DELIMITER)</div><div class='add'>+	  {</div><div class='add'>+	     if (this_path_len &gt; max_path_len) max_path_len = this_path_len;</div><div class='add'>+	     this_path_len = 0;</div><div class='add'>+	  }</div><div class='add'>+	else this_path_len++;</div><div class='add'>+     }</div><div class='add'>+   if (this_path_len &gt; max_path_len) max_path_len = this_path_len;</div><div class='add'>+   max_path_len++;</div><div class='add'>+</div><div class='add'>+   if (NULL == (dir = SLmalloc (max_path_len)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   nth = 0;</div><div class='add'>+   while (-1 != SLextract_list_element (path, nth, SEARCH_PATH_DELIMITER,</div><div class='add'>+					dir, max_path_len))</div><div class='add'>+     {</div><div class='add'>+	nth++;</div><div class='add'>+	if (*dir == 0)</div><div class='add'>+	  continue;</div><div class='add'>+</div><div class='add'>+	if (NULL == (file = SLpath_dircat (dir, name)))</div><div class='add'>+	  {</div><div class='add'>+	     SLfree (dir);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (1 == SLpath_file_exists (file))</div><div class='add'>+	  {</div><div class='add'>+	     SLfree (dir);</div><div class='add'>+	     return file;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	SLfree (file);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLfree (dir);</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slposdir.c b/mdk-stage1/slang/slposdir.c<br/>new file mode 100644<br/>index 000000000..33799e574<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slposdir.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slposdir.c</a></div><div class='hunk'>@@ -0,0 +1,1057 @@</div><div class='add'>+/* file intrinsics for S-Lang */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#if defined(__unix__) || (defined (__os2__) &amp;&amp; defined (__EMX__))</div><div class='add'>+# include &lt;sys/types.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_IO_H</div><div class='add'>+# include &lt;io.h&gt;		       /* for chmod */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include &lt;process.h&gt;</div><div class='add'>+# include &lt;dos.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_FCNTL_H</div><div class='add'>+# include &lt;fcntl.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SYS_FCNTL_H</div><div class='add'>+# include &lt;sys/fcntl.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __unix__</div><div class='add'>+# include &lt;sys/file.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include &lt;dir.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(_MSC_VER)</div><div class='add'>+# include &lt;io.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__DECC) &amp;&amp; defined(VMS)</div><div class='add'>+# include &lt;unixio.h&gt;</div><div class='add'>+# include &lt;unixlib.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+# include &lt;stat.h&gt;</div><div class='add'>+#else</div><div class='add'>+# include &lt;sys/stat.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(VMS)</div><div class='add'>+# define USE_LISTDIR_INTRINSIC	0</div><div class='add'>+#else</div><div class='add'>+# define USE_LISTDIR_INTRINSIC	1</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if USE_LISTDIR_INTRINSIC</div><div class='add'>+</div><div class='add'>+#if defined(__WIN32__)</div><div class='add'>+# include &lt;windows.h&gt;</div><div class='add'>+#else</div><div class='add'>+# if defined(__OS2__) &amp;&amp; defined(__IBMC__)</div><div class='add'>+#  define INCL_DOS</div><div class='add'>+#  define INCL_ERRORS</div><div class='add'>+#  include &lt;os2.h&gt;</div><div class='add'>+#  include &lt;direct.h&gt;</div><div class='add'>+#  include &lt;ctype.h&gt;</div><div class='add'>+# else</div><div class='add'>+#  ifdef HAVE_DIRENT_H</div><div class='add'>+#   include &lt;dirent.h&gt;</div><div class='add'>+#  else</div><div class='add'>+#   ifdef HAVE_DIRECT_H</div><div class='add'>+#    include &lt;direct.h&gt;</div><div class='add'>+#   else</div><div class='add'>+#    define dirent direct</div><div class='add'>+#    define NEED_D_NAMLEN</div><div class='add'>+#    if HAVE_SYS_NDIR_H</div><div class='add'>+#     include &lt;sys/ndir.h&gt;</div><div class='add'>+#    endif</div><div class='add'>+#    if HAVE_SYS_DIR_H</div><div class='add'>+#     include &lt;sys/dir.h&gt;</div><div class='add'>+#    endif</div><div class='add'>+#    if HAVE_NDIR_H</div><div class='add'>+#     include &lt;ndir.h&gt;</div><div class='add'>+#    endif</div><div class='add'>+#   endif</div><div class='add'>+#  endif</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#endif				       /* USE_LISTDIR_INTRINSIC */</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static int push_stat_struct (struct stat *st, int opt_attrs)</div><div class='add'>+{</div><div class='add'>+   char *field_names [12];</div><div class='add'>+   unsigned char field_types[12];</div><div class='add'>+   VOID_STAR field_values [12];</div><div class='add'>+   int int_values [12];</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   field_names [0] = "st_dev"; int_values [0] = (int) st-&gt;st_dev;</div><div class='add'>+   field_names [1] = "st_ino"; int_values [1] = (int) st-&gt;st_ino;</div><div class='add'>+   field_names [2] = "st_mode"; int_values [2] = (int) st-&gt;st_mode;</div><div class='add'>+   field_names [3] = "st_nlink"; int_values [3] = (int) st-&gt;st_nlink;</div><div class='add'>+   field_names [4] = "st_uid"; int_values [4] = (int) st-&gt;st_uid;</div><div class='add'>+   field_names [5] = "st_gid"; int_values [5] = (int) st-&gt;st_gid;</div><div class='add'>+   field_names [6] = "st_rdev"; int_values [6] = (int) st-&gt;st_rdev;</div><div class='add'>+   field_names [7] = "st_size"; int_values [7] = (int) st-&gt;st_size;</div><div class='add'>+   field_names [8] = "st_atime"; int_values [8] = (int) st-&gt;st_atime;</div><div class='add'>+   field_names [9] = "st_mtime"; int_values [9] = (int) st-&gt;st_mtime;</div><div class='add'>+   field_names [10] = "st_ctime"; int_values [10] = (int) st-&gt;st_ctime;</div><div class='add'>+</div><div class='add'>+   field_names [11] = "st_opt_attrs"; int_values[11] = opt_attrs;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; 12; i++)</div><div class='add'>+     {</div><div class='add'>+	field_types [i] = SLANG_INT_TYPE;</div><div class='add'>+	field_values [i] = (VOID_STAR) (int_values + i);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return SLstruct_create_struct (12, field_names, field_types, field_values);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void stat_cmd (char *file)</div><div class='add'>+{</div><div class='add'>+   struct stat st;</div><div class='add'>+   int status;</div><div class='add'>+   int opt_attrs;</div><div class='add'>+</div><div class='add'>+   status = stat (file, &amp;st);</div><div class='add'>+</div><div class='add'>+#if defined(__MSDOS__) || defined(__WIN32__)</div><div class='add'>+   if (status == -1)</div><div class='add'>+     {</div><div class='add'>+	unsigned int len = strlen (file);</div><div class='add'>+	if (len &amp;&amp; ((file[len-1] == '\\') || (file[len-1] == '/')))</div><div class='add'>+	  {</div><div class='add'>+	     file = SLmake_nstring (file, len-1);</div><div class='add'>+	     if (file == NULL)</div><div class='add'>+	       return;</div><div class='add'>+</div><div class='add'>+	     status = stat (file, &amp;st);</div><div class='add'>+	     SLfree (file);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   if (status == -1)</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	SLang_push_null ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+   opt_attrs = GetFileAttributes (file);</div><div class='add'>+#else</div><div class='add'>+   opt_attrs = 0;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   push_stat_struct (&amp;st, opt_attrs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void lstat_cmd (char *file)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_LSTAT</div><div class='add'>+   struct stat st;</div><div class='add'>+   int opt_attrs;</div><div class='add'>+</div><div class='add'>+   if (-1 == lstat (file, &amp;st))</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	SLang_push_null ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+   opt_attrs = GetFileAttributes (file);</div><div class='add'>+#else</div><div class='add'>+   opt_attrs = 0;</div><div class='add'>+#endif</div><div class='add'>+   </div><div class='add'>+   push_stat_struct (&amp;st, opt_attrs);</div><div class='add'>+#else</div><div class='add'>+   stat_cmd (file);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Well, it appears that on some systems, these are not defined.  Here I</div><div class='add'>+ * provide them.  These are derived from the Linux stat.h file.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#ifdef __os2__</div><div class='add'>+# ifdef __IBMC__</div><div class='add'>+/* IBM VA3 doesn't declare S_IFMT */</div><div class='add'>+#  define	S_IFMT	(S_IFDIR | S_IFCHR | S_IFREG)</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISLNK</div><div class='add'>+# ifdef S_IFLNK</div><div class='add'>+#   define S_ISLNK(m) (((m) &amp; S_IFMT) == S_IFLNK)</div><div class='add'>+# else</div><div class='add'>+#   define S_ISLNK(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISREG</div><div class='add'>+# ifdef S_IFREG</div><div class='add'>+#   define S_ISREG(m) (((m) &amp; S_IFMT) == S_IFREG)</div><div class='add'>+# else</div><div class='add'>+#   define S_ISREG(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISDIR</div><div class='add'>+# ifdef S_IFDIR</div><div class='add'>+#   define S_ISDIR(m) (((m) &amp; S_IFMT) == S_IFDIR)</div><div class='add'>+# else</div><div class='add'>+#   define S_ISDIR(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISCHR</div><div class='add'>+# ifdef S_IFCHR</div><div class='add'>+#   define S_ISCHR(m) (((m) &amp; S_IFMT) == S_IFCHR)</div><div class='add'>+# else</div><div class='add'>+#   define S_ISCHR(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISBLK</div><div class='add'>+# ifdef S_IFBLK</div><div class='add'>+#   define S_ISBLK(m) (((m) &amp; S_IFMT) == S_IFBLK)</div><div class='add'>+# else</div><div class='add'>+#   define S_ISBLK(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISFIFO</div><div class='add'>+# ifdef S_IFIFO</div><div class='add'>+#   define S_ISFIFO(m) (((m) &amp; S_IFMT) == S_IFIFO)</div><div class='add'>+# else</div><div class='add'>+#   define S_ISFIFO(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef S_ISSOCK</div><div class='add'>+# ifdef S_IFSOCK</div><div class='add'>+#   define S_ISSOCK(m) (((m) &amp; S_IFMT) == S_IFSOCK)</div><div class='add'>+# else</div><div class='add'>+#   define S_ISSOCK(m) 0</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static char stat_is_cmd (char *what, int *mode_ptr)</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+   int st_mode = *mode_ptr;</div><div class='add'>+</div><div class='add'>+   if (!strcmp (what, "sock")) ret = S_ISSOCK(st_mode);</div><div class='add'>+   else if (!strcmp (what, "fifo")) ret = S_ISFIFO(st_mode);</div><div class='add'>+   else if (!strcmp (what, "blk")) ret = S_ISBLK(st_mode);</div><div class='add'>+   else if (!strcmp (what, "chr")) ret = S_ISCHR(st_mode);</div><div class='add'>+   else if (!strcmp (what, "dir")) ret = S_ISDIR(st_mode);</div><div class='add'>+   else if (!strcmp (what, "reg")) ret = S_ISREG(st_mode);</div><div class='add'>+   else if (!strcmp (what, "lnk")) ret = S_ISLNK(st_mode);</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "stat_is: Unrecognized type: %s", what);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return (char) (ret != 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_READLINK</div><div class='add'>+static void readlink_cmd (char *s)</div><div class='add'>+{</div><div class='add'>+   char buf[2048];</div><div class='add'>+   int n;</div><div class='add'>+</div><div class='add'>+   n = readlink (s, buf, sizeof (buf)-1);</div><div class='add'>+   if (n == -1)</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	s = NULL;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	buf[n] = 0;</div><div class='add'>+	s = buf;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   (void) SLang_push_string (s);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int chmod_cmd (char *file, int *mode)</div><div class='add'>+{</div><div class='add'>+   if (-1 == chmod(file, (mode_t) *mode))</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_CHOWN</div><div class='add'>+static int chown_cmd (char *file, int *owner, int *group)</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   if (-1 == (ret = chown(file, (uid_t) *owner, (gid_t) *group)))</div><div class='add'>+     _SLerrno_errno = errno;</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* add trailing slash to dir */</div><div class='add'>+static void fixup_dir (char *dir)</div><div class='add'>+{</div><div class='add'>+#ifndef VMS</div><div class='add'>+   int n;</div><div class='add'>+</div><div class='add'>+   if ((n = strlen(dir)) &gt; 1)</div><div class='add'>+     {</div><div class='add'>+	n--;</div><div class='add'>+#if defined(IBMPC_SYSTEM)</div><div class='add'>+      if ( dir[n] != '/' &amp;&amp; dir[n] != '\\' )</div><div class='add'>+      	strcat(dir, "\\" );</div><div class='add'>+#else</div><div class='add'>+      if (dir[n] != '/' )</div><div class='add'>+      	strcat(dir, "/" );</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+#endif /* !VMS */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void slget_cwd (void)</div><div class='add'>+{</div><div class='add'>+   char cwd[1024];</div><div class='add'>+   char *p;</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_GETCWD</div><div class='add'>+   p = getwd (cwd);</div><div class='add'>+#else</div><div class='add'>+# if defined (__EMX__)</div><div class='add'>+   p = _getcwd2(cwd, 1022);	       /* includes drive specifier */</div><div class='add'>+# else</div><div class='add'>+   p = getcwd(cwd, 1022);	       /* djggp includes drive specifier */</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (p == NULL)</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	SLang_push_null ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#ifndef VMS</div><div class='add'>+#ifdef __GO32__</div><div class='add'>+   /* You never know about djgpp since it favors unix */</div><div class='add'>+     {</div><div class='add'>+	char ch;</div><div class='add'>+	p = cwd;</div><div class='add'>+	while ((ch = *p) != 0)</div><div class='add'>+	  {</div><div class='add'>+	     if (ch == '/') *p = '\\';</div><div class='add'>+	     p++;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   fixup_dir (cwd);</div><div class='add'>+#endif</div><div class='add'>+   SLang_push_string (cwd);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int chdir_cmd (char *s)</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   while (-1 == (ret = chdir (s)))</div><div class='add'>+     {</div><div class='add'>+#ifdef EINTR</div><div class='add'>+	if (errno == EINTR)</div><div class='add'>+	  continue;</div><div class='add'>+#endif</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+static int remove_cmd (char *);</div><div class='add'>+/* If the file looks like xxx, then change it to xxx.dir.  If</div><div class='add'>+ * it looks like A:[B.xxx] then change it to A:[B]xxx.dir.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static char *vms_convert_dirspec_to_vms_dir (char *str)</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+   char *version;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   char *dot;</div><div class='add'>+</div><div class='add'>+   len = strlen (str);</div><div class='add'>+</div><div class='add'>+   version = strchr (str, ';');</div><div class='add'>+   if (version == NULL)</div><div class='add'>+     version = str + len;</div><div class='add'>+   /* version points to the version of the input string */</div><div class='add'>+</div><div class='add'>+   </div><div class='add'>+   if (NULL == (s = SLmalloc (len + 8)))/* allow extra space to work with */</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   len = (unsigned int) (version - str);</div><div class='add'>+   strncpy (s, str, len);</div><div class='add'>+   s[len] = 0;</div><div class='add'>+   str = s;</div><div class='add'>+   </div><div class='add'>+   /* Lowercase the whole thing */</div><div class='add'>+   while (*s != 0)</div><div class='add'>+     {</div><div class='add'>+	*s = LOWER_CASE(*s);</div><div class='add'>+	s++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((s &gt; str)</div><div class='add'>+       &amp;&amp; (s[-1] != ']'))</div><div class='add'>+     {</div><div class='add'>+	if ((s &gt;= str + 4)</div><div class='add'>+	    &amp;&amp; (0 == strcmp (s - 4, ".dir")))</div><div class='add'>+	  s -= 4;</div><div class='add'>+	goto add_dir_version;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Check for one of two possibilities:</div><div class='add'>+    * </div><div class='add'>+    *     dev:[x]   --&gt; dev:x</div><div class='add'>+    *     dev:[a.x] --&gt; dev:[a]x</div><div class='add'>+    */</div><div class='add'>+   </div><div class='add'>+   if (NULL == (dot = strchr (str, '.')))</div><div class='add'>+     {</div><div class='add'>+	/* First possibility */</div><div class='add'>+	if (NULL == (s = strchr (str, '[')))</div><div class='add'>+	  return str;		       /* let someone else figure this out */</div><div class='add'>+	while (s[1] != ']')</div><div class='add'>+	  {</div><div class='add'>+	     s[0] = s[1];</div><div class='add'>+	     s++;</div><div class='add'>+	  }</div><div class='add'>+	*s = 0;</div><div class='add'>+	goto add_dir_version;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   while (NULL != (s = strchr (dot + 1, '.')))</div><div class='add'>+     dot = s;</div><div class='add'>+   </div><div class='add'>+   *dot = ']';</div><div class='add'>+   s = str + (len - 1);</div><div class='add'>+   </div><div class='add'>+   /* Drop */</div><div class='add'>+</div><div class='add'>+   add_dir_version:</div><div class='add'>+   strcpy (s, ".dir");</div><div class='add'>+   strcpy (s+4, version);</div><div class='add'>+   return str;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int rmdir_cmd (char *s)</div><div class='add'>+{</div><div class='add'>+#ifdef VMS</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   if (NULL == (s = vms_convert_dirspec_to_vms_dir (s)))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   status = remove_cmd (s);</div><div class='add'>+   SLfree (s);</div><div class='add'>+   </div><div class='add'>+   return status;</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   while (-1 == (ret = rmdir (s)))</div><div class='add'>+     {</div><div class='add'>+#ifdef EINTR</div><div class='add'>+	if (errno == EINTR)</div><div class='add'>+	  continue;</div><div class='add'>+#endif</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return ret;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int remove_cmd (char *s)</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+#ifdef VMS</div><div class='add'>+# define REMOVE delete</div><div class='add'>+#else</div><div class='add'>+# ifdef REAL_UNIX_SYSTEM</div><div class='add'>+#  define REMOVE unlink</div><div class='add'>+# else</div><div class='add'>+#  define REMOVE remove</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   while (-1 == (ret = REMOVE (s)))</div><div class='add'>+     {</div><div class='add'>+#ifdef EINTR</div><div class='add'>+	if (errno == EINTR)</div><div class='add'>+	  continue;</div><div class='add'>+#endif</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rename_cmd (char *oldpath, char *newpath)</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+   while (-1 == (ret = rename (oldpath, newpath)))</div><div class='add'>+     {</div><div class='add'>+#ifdef EINTR</div><div class='add'>+	if (errno == EINTR)</div><div class='add'>+	  continue;</div><div class='add'>+#endif</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int mkdir_cmd (char *s, int *mode_ptr)</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   (void) mode_ptr;</div><div class='add'>+   errno = 0;</div><div class='add'>+</div><div class='add'>+#if defined (__MSDOS__) &amp;&amp; !defined(__GO32__)</div><div class='add'>+# define MKDIR(x,y) mkdir(x)</div><div class='add'>+#else</div><div class='add'>+# if defined (__os2__) &amp;&amp; !defined (__EMX__)</div><div class='add'>+#  define MKDIR(x,y) mkdir(x)</div><div class='add'>+# else</div><div class='add'>+#  if defined (__WIN32__) &amp;&amp; !defined (__CYGWIN32__)</div><div class='add'>+#   define MKDIR(x,y) mkdir(x)</div><div class='add'>+#  else</div><div class='add'>+#   define MKDIR mkdir</div><div class='add'>+#  endif</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   while (-1 == (ret = MKDIR(s, *mode_ptr)))</div><div class='add'>+     {</div><div class='add'>+#ifdef EINTR</div><div class='add'>+	if (errno == EINTR)</div><div class='add'>+	  continue;</div><div class='add'>+#endif</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_MKFIFO</div><div class='add'>+static int mkfifo_cmd (char *path, int *mode)</div><div class='add'>+{</div><div class='add'>+   if (-1 == mkfifo (path, *mode))</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if USE_LISTDIR_INTRINSIC</div><div class='add'>+</div><div class='add'>+static void free_dir_list (char **list, unsigned int num)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   if (list == NULL)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; num; i++)</div><div class='add'>+     SLang_free_slstring (list[i]);</div><div class='add'>+   SLfree ((char *) list);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if defined(__WIN32__) || defined(__os2__) &amp;&amp; defined(__IBMC__)</div><div class='add'>+static int build_dirlist (char *file, char *opt, char ***listp, unsigned int *nump, unsigned int *maxnum)</div><div class='add'>+{</div><div class='add'>+# ifdef __WIN32__</div><div class='add'>+   DWORD status;</div><div class='add'>+   HANDLE h;</div><div class='add'>+   WIN32_FIND_DATA fd;</div><div class='add'>+# else</div><div class='add'>+   APIRET rc;</div><div class='add'>+   FILESTATUS3 status;</div><div class='add'>+   HDIR h;</div><div class='add'>+   FILEFINDBUF3 fd;</div><div class='add'>+   ULONG cFileNames;</div><div class='add'>+# endif</div><div class='add'>+   char *pat;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   char **list;</div><div class='add'>+   unsigned int num;</div><div class='add'>+   unsigned int max_num;</div><div class='add'>+   int hok;</div><div class='add'>+</div><div class='add'>+   /* If an option is present, assume ok to list hidden files.  Later</div><div class='add'>+    * I will formalize this.</div><div class='add'>+    */</div><div class='add'>+   hok = (opt != NULL);</div><div class='add'>+</div><div class='add'>+# ifdef __WIN32__</div><div class='add'>+   status = GetFileAttributes (file);</div><div class='add'>+# else</div><div class='add'>+   rc = DosQueryPathInfo(file, FIL_STANDARD, &amp;status, sizeof(FILESTATUS3));</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+# ifdef __WIN32__</div><div class='add'>+   if (status == (DWORD)-1)</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = ENOENT;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   if (0 == (status &amp; FILE_ATTRIBUTE_DIRECTORY))</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = ENOTDIR;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+# else</div><div class='add'>+   if ((rc != 0) || (status.attrFile &amp; FILE_DIRECTORY) == 0)</div><div class='add'>+     {</div><div class='add'>+	/* ENOTDIR isn't defined in VA3. */</div><div class='add'>+	_SLerrno_errno = ENOENT;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+   len = strlen (file);</div><div class='add'>+   pat = SLmalloc (len + 3);</div><div class='add'>+   if (pat == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   strcpy (pat, file);</div><div class='add'>+   file = pat;</div><div class='add'>+   while (*file != 0)</div><div class='add'>+     {</div><div class='add'>+	if (*file == '/') *file = '\\';</div><div class='add'>+	file++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (len &amp;&amp; (pat[len-1] != '\\'))</div><div class='add'>+     {</div><div class='add'>+	pat[len] = '\\';</div><div class='add'>+	len++;</div><div class='add'>+     }</div><div class='add'>+   pat[len++] = '*';</div><div class='add'>+   pat[len] = 0;</div><div class='add'>+</div><div class='add'>+   num = 0;</div><div class='add'>+   max_num = 50;</div><div class='add'>+   list = (char **)SLmalloc (max_num * sizeof(char *));</div><div class='add'>+   if (list == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLfree (pat);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+# ifdef __WIN32__</div><div class='add'>+   h = FindFirstFile(pat, &amp;fd);</div><div class='add'>+   if (h == INVALID_HANDLE_VALUE)</div><div class='add'>+     {</div><div class='add'>+	if (ERROR_NO_MORE_FILES != GetLastError())</div><div class='add'>+	  {</div><div class='add'>+	     SLfree (pat);</div><div class='add'>+	     SLfree ((char *)list);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+# else</div><div class='add'>+   h = HDIR_CREATE;</div><div class='add'>+   cFileNames = 1;</div><div class='add'>+   rc = DosFindFirst(pat, &amp;h, FILE_READONLY | FILE_DIRECTORY |</div><div class='add'>+		     FILE_ARCHIVED, &amp;fd, sizeof(fd), &amp;cFileNames, FIL_STANDARD);</div><div class='add'>+   if (rc != 0)</div><div class='add'>+     {</div><div class='add'>+	if (rc != ERROR_NO_MORE_FILES)</div><div class='add'>+	  {</div><div class='add'>+	     SLfree (pat);</div><div class='add'>+	     SLfree ((char *)list);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+# endif   </div><div class='add'>+   else while (1)</div><div class='add'>+     {</div><div class='add'>+	/* Do not include hidden files in the list.  Also, do not</div><div class='add'>+	 * include "." and ".." entries.</div><div class='add'>+	 */</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+	file = fd.cFileName;</div><div class='add'>+#else</div><div class='add'>+	file = fd.achName;</div><div class='add'>+#endif</div><div class='add'>+	if (</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+	    (hok || (0 == (fd.dwFileAttributes &amp; FILE_ATTRIBUTE_HIDDEN)))</div><div class='add'>+#else</div><div class='add'>+	    (hok || (0 == (fd.attrFile &amp; FILE_HIDDEN)))</div><div class='add'>+#endif</div><div class='add'>+	    &amp;&amp; ((*file != '.')</div><div class='add'>+		|| ((0 != strcmp (file, "."))</div><div class='add'>+		    &amp;&amp; (0 != strcmp (file, "..")))))</div><div class='add'>+	  {</div><div class='add'>+	     if (num == max_num)</div><div class='add'>+	       {</div><div class='add'>+		  char **new_list;</div><div class='add'>+</div><div class='add'>+		  max_num += 100;</div><div class='add'>+		  new_list = (char **)SLrealloc ((char *)list, max_num * sizeof (char *));</div><div class='add'>+		  if (new_list == NULL)</div><div class='add'>+		    goto return_error;</div><div class='add'>+</div><div class='add'>+		  list = new_list;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     file = SLang_create_slstring (file);</div><div class='add'>+	     if (file == NULL)</div><div class='add'>+	       goto return_error;</div><div class='add'>+</div><div class='add'>+	     list[num] = file;</div><div class='add'>+	     num++;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+	if (FALSE == FindNextFile(h, &amp;fd))</div><div class='add'>+	  {</div><div class='add'>+	     if (ERROR_NO_MORE_FILES == GetLastError())</div><div class='add'>+	       {</div><div class='add'>+		  FindClose (h);</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     _SLerrno_errno = errno;</div><div class='add'>+	     FindClose (h);</div><div class='add'>+	     goto return_error;</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+        cFileNames = 1;</div><div class='add'>+        rc = DosFindNext(h, &amp;fd, sizeof(fd), &amp;cFileNames);</div><div class='add'>+        if (rc != 0)</div><div class='add'>+	  {</div><div class='add'>+	     if (rc == ERROR_NO_MORE_FILES)</div><div class='add'>+	       {</div><div class='add'>+		  DosFindClose (h);</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     _SLerrno_errno = errno;</div><div class='add'>+	     DosFindClose (h);</div><div class='add'>+	     goto return_error;</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLfree (pat);</div><div class='add'>+   *maxnum = max_num;</div><div class='add'>+   *nump = num;</div><div class='add'>+   *listp = list;</div><div class='add'>+   return 0;</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   free_dir_list (list, num);</div><div class='add'>+   SLfree (pat);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#else				       /* NOT __WIN32__ */</div><div class='add'>+</div><div class='add'>+static int build_dirlist (char *dir, char *opt, char ***listp, unsigned int *nump, unsigned int *maxnum)</div><div class='add'>+{</div><div class='add'>+   DIR *dp;</div><div class='add'>+   struct dirent *ep;</div><div class='add'>+   unsigned int num_files;</div><div class='add'>+   unsigned int max_num_files;</div><div class='add'>+   char **list;</div><div class='add'>+</div><div class='add'>+   (void) opt;</div><div class='add'>+</div><div class='add'>+   if (NULL == (dp = opendir (dir)))</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   num_files = max_num_files = 0;</div><div class='add'>+   list = NULL;</div><div class='add'>+   while (NULL != (ep = readdir (dp)))</div><div class='add'>+     {</div><div class='add'>+	unsigned int len;</div><div class='add'>+	char *name;</div><div class='add'>+</div><div class='add'>+	name = ep-&gt;d_name;</div><div class='add'>+#  ifdef NEED_D_NAMLEN</div><div class='add'>+	len = ep-&gt;d_namlen;</div><div class='add'>+#  else</div><div class='add'>+	len = strlen (name);</div><div class='add'>+#  endif</div><div class='add'>+	if ((*name == '.') &amp;&amp; (len &lt;= 2))</div><div class='add'>+	  {</div><div class='add'>+	     if (len == 1) continue;</div><div class='add'>+	     if (name [1] == '.') continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (num_files == max_num_files)</div><div class='add'>+	  {</div><div class='add'>+	     char **new_list;</div><div class='add'>+</div><div class='add'>+	     max_num_files += 100;</div><div class='add'>+	     if (NULL == (new_list = (char **) SLrealloc ((char *)list, max_num_files * sizeof(char *))))</div><div class='add'>+	       goto return_error;</div><div class='add'>+</div><div class='add'>+	     list = new_list;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (NULL == (list[num_files] = SLang_create_nslstring (name, len)))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	num_files++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   closedir (dp);</div><div class='add'>+   *nump = num_files;</div><div class='add'>+   *maxnum = max_num_files;</div><div class='add'>+   *listp = list;</div><div class='add'>+   return 0;</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   if (dp != NULL)</div><div class='add'>+     closedir (dp);</div><div class='add'>+   free_dir_list (list, num_files);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+# endif				       /* NOT __WIN32__ */</div><div class='add'>+</div><div class='add'>+static void listdir_cmd (char *dir, char *opt)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   unsigned int num_files;</div><div class='add'>+   unsigned int max_num_files;</div><div class='add'>+   int inum_files;</div><div class='add'>+   char **list;</div><div class='add'>+</div><div class='add'>+   if (-1 == build_dirlist (dir, opt, &amp;list, &amp;num_files, &amp;max_num_files))</div><div class='add'>+     {</div><div class='add'>+	SLang_push_null ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   /* If max_num_files == 0, then num_files == 0 and list == NULL.  </div><div class='add'>+    * The realloc step below will malloc list for us.</div><div class='add'>+    */</div><div class='add'>+   if (num_files + 1 &lt; max_num_files)</div><div class='add'>+     {</div><div class='add'>+	char **new_list;</div><div class='add'>+	if (NULL == (new_list = (char **) SLrealloc ((char *)list, (num_files + 1)* sizeof(char*))))</div><div class='add'>+	  {</div><div class='add'>+	     free_dir_list (list, num_files);</div><div class='add'>+	     SLang_push_null ();</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+	list = new_list;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   inum_files = (int) num_files;</div><div class='add'>+   if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, (VOID_STAR) list, &amp;inum_files, 1)))</div><div class='add'>+     {</div><div class='add'>+	free_dir_list (list, num_files);</div><div class='add'>+	SLang_push_null ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Allow the array to free this list if push fails */</div><div class='add'>+   if (-1 == SLang_push_array (at, 1))</div><div class='add'>+     SLang_push_null ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void listdir_cmd_wrap (void)</div><div class='add'>+{</div><div class='add'>+   char *s, *sopt;</div><div class='add'>+</div><div class='add'>+   sopt = NULL;</div><div class='add'>+   switch (SLang_Num_Function_Args)</div><div class='add'>+     {</div><div class='add'>+      case 2:</div><div class='add'>+	if (-1 == SLang_pop_slstring (&amp;sopt))</div><div class='add'>+	  return;</div><div class='add'>+      case 1:</div><div class='add'>+	if (-1 == SLang_pop_slstring (&amp;s))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_slstring (sopt);</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      default:</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "usage: listdir (string, [opt-string]");</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   listdir_cmd (s, sopt);</div><div class='add'>+   SLang_free_slstring (s);</div><div class='add'>+   SLang_free_slstring (sopt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif				       /* USE_LISTDIR_INTRINSIC */</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_UMASK</div><div class='add'>+static int umask_cmd (int *u)</div><div class='add'>+{</div><div class='add'>+   return umask (*u);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type PosixDir_Name_Table [] =</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_READLINK</div><div class='add'>+   MAKE_INTRINSIC_S("readlink", readlink_cmd, SLANG_VOID_TYPE),</div><div class='add'>+#endif</div><div class='add'>+   MAKE_INTRINSIC_S("lstat_file", lstat_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("stat_file", stat_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SI("stat_is", stat_is_cmd, SLANG_CHAR_TYPE),</div><div class='add'>+#ifdef HAVE_MKFIFO</div><div class='add'>+   MAKE_INTRINSIC_SI("mkfifo", mkfifo_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_CHOWN</div><div class='add'>+   MAKE_INTRINSIC_SII("chown", chown_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+   MAKE_INTRINSIC_SI("chmod", chmod_cmd, SLANG_INT_TYPE),</div><div class='add'>+#ifdef HAVE_UMASK</div><div class='add'>+   MAKE_INTRINSIC_I("umask", umask_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+   MAKE_INTRINSIC_0("getcwd", slget_cwd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SI("mkdir", mkdir_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("chdir", chdir_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("rmdir", rmdir_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("remove", remove_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SS("rename", rename_cmd, SLANG_INT_TYPE),</div><div class='add'>+#if USE_LISTDIR_INTRINSIC</div><div class='add'>+   MAKE_INTRINSIC("listdir", listdir_cmd_wrap, SLANG_VOID_TYPE, 0),</div><div class='add'>+#endif</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static SLang_IConstant_Type PosixDir_Consts [] =</div><div class='add'>+{</div><div class='add'>+#ifndef S_IRWXU</div><div class='add'>+# define S_IRWXU 00700</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("S_IRWXU", S_IRWXU),</div><div class='add'>+#ifndef S_IRUSR</div><div class='add'>+# define S_IRUSR 00400</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("S_IRUSR", S_IRUSR),</div><div class='add'>+#ifndef S_IWUSR</div><div class='add'>+# define S_IWUSR 00200</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("S_IWUSR", S_IWUSR),</div><div class='add'>+#ifndef S_IXUSR</div><div class='add'>+# define S_IXUSR 00100</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("S_IXUSR", S_IXUSR),</div><div class='add'>+#ifndef S_IRWXG</div><div class='add'>+# define S_IRWXG 00070</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("S_IRWXG", S_IRWXG),</div><div class='add'>+#ifndef S_IRGRP</div><div class='add'>+# define S_IRGRP 00040</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("S_IRGRP", S_IRGRP),</div><div class='add'>+#ifndef S_IWGRP</div><div class='add'>+# define S_IWGRP 00020</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("S_IWGRP", S_IWGRP),</div><div class='add'>+#ifndef S_IXGRP</div><div class='add'>+# define S_IXGRP 00010</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("S_IXGRP", S_IXGRP),</div><div class='add'>+#ifndef S_IRWXO</div><div class='add'>+# define S_IRWXO 00007</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("S_IRWXO", S_IRWXO),</div><div class='add'>+#ifndef S_IROTH</div><div class='add'>+# define S_IROTH 00004</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("S_IROTH", S_IROTH),</div><div class='add'>+#ifndef S_IWOTH</div><div class='add'>+# define S_IWOTH 00002</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("S_IWOTH", S_IWOTH),</div><div class='add'>+#ifndef S_IXOTH</div><div class='add'>+# define S_IXOTH 00001</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("S_IXOTH", S_IXOTH),</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+   MAKE_ICONSTANT("FILE_ATTRIBUTE_ARCHIVE", FILE_ATTRIBUTE_ARCHIVE),</div><div class='add'>+   MAKE_ICONSTANT("FILE_ATTRIBUTE_COMPRESSED", FILE_ATTRIBUTE_COMPRESSED),</div><div class='add'>+   MAKE_ICONSTANT("FILE_ATTRIBUTE_NORMAL", FILE_ATTRIBUTE_NORMAL),</div><div class='add'>+   MAKE_ICONSTANT("FILE_ATTRIBUTE_DIRECTORY", FILE_ATTRIBUTE_DIRECTORY),</div><div class='add'>+   MAKE_ICONSTANT("FILE_ATTRIBUTE_HIDDEN", FILE_ATTRIBUTE_HIDDEN),</div><div class='add'>+   MAKE_ICONSTANT("FILE_ATTRIBUTE_READONLY", FILE_ATTRIBUTE_READONLY),</div><div class='add'>+   MAKE_ICONSTANT("FILE_ATTRIBUTE_SYSTEM", FILE_ATTRIBUTE_SYSTEM),</div><div class='add'>+   MAKE_ICONSTANT("FILE_ATTRIBUTE_TEMPORARY", FILE_ATTRIBUTE_TEMPORARY),</div><div class='add'>+#endif</div><div class='add'>+   SLANG_END_ICONST_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int Initialized;</div><div class='add'>+</div><div class='add'>+int SLang_init_posix_dir (void)</div><div class='add'>+{</div><div class='add'>+   if (Initialized)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLadd_intrin_fun_table(PosixDir_Name_Table, "__POSIX_DIR__"))</div><div class='add'>+       || (-1 == SLadd_iconstant_table (PosixDir_Consts, NULL))</div><div class='add'>+       || (-1 == _SLerrno_init ()))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   Initialized = 1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slposio.c b/mdk-stage1/slang/slposio.c<br/>new file mode 100644<br/>index 000000000..ab1e9f689<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slposio.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slposio.c</a></div><div class='hunk'>@@ -0,0 +1,568 @@</div><div class='add'>+/* This module implements an interface to posix system calls */</div><div class='add'>+/* file stdio intrinsics for S-Lang */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#if defined(__unix__) || (defined (__os2__) &amp;&amp; defined (__EMX__))</div><div class='add'>+# include &lt;sys/types.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_FCNTL_H</div><div class='add'>+# include &lt;fcntl.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SYS_FCNTL_H</div><div class='add'>+# include &lt;sys/fcntl.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __unix__</div><div class='add'>+# include &lt;sys/file.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_IO_H</div><div class='add'>+# include &lt;io.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include &lt;dir.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__DECC) &amp;&amp; defined(VMS)</div><div class='add'>+# include &lt;unixio.h&gt;</div><div class='add'>+# include &lt;unixlib.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+# include &lt;stat.h&gt;</div><div class='add'>+#else</div><div class='add'>+# include &lt;sys/stat.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+struct _SLFile_FD_Type</div><div class='add'>+{</div><div class='add'>+   char *name;</div><div class='add'>+   unsigned int num_refs;	       /* reference counting */</div><div class='add'>+   int fd;</div><div class='add'>+   SLang_MMT_Type *stdio_mmt;	       /* fdopen'd stdio object */</div><div class='add'>+</div><div class='add'>+   /* methods */</div><div class='add'>+   int (*close)(int);</div><div class='add'>+   int (*read) (int, char *, unsigned int *);</div><div class='add'>+   int (*write)(int, char *, unsigned int *);</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int close_method (int fd)</div><div class='add'>+{</div><div class='add'>+   return close (fd);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int write_method (int fd, char *buf, unsigned int *nump)</div><div class='add'>+{</div><div class='add'>+   int num;</div><div class='add'>+</div><div class='add'>+   if (-1 == (num = write (fd, buf, *nump)))</div><div class='add'>+     {</div><div class='add'>+	*nump = 0;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *nump = (unsigned int) num;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int read_method (int fd, char *buf, unsigned int *nump)</div><div class='add'>+{</div><div class='add'>+   int num;</div><div class='add'>+</div><div class='add'>+   num = read (fd, buf, *nump);</div><div class='add'>+   if (num == -1)</div><div class='add'>+     {</div><div class='add'>+	*nump = 0;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   *nump = (unsigned int) num;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int check_fd (int fd)</div><div class='add'>+{</div><div class='add'>+   if (fd == -1)</div><div class='add'>+     {</div><div class='add'>+#ifdef EBADF</div><div class='add'>+	_SLerrno_errno = EBADF;</div><div class='add'>+#endif</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int posix_close (SLFile_FD_Type *f)</div><div class='add'>+{</div><div class='add'>+   if (-1 == check_fd (f-&gt;fd))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((f-&gt;close != NULL)</div><div class='add'>+       &amp;&amp; (-1 == f-&gt;close (f-&gt;fd)))</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (f-&gt;stdio_mmt != NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_free_mmt (f-&gt;stdio_mmt);</div><div class='add'>+	f-&gt;stdio_mmt = NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   f-&gt;fd = -1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Usage: Uint write (f, buf); */</div><div class='add'>+static void posix_write (SLFile_FD_Type *f, SLang_BString_Type *bstr)</div><div class='add'>+{</div><div class='add'>+   unsigned int len;</div><div class='add'>+   char *p;</div><div class='add'>+</div><div class='add'>+   if ((-1 == check_fd (f-&gt;fd))</div><div class='add'>+       || (NULL == (p = (char *)SLbstring_get_pointer (bstr, &amp;len))))</div><div class='add'>+     {</div><div class='add'>+	SLang_push_integer (-1);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == f-&gt;write (f-&gt;fd, p, &amp;len))</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	SLang_push_integer (-1);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   (void) SLang_push_uinteger (len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Usage: nn = read (f, &amp;buf, n); */</div><div class='add'>+static void posix_read (SLFile_FD_Type *f, SLang_Ref_Type *ref, unsigned int *nbytes)</div><div class='add'>+{</div><div class='add'>+   unsigned int len;</div><div class='add'>+   char *b;</div><div class='add'>+   SLang_BString_Type *bstr;</div><div class='add'>+</div><div class='add'>+   b = NULL;</div><div class='add'>+</div><div class='add'>+   len = *nbytes;</div><div class='add'>+   if ((-1 == check_fd (f-&gt;fd))</div><div class='add'>+       || (NULL == (b = SLmalloc (len + 1))))</div><div class='add'>+     goto return_error;</div><div class='add'>+   </div><div class='add'>+   if (-1 == f-&gt;read (f-&gt;fd, b, &amp;len))</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	goto return_error;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (len != *nbytes)</div><div class='add'>+     {</div><div class='add'>+	char *b1 = SLrealloc (b, len + 1);</div><div class='add'>+	if (b1 == NULL)</div><div class='add'>+	  goto return_error;</div><div class='add'>+	b = b1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   bstr = SLbstring_create_malloced ((unsigned char *) b, len, 0);</div><div class='add'>+   if (bstr != NULL)</div><div class='add'>+     {</div><div class='add'>+	if ((-1 != SLang_assign_to_ref (ref, SLANG_BSTRING_TYPE, (VOID_STAR)&amp;bstr))</div><div class='add'>+	    &amp;&amp; (-1 != SLang_push_uinteger (len)))</div><div class='add'>+	  return;</div><div class='add'>+</div><div class='add'>+	SLbstring_free (bstr);</div><div class='add'>+	b = NULL;</div><div class='add'>+	/* drop */</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   return_error:</div><div class='add'>+   if (b != NULL) SLfree ((char *)b);</div><div class='add'>+   (void) SLang_assign_to_ref (ref, SLANG_NULL_TYPE, NULL);</div><div class='add'>+   (void) SLang_push_integer (-1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLFile_FD_Type *SLfile_create_fd (char *name, int fd)</div><div class='add'>+{</div><div class='add'>+   SLFile_FD_Type *f;</div><div class='add'>+</div><div class='add'>+   if (NULL == (f = (SLFile_FD_Type *) SLmalloc (sizeof (SLFile_FD_Type))))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   memset ((char *) f, 0, sizeof (SLFile_FD_Type));</div><div class='add'>+   if (NULL == (f-&gt;name = SLang_create_slstring (name)))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *)f);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   f-&gt;fd = fd;</div><div class='add'>+   f-&gt;num_refs = 1;</div><div class='add'>+</div><div class='add'>+   f-&gt;close = close_method;</div><div class='add'>+   f-&gt;read = read_method;</div><div class='add'>+   f-&gt;write = write_method;</div><div class='add'>+</div><div class='add'>+   return f;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLFile_FD_Type *SLfile_dup_fd (SLFile_FD_Type *f0)</div><div class='add'>+{</div><div class='add'>+   SLFile_FD_Type *f;</div><div class='add'>+   int fd0, fd;</div><div class='add'>+</div><div class='add'>+   if (f0 == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+   fd0 = f0-&gt;fd;</div><div class='add'>+   if (-1 == check_fd (fd0))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   while (-1 == (fd = dup (fd0)))</div><div class='add'>+     {</div><div class='add'>+#ifdef EINTR</div><div class='add'>+	if (errno == EINTR)</div><div class='add'>+	  continue;</div><div class='add'>+#endif</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (NULL == (f = SLfile_create_fd (f0-&gt;name, fd)))</div><div class='add'>+     {</div><div class='add'>+	f0-&gt;close (fd);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   return f;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLfile_get_fd (SLFile_FD_Type *f, int *fd)</div><div class='add'>+{</div><div class='add'>+   if (f == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   *fd = f-&gt;fd;</div><div class='add'>+   if (-1 == check_fd (*fd))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLfile_free_fd (SLFile_FD_Type *f)</div><div class='add'>+{</div><div class='add'>+   if (f == NULL)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (f-&gt;num_refs &gt; 1)</div><div class='add'>+     {</div><div class='add'>+	f-&gt;num_refs -= 1;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (f-&gt;fd != -1)</div><div class='add'>+     {</div><div class='add'>+	if (f-&gt;close != NULL)</div><div class='add'>+	  (void) f-&gt;close (f-&gt;fd);</div><div class='add'>+</div><div class='add'>+	f-&gt;fd = -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (f-&gt;stdio_mmt != NULL)</div><div class='add'>+     SLang_free_mmt (f-&gt;stdio_mmt);</div><div class='add'>+</div><div class='add'>+   SLfree ((char *) f);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_string_int (char **s, int *i)</div><div class='add'>+{</div><div class='add'>+   *s = NULL;</div><div class='add'>+   if ((-1 == SLang_pop_integer (i))</div><div class='add'>+       || (-1 == SLang_pop_slstring (s)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int pop_string_int_int (char **s, int *a, int *b)</div><div class='add'>+{</div><div class='add'>+   *s = NULL;</div><div class='add'>+   if ((-1 == SLang_pop_integer (b))</div><div class='add'>+       || (-1 == pop_string_int (s, a)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void posix_open (void)</div><div class='add'>+{</div><div class='add'>+   char *file;</div><div class='add'>+   int mode, flags;</div><div class='add'>+   SLFile_FD_Type *f;</div><div class='add'>+</div><div class='add'>+   switch (SLang_Num_Function_Args)</div><div class='add'>+     {</div><div class='add'>+      case 3:</div><div class='add'>+	if (-1 == pop_string_int_int (&amp;file, &amp;flags, &amp;mode))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_push_null ();</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 2:</div><div class='add'>+      default:</div><div class='add'>+	if (-1 == pop_string_int (&amp;file, &amp;flags))</div><div class='add'>+	  return;</div><div class='add'>+	mode = 0777;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   f = SLfile_create_fd (file, -1);</div><div class='add'>+   if (f == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (file);</div><div class='add'>+	SLang_push_null ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   SLang_free_slstring (file);</div><div class='add'>+</div><div class='add'>+   if (-1 == (f-&gt;fd = open (f-&gt;name, flags, mode)))</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	SLfile_free_fd (f);</div><div class='add'>+	SLang_push_null ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == SLfile_push_fd (f))</div><div class='add'>+     SLang_push_null ();</div><div class='add'>+   SLfile_free_fd (f);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void posix_fileno (void)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+   int fd;</div><div class='add'>+   SLFile_FD_Type *f;</div><div class='add'>+   char *name;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_fileptr (&amp;mmt, &amp;fp))</div><div class='add'>+     {</div><div class='add'>+	SLang_push_null ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   name = SLang_get_name_from_fileptr (mmt);</div><div class='add'>+   fd = fileno (fp);</div><div class='add'>+</div><div class='add'>+   f = SLfile_create_fd (name, fd);</div><div class='add'>+   if (f != NULL)</div><div class='add'>+     f-&gt;close = NULL;		       /* prevent fd from being closed </div><div class='add'>+					* when it goes out of scope</div><div class='add'>+					*/</div><div class='add'>+   SLang_free_mmt (mmt);</div><div class='add'>+</div><div class='add'>+   if (-1 == SLfile_push_fd (f))</div><div class='add'>+     SLang_push_null ();</div><div class='add'>+   SLfile_free_fd (f);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void posix_fdopen (SLFile_FD_Type *f, char *mode)</div><div class='add'>+{</div><div class='add'>+   if (f-&gt;stdio_mmt == NULL)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == _SLstdio_fdopen (f-&gt;name, f-&gt;fd, mode))</div><div class='add'>+	  return;</div><div class='add'>+</div><div class='add'>+	if (NULL == (f-&gt;stdio_mmt = SLang_pop_mmt (SLANG_FILE_PTR_TYPE)))</div><div class='add'>+	  return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   (void) SLang_push_mmt (f-&gt;stdio_mmt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static long posix_lseek (SLFile_FD_Type *f, long ofs, int whence)</div><div class='add'>+{</div><div class='add'>+   long status;</div><div class='add'>+   </div><div class='add'>+   if (-1 == (status = lseek (f-&gt;fd, ofs, whence)))</div><div class='add'>+     _SLerrno_errno = errno;</div><div class='add'>+   </div><div class='add'>+   return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int posix_isatty (void)</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+   SLFile_FD_Type *f;</div><div class='add'>+</div><div class='add'>+   if (SLang_peek_at_stack () == SLANG_FILE_PTR_TYPE)</div><div class='add'>+     {</div><div class='add'>+	SLang_MMT_Type *mmt;</div><div class='add'>+	FILE *fp;</div><div class='add'>+</div><div class='add'>+	if (-1 == SLang_pop_fileptr (&amp;mmt, &amp;fp))</div><div class='add'>+	  return 0;		       /* invalid descriptor */</div><div class='add'>+</div><div class='add'>+	ret = isatty (fileno (fp));</div><div class='add'>+	SLang_free_mmt (mmt);</div><div class='add'>+	return ret;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == SLfile_pop_fd (&amp;f))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   ret = isatty (f-&gt;fd);</div><div class='add'>+   SLfile_free_fd (f);</div><div class='add'>+</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void posix_dup (SLFile_FD_Type *f)</div><div class='add'>+{</div><div class='add'>+   if ((NULL == (f = SLfile_dup_fd (f)))</div><div class='add'>+       || (-1 == SLfile_push_fd (f)))</div><div class='add'>+     SLang_push_null ();</div><div class='add'>+   </div><div class='add'>+   SLfile_free_fd (f);</div><div class='add'>+}</div><div class='add'>+	</div><div class='add'>+#define I SLANG_INT_TYPE</div><div class='add'>+#define V SLANG_VOID_TYPE</div><div class='add'>+#define F SLANG_FILE_FD_TYPE</div><div class='add'>+#define B SLANG_BSTRING_TYPE</div><div class='add'>+#define R SLANG_REF_TYPE</div><div class='add'>+#define U SLANG_UINT_TYPE</div><div class='add'>+#define S SLANG_STRING_TYPE</div><div class='add'>+#define L SLANG_LONG_TYPE</div><div class='add'>+static SLang_Intrin_Fun_Type Fd_Name_Table [] =</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_0("fileno", posix_fileno, V),</div><div class='add'>+   MAKE_INTRINSIC_0("isatty", posix_isatty, I),</div><div class='add'>+   MAKE_INTRINSIC_0("open", posix_open, V),</div><div class='add'>+   MAKE_INTRINSIC_3("read", posix_read, V, F, R, U),</div><div class='add'>+   MAKE_INTRINSIC_3("lseek", posix_lseek, L, F, L, I),</div><div class='add'>+   MAKE_INTRINSIC_2("fdopen", posix_fdopen, V, F, S),</div><div class='add'>+   MAKE_INTRINSIC_2("write", posix_write, V, F, B),</div><div class='add'>+   MAKE_INTRINSIC_1("dup_fd", posix_dup, V, F),</div><div class='add'>+   MAKE_INTRINSIC_1("close", posix_close, I, F),</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+#undef I</div><div class='add'>+#undef V</div><div class='add'>+#undef F</div><div class='add'>+#undef B</div><div class='add'>+#undef R</div><div class='add'>+#undef S</div><div class='add'>+#undef L</div><div class='add'>+#undef U</div><div class='add'>+</div><div class='add'>+static SLang_IConstant_Type PosixIO_Consts [] =</div><div class='add'>+{</div><div class='add'>+#ifdef O_RDONLY</div><div class='add'>+   MAKE_ICONSTANT("O_RDONLY", O_RDONLY),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_WRONLY</div><div class='add'>+   MAKE_ICONSTANT("O_WRONLY", O_WRONLY),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_RDWR</div><div class='add'>+   MAKE_ICONSTANT("O_RDWR", O_RDWR),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_APPEND</div><div class='add'>+   MAKE_ICONSTANT("O_APPEND", O_APPEND),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_CREAT</div><div class='add'>+   MAKE_ICONSTANT("O_CREAT", O_CREAT),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_EXCL</div><div class='add'>+   MAKE_ICONSTANT("O_EXCL", O_EXCL),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_NOCTTY</div><div class='add'>+   MAKE_ICONSTANT("O_NOCTTY", O_NOCTTY),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_NONBLOCK</div><div class='add'>+   MAKE_ICONSTANT("O_NONBLOCK", O_NONBLOCK),</div><div class='add'>+#endif</div><div class='add'>+#ifdef O_TRUNC</div><div class='add'>+   MAKE_ICONSTANT("O_TRUNC", O_TRUNC),</div><div class='add'>+#endif</div><div class='add'>+#ifndef O_BINARY</div><div class='add'>+# define O_BINARY 0</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("O_BINARY", O_BINARY),</div><div class='add'>+#ifndef O_TEXT</div><div class='add'>+# define O_TEXT 0</div><div class='add'>+#endif</div><div class='add'>+   MAKE_ICONSTANT("O_TEXT", O_TEXT),</div><div class='add'>+</div><div class='add'>+   SLANG_END_ICONST_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLfile_push_fd (SLFile_FD_Type *f)</div><div class='add'>+{</div><div class='add'>+   if (f == NULL)</div><div class='add'>+     return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+   f-&gt;num_refs += 1;</div><div class='add'>+</div><div class='add'>+   if (0 == SLclass_push_ptr_obj (SLANG_FILE_FD_TYPE, (VOID_STAR) f))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   f-&gt;num_refs -= 1;</div><div class='add'>+</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLfile_pop_fd (SLFile_FD_Type **f)</div><div class='add'>+{</div><div class='add'>+   return SLclass_pop_ptr_obj (SLANG_FILE_FD_TYPE, (VOID_STAR *) f);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void destroy_fd_type (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   SLfile_free_fd (*(SLFile_FD_Type **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int fd_push (unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   return SLfile_push_fd (*(SLFile_FD_Type **)v);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_init_posix_io (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("FD_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+   cl-&gt;cl_destroy = destroy_fd_type;</div><div class='add'>+   (void) SLclass_set_push_function (cl, fd_push);</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_FILE_FD_TYPE, sizeof (SLFile_FD_Type), SLANG_CLASS_TYPE_PTR))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLadd_intrin_fun_table(Fd_Name_Table, "__POSIXIO__"))</div><div class='add'>+       || (-1 == SLadd_iconstant_table (PosixIO_Consts, NULL))</div><div class='add'>+       || (-1 == _SLerrno_init ()))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slprepr.c b/mdk-stage1/slang/slprepr.c<br/>new file mode 100644<br/>index 000000000..358eeb874<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slprepr.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slprepr.c</a></div><div class='hunk'>@@ -0,0 +1,427 @@</div><div class='add'>+/* Copyright (c) 1996, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/*--------------------------------*-C-*---------------------------------*</div><div class='add'>+ * File:	slprepr.c</div><div class='add'>+ *</div><div class='add'>+ * preprocessing routines</div><div class='add'>+ */</div><div class='add'>+/*{{{ notes: */</div><div class='add'>+/*</div><div class='add'>+ * various preprocessing tokens supported</div><div class='add'>+ *</div><div class='add'>+ * #ifdef  TOKEN1 TOKEN2 ...</div><div class='add'>+ *	- True if any of TOKEN1 TOKEN2 ... are defined</div><div class='add'>+ *</div><div class='add'>+ * #ifndef TOKEN1 TOKEN2 ...</div><div class='add'>+ *	- True if none of TOKEN1 TOKEN2 ... are defined</div><div class='add'>+ *</div><div class='add'>+ * #iftrue</div><div class='add'>+ * #ifnfalse</div><div class='add'>+ *	- always True</div><div class='add'>+ *</div><div class='add'>+ * #iffalse</div><div class='add'>+ * #ifntrue</div><div class='add'>+ *	- always False</div><div class='add'>+ *</div><div class='add'>+ * #if$ENV</div><div class='add'>+ *	- True if the enviroment variable ENV is set</div><div class='add'>+ *</div><div class='add'>+ * #ifn$ENV</div><div class='add'>+ *	- True if the enviroment variable ENV is not set</div><div class='add'>+ *</div><div class='add'>+ * #if$ENV TOKEN1 TOKEN2 ...</div><div class='add'>+ *	- True if the contents of enviroment variable ENV match</div><div class='add'>+ *	  any of TOKEN1 TOKEN2 ...</div><div class='add'>+ *</div><div class='add'>+ * #ifn$ENV TOKEN1 TOKEN2 ...</div><div class='add'>+ *	- True if the contents of enviroment variable ENV do not match</div><div class='add'>+ *	  any of TOKEN1 TOKEN2 ...</div><div class='add'>+ *</div><div class='add'>+ *	NB: For $ENV, the tokens may contain wildcard characters:</div><div class='add'>+ *		'?' - match any single character</div><div class='add'>+ *		'*' - match any number of characters</div><div class='add'>+ *</div><div class='add'>+ * #elif...</div><div class='add'>+ * #else</div><div class='add'>+ * #endif</div><div class='add'>+ *</div><div class='add'>+ *</div><div class='add'>+ * mj olesen</div><div class='add'>+ *----------------------------------------------------------------------*/</div><div class='add'>+/*}}}*/</div><div class='add'>+/*{{{ includes: */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int (*SLprep_exists_hook) (char *, char);</div><div class='add'>+int (*_SLprep_eval_hook) (char *);</div><div class='add'>+</div><div class='add'>+/*{{{ SLprep_open_prep (), SLprep_close_prep () */</div><div class='add'>+int SLprep_open_prep (SLPreprocess_Type *pt)</div><div class='add'>+{</div><div class='add'>+   pt-&gt;this_level = 0;</div><div class='add'>+   pt-&gt;exec_level = 0;</div><div class='add'>+   pt-&gt;prev_exec_level = 0;</div><div class='add'>+   pt-&gt;comment_char = '%';</div><div class='add'>+   pt-&gt;preprocess_char = '#';</div><div class='add'>+   pt-&gt;flags = 0;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLprep_close_prep (SLPreprocess_Type *pt)</div><div class='add'>+{</div><div class='add'>+   (void) pt;</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ SLwildcard () */</div><div class='add'>+/*----------------------------------------------------------------------*</div><div class='add'>+ * Does `string' match `pattern' ?</div><div class='add'>+ *</div><div class='add'>+ * '*' in pattern matches any sub-string (including the null string)</div><div class='add'>+ * '?' matches any single char.</div><div class='add'>+ *</div><div class='add'>+ * Code taken from that donated by Paul Hudson &lt;paulh@harlequin.co.uk&gt;</div><div class='add'>+ * to the fvwm project.</div><div class='add'>+ * It is public domain, no strings attached. No guarantees either.</div><div class='add'>+ *----------------------------------------------------------------------*/</div><div class='add'>+static int SLwildcard (char *pattern, char *string)</div><div class='add'>+{</div><div class='add'>+   if (pattern == NULL || *pattern == '\0' || !strcmp (pattern, "*"))</div><div class='add'>+     return 1;</div><div class='add'>+   else if (string == NULL)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   while (*pattern &amp;&amp; *string) switch (*pattern)</div><div class='add'>+     {</div><div class='add'>+      case '?':</div><div class='add'>+	/* match any single character */</div><div class='add'>+	pattern++;</div><div class='add'>+	string++;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case '*':</div><div class='add'>+	/* see if rest of pattern matches any trailing */</div><div class='add'>+	/* substring of the string. */</div><div class='add'>+	if (*++pattern == '\0')</div><div class='add'>+	  return 1;	/* trailing * must match rest */</div><div class='add'>+</div><div class='add'>+	while (*string)</div><div class='add'>+	  {</div><div class='add'>+	     if (SLwildcard (pattern, string)) return 1;</div><div class='add'>+	     string++;</div><div class='add'>+	  }</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+	/* break; */</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	if (*pattern == '\\')</div><div class='add'>+	  {</div><div class='add'>+	     if (*++pattern == '\0')</div><div class='add'>+	       pattern--;	/* don't skip trailing backslash */</div><div class='add'>+	  }</div><div class='add'>+	if (*pattern++ != *string++) return 0;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return ((*string == '\0')</div><div class='add'>+	   &amp;&amp; ((*pattern == '\0') || !strcmp (pattern, "*")));</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+#if defined(__16_BIT_SYSTEM__)</div><div class='add'>+# define MAX_DEFINES 10</div><div class='add'>+#else</div><div class='add'>+# define MAX_DEFINES 128</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* The extra one is for NULL termination */</div><div class='add'>+char *_SLdefines [MAX_DEFINES + 1];</div><div class='add'>+</div><div class='add'>+int SLdefine_for_ifdef (char *s)	/*{{{*/</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; MAX_DEFINES; i++)</div><div class='add'>+     {</div><div class='add'>+	char *s1 = _SLdefines [i];</div><div class='add'>+</div><div class='add'>+	if (s1 == s)</div><div class='add'>+	  return 0;		       /* already defined (hashed string) */</div><div class='add'>+</div><div class='add'>+	if (s1 != NULL)</div><div class='add'>+	  continue;</div><div class='add'>+</div><div class='add'>+	s = SLang_create_slstring (s);</div><div class='add'>+	if (s == NULL)</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	_SLdefines[i] = s;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ static functions */</div><div class='add'>+static int is_any_defined(char *buf, char comment)	/*{{{*/</div><div class='add'>+{</div><div class='add'>+   char *sys;</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	register char ch;</div><div class='add'>+</div><div class='add'>+	/* Skip whitespace */</div><div class='add'>+	while (((ch = *buf) == ' ') || (ch == '\t'))</div><div class='add'>+	  buf++;</div><div class='add'>+</div><div class='add'>+	if ((ch == '\n') || (ch == 0) || (ch == comment))</div><div class='add'>+	  return 0;</div><div class='add'>+</div><div class='add'>+	i = 0;</div><div class='add'>+	while (NULL != (sys = _SLdefines [i++]))</div><div class='add'>+	  {</div><div class='add'>+	     unsigned int n;</div><div class='add'>+</div><div class='add'>+	     if (*sys != ch)</div><div class='add'>+	       continue;</div><div class='add'>+</div><div class='add'>+	     n = strlen (sys);</div><div class='add'>+	     if (0 == strncmp (buf, sys, n))</div><div class='add'>+	       {</div><div class='add'>+		  char ch1 = *(buf + n);</div><div class='add'>+</div><div class='add'>+		  if ((ch1 == '\n') || (ch1 == 0) ||</div><div class='add'>+		      (ch1 == ' ') || (ch1 == '\t') || (ch1 == comment))</div><div class='add'>+		    return 1;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* Skip past word */</div><div class='add'>+	while (((ch = *buf) != ' ')</div><div class='add'>+	       &amp;&amp; (ch != '\n')</div><div class='add'>+	       &amp;&amp; (ch != 0)</div><div class='add'>+	       &amp;&amp; (ch != '\t')</div><div class='add'>+	       &amp;&amp; (ch != comment))</div><div class='add'>+	  buf++;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static unsigned char *tokenize (unsigned char *buf, char *token, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   register char *token_end;</div><div class='add'>+</div><div class='add'>+   token_end = token + (len - 1);      /* allow room for \0 */</div><div class='add'>+</div><div class='add'>+   while ((token &lt; token_end) &amp;&amp; (*buf &gt; ' '))</div><div class='add'>+     *token++ = *buf++;</div><div class='add'>+</div><div class='add'>+   if (*buf &gt; ' ') return NULL;	/* token too long */</div><div class='add'>+</div><div class='add'>+   *token = '\0';</div><div class='add'>+</div><div class='add'>+   while ((*buf == ' ') || (*buf == '\t')) buf++;</div><div class='add'>+</div><div class='add'>+   return buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int is_env_defined (char *buf, char comment)	/*{{{*/</div><div class='add'>+{</div><div class='add'>+   char * env, token [32];</div><div class='add'>+</div><div class='add'>+   if ((*buf &lt;= ' ') || (*buf == comment)) return 0;	/* no token */</div><div class='add'>+</div><div class='add'>+   if (NULL == (buf = (char *) tokenize ((unsigned char *) buf,</div><div class='add'>+					 token, sizeof (token))))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   if (NULL == (env = getenv (token)))</div><div class='add'>+     return 0;		/* ENV not defined */</div><div class='add'>+</div><div class='add'>+   if ((*buf == '\0') || (*buf == '\n') || (*buf == comment))</div><div class='add'>+     return 1;			/* no tokens, but getenv() worked */</div><div class='add'>+</div><div class='add'>+   do</div><div class='add'>+     {</div><div class='add'>+	buf = (char *) tokenize ((unsigned char *) buf, token, sizeof (token));</div><div class='add'>+	if (buf == NULL) return 0;</div><div class='add'>+</div><div class='add'>+	if (SLwildcard (token, env))</div><div class='add'>+	  return 1;</div><div class='add'>+     }</div><div class='add'>+   while (*buf &amp;&amp; (*buf != '\n') &amp;&amp; (*buf != comment));</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int SLprep_line_ok (char *buf, SLPreprocess_Type *pt)	/*{{{*/</div><div class='add'>+{</div><div class='add'>+   int level, prev_exec_level, exec_level;</div><div class='add'>+</div><div class='add'>+   if ((buf == NULL) || (pt == NULL)) return 1;</div><div class='add'>+</div><div class='add'>+   if (*buf != pt-&gt;preprocess_char)</div><div class='add'>+     {</div><div class='add'>+	if (pt-&gt;this_level != pt-&gt;exec_level)</div><div class='add'>+	  return 0;</div><div class='add'>+</div><div class='add'>+	if (*buf == '\n') return pt-&gt;flags &amp; SLPREP_BLANK_LINES_OK;</div><div class='add'>+	if (*buf == pt-&gt;comment_char) return pt-&gt;flags &amp; SLPREP_COMMENT_LINES_OK;</div><div class='add'>+</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   level = pt-&gt;this_level;</div><div class='add'>+   exec_level = pt-&gt;exec_level;</div><div class='add'>+   prev_exec_level = pt-&gt;prev_exec_level;</div><div class='add'>+</div><div class='add'>+   buf++;</div><div class='add'>+</div><div class='add'>+   /* Allow '#!' to pass.  This could be a shell script with something</div><div class='add'>+    like '#! /local/bin/slang'  */</div><div class='add'>+   if ((*buf == '!') &amp;&amp; (pt-&gt;preprocess_char == '#'))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   /* Allow whitespace as in '#   ifdef'  */</div><div class='add'>+   while ((*buf == ' ') || (*buf == '\t')) buf++;</div><div class='add'>+   if (*buf &lt; 'a') return (level == exec_level);</div><div class='add'>+</div><div class='add'>+   if (!strncmp(buf, "endif", 5))</div><div class='add'>+     {</div><div class='add'>+	if (level == exec_level)</div><div class='add'>+	  {</div><div class='add'>+	     exec_level--;</div><div class='add'>+	     prev_exec_level = exec_level;</div><div class='add'>+	  }</div><div class='add'>+	level--;</div><div class='add'>+	if (level &lt; prev_exec_level) prev_exec_level = level;</div><div class='add'>+	goto done;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((buf[0] == 'e') &amp;&amp; (buf[1] == 'l'))   /* else, elifdef, ... */</div><div class='add'>+     {</div><div class='add'>+	if ((level == exec_level + 1)</div><div class='add'>+	    &amp;&amp; (prev_exec_level != level))</div><div class='add'>+	  {</div><div class='add'>+	     /* We are in position to execute */</div><div class='add'>+	     buf += 2;</div><div class='add'>+	     if ((buf[0] == 's') &amp;&amp; (buf[1] == 'e'))</div><div class='add'>+	       {</div><div class='add'>+		  /* "else" */</div><div class='add'>+		  exec_level = level;</div><div class='add'>+		  goto done;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     /* drop through to ifdef testing.  First set variable</div><div class='add'>+	      * to values appropriate for ifdef testing.</div><div class='add'>+	      */</div><div class='add'>+	     level--;		       /* now == to exec level */</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     if (level == exec_level)</div><div class='add'>+	       {</div><div class='add'>+		  exec_level--;</div><div class='add'>+	       }</div><div class='add'>+	     goto done;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((buf[0] == 'i') &amp;&amp; (buf[1] == 'f'))</div><div class='add'>+     {</div><div class='add'>+	int truth;</div><div class='add'>+</div><div class='add'>+	if (level != exec_level)</div><div class='add'>+	  {</div><div class='add'>+	     /* Not interested */</div><div class='add'>+	     level++;</div><div class='add'>+	     goto done;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	level++;</div><div class='add'>+</div><div class='add'>+	buf += 2;</div><div class='add'>+	if (buf[0] == 'n')</div><div class='add'>+	  {</div><div class='add'>+	     truth = 0;</div><div class='add'>+	     buf++;</div><div class='add'>+	  }</div><div class='add'>+	else truth = 1;</div><div class='add'>+</div><div class='add'>+	if (!strncmp (buf, "def", 3))</div><div class='add'>+	  truth = (truth == is_any_defined(buf + 3, pt-&gt;comment_char));</div><div class='add'>+</div><div class='add'>+	else if (!strncmp (buf, "false", 5))</div><div class='add'>+	  truth = !truth;</div><div class='add'>+</div><div class='add'>+	else if (*buf == '$')</div><div class='add'>+	  truth = (truth == is_env_defined (buf + 1, pt-&gt;comment_char));</div><div class='add'>+</div><div class='add'>+	else if (!strncmp (buf, "exists", 6)</div><div class='add'>+		 &amp;&amp; (SLprep_exists_hook != NULL))</div><div class='add'>+	  truth = (truth == (*SLprep_exists_hook)(buf + 6, pt-&gt;comment_char));</div><div class='add'>+</div><div class='add'>+	else if (!strncmp (buf, "eval", 4)</div><div class='add'>+		 &amp;&amp; (_SLprep_eval_hook != NULL))</div><div class='add'>+	  truth = (truth == (*_SLprep_eval_hook) (buf + 4));</div><div class='add'>+			   </div><div class='add'>+	else if (0 != strncmp (buf, "true", 4))</div><div class='add'>+	  return 1;		       /* let it bomb */</div><div class='add'>+</div><div class='add'>+	if (truth)</div><div class='add'>+	  {</div><div class='add'>+	     exec_level = level;</div><div class='add'>+	     prev_exec_level = exec_level;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   else return 1;  /* let it bomb. */</div><div class='add'>+</div><div class='add'>+   done:</div><div class='add'>+</div><div class='add'>+   if (exec_level &lt; 0) return 1;</div><div class='add'>+</div><div class='add'>+   pt-&gt;this_level = level;</div><div class='add'>+   pt-&gt;exec_level = exec_level;</div><div class='add'>+   pt-&gt;prev_exec_level = prev_exec_level;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*{{{ main() - for testing only */</div><div class='add'>+#if 0</div><div class='add'>+int main ()</div><div class='add'>+{</div><div class='add'>+   char buf[1024];</div><div class='add'>+   SLPreprocess_Type pt;</div><div class='add'>+</div><div class='add'>+   SLprep_open_prep (&amp;pt);</div><div class='add'>+</div><div class='add'>+   SLdefine_for_ifdef ("UNIX");</div><div class='add'>+</div><div class='add'>+   while (NULL != fgets (buf, sizeof (buf) - 1, stdin))</div><div class='add'>+     {</div><div class='add'>+	if (SLprep_line_ok (buf, &amp;pt))</div><div class='add'>+	  {</div><div class='add'>+	     fputs (buf, stdout);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLprep_close_prep (&amp;pt);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+/*}}}*/</div><div class='head'>diff --git a/mdk-stage1/slang/slproc.c b/mdk-stage1/slang/slproc.c<br/>new file mode 100644<br/>index 000000000..8b266f28f<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slproc.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slproc.c</a></div><div class='hunk'>@@ -0,0 +1,155 @@</div><div class='add'>+/* Process specific system calls */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_IO_H</div><div class='add'>+# include &lt;io.h&gt;		       /* for chmod */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_PROCESS_H</div><div class='add'>+# include &lt;process.h&gt;			/* for getpid */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include &lt;dos.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_KILL</div><div class='add'>+static int kill_cmd (int *pid, int *sig)</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   if (-1 == (ret = kill ((pid_t) *pid, *sig)))</div><div class='add'>+     _SLerrno_errno = errno;</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int getpid_cmd (void)</div><div class='add'>+{</div><div class='add'>+   return getpid ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_GETPPID</div><div class='add'>+static int getppid_cmd (void)</div><div class='add'>+{</div><div class='add'>+   return getppid ();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_GETGID</div><div class='add'>+static int getgid_cmd (void)</div><div class='add'>+{</div><div class='add'>+   return getgid ();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_GETEGID</div><div class='add'>+static int getegid_cmd (void)</div><div class='add'>+{</div><div class='add'>+   return getegid ();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_GETEUID</div><div class='add'>+static int geteuid_cmd (void)</div><div class='add'>+{</div><div class='add'>+   return geteuid ();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_GETUID</div><div class='add'>+static int getuid_cmd (void)</div><div class='add'>+{</div><div class='add'>+   return getuid ();</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SETGID</div><div class='add'>+static int setgid_cmd (int *gid)</div><div class='add'>+{</div><div class='add'>+   if (0 == setgid (*gid))</div><div class='add'>+     return 0;</div><div class='add'>+   _SLerrno_errno = errno;</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SETPGID</div><div class='add'>+static int setpgid_cmd (int *pid, int *pgid)</div><div class='add'>+{</div><div class='add'>+   if (0 == setpgid (*pid, *pgid))</div><div class='add'>+     return 0;</div><div class='add'>+   _SLerrno_errno = errno;</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SETUID</div><div class='add'>+static int setuid_cmd (int *uid)</div><div class='add'>+{</div><div class='add'>+   if (0 == setuid (*uid))</div><div class='add'>+     return 0;</div><div class='add'>+   _SLerrno_errno = errno;</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Process_Name_Table[] =</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_0("getpid", getpid_cmd, SLANG_INT_TYPE),</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_GETPPID</div><div class='add'>+   MAKE_INTRINSIC_0("getppid", getppid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_GETGID</div><div class='add'>+   MAKE_INTRINSIC_0("getgid", getgid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_GETEGID</div><div class='add'>+   MAKE_INTRINSIC_0("getegid", getegid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_GETEUID</div><div class='add'>+   MAKE_INTRINSIC_0("geteuid", geteuid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_GETUID</div><div class='add'>+   MAKE_INTRINSIC_0("getuid", getuid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SETGID</div><div class='add'>+   MAKE_INTRINSIC_I("setgid", setgid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SETPGID</div><div class='add'>+   MAKE_INTRINSIC_II("setpgid", setpgid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SETUID</div><div class='add'>+   MAKE_INTRINSIC_I("setuid", setuid_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_KILL</div><div class='add'>+   MAKE_INTRINSIC_II("kill", kill_cmd, SLANG_INT_TYPE),</div><div class='add'>+#endif</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLang_init_posix_process (void)</div><div class='add'>+{</div><div class='add'>+   if ((-1 == SLadd_intrin_fun_table (Process_Name_Table, "__POSIX_PROCESS__"))</div><div class='add'>+       || (-1 == _SLerrno_init ()))</div><div class='add'>+     return -1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slregexp.c b/mdk-stage1/slang/slregexp.c<br/>new file mode 100644<br/>index 000000000..6592a5a63<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slregexp.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slregexp.c</a></div><div class='hunk'>@@ -0,0 +1,935 @@</div><div class='add'>+/* ed style regular expressions */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#define SET_BIT(b, n) b[(unsigned int) (n) &gt;&gt; 3] |= 1 &lt;&lt; ((unsigned int) (n) % 8)</div><div class='add'>+#define TEST_BIT(b, n) (b[(unsigned int)(n) &gt;&gt; 3] &amp; (1 &lt;&lt; ((unsigned int) (n) % 8)))</div><div class='add'>+#define LITERAL 1</div><div class='add'>+#define RANGE 2			       /* [...] */</div><div class='add'>+#define ANY 3			       /* . */</div><div class='add'>+#define BOL 4			       /* ^ */</div><div class='add'>+#define EOL 5			       /* $ */</div><div class='add'>+#define NTH_MATCH 6		       /* \1 \2 ... \9 */</div><div class='add'>+#define OPAREN 7		       /* \( */</div><div class='add'>+#define CPAREN 0x8		       /* \) */</div><div class='add'>+#define ANY_DIGIT 0x9		       /* \d */</div><div class='add'>+#define BOW	0xA		       /* \&lt; */</div><div class='add'>+#define EOW	0xB		       /* \&gt; */</div><div class='add'>+#if 0</div><div class='add'>+#define NOT_LITERAL		0xC	       /* \~ */</div><div class='add'>+#endif</div><div class='add'>+#define STAR 0x80		       /* * */</div><div class='add'>+#define LEAST_ONCE 0x40		       /* + */</div><div class='add'>+#define MAYBE_ONCE 0x20		       /* ? */</div><div class='add'>+#define MANY 0x10		       /* {n,m} */</div><div class='add'>+/* The rest are additions */</div><div class='add'>+#define YES_CASE (STAR | BOL)</div><div class='add'>+#define NO_CASE  (STAR | EOL)</div><div class='add'>+</div><div class='add'>+#define UPPERCASE(x)  (cs ? (x) : UPPER_CASE(x))</div><div class='add'>+#define LOWERCASE(x)  (cs ? (x) : LOWER_CASE(x))</div><div class='add'>+</div><div class='add'>+static unsigned char Word_Chars[256];</div><div class='add'>+#define IS_WORD_CHAR(x) Word_Chars[(unsigned int) (x)]</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+static int ctx-&gt;open_paren_number;</div><div class='add'>+static char Closed_Paren_Matches[10];</div><div class='add'>+</div><div class='add'>+static SLRegexp_Type *This_Reg;</div><div class='add'>+static unsigned char *This_Str;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   SLRegexp_Type *reg;</div><div class='add'>+   unsigned char *str;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   char closed_paren_matches[10];</div><div class='add'>+   int open_paren_number;</div><div class='add'>+}</div><div class='add'>+Re_Context_Type;</div><div class='add'>+</div><div class='add'>+static unsigned char *do_nth_match (Re_Context_Type *ctx, int n, unsigned char *str, unsigned char *estr)</div><div class='add'>+{</div><div class='add'>+   unsigned char *bpos;</div><div class='add'>+</div><div class='add'>+   if (ctx-&gt;closed_paren_matches[n] == 0)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   bpos = ctx-&gt;reg-&gt;beg_matches[n] + ctx-&gt;str;</div><div class='add'>+   n = ctx-&gt;reg-&gt;end_matches[n];</div><div class='add'>+   if (n == 0) return(str);</div><div class='add'>+   if (n &gt; (int) (estr - str)) return (NULL);</div><div class='add'>+</div><div class='add'>+   /* This needs fixed for case sensitive match */</div><div class='add'>+   if (0 != strncmp((char *) str, (char *) bpos, (unsigned int) n)) return (NULL);</div><div class='add'>+   str += n;</div><div class='add'>+   return (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* returns pointer to the end of regexp or NULL */</div><div class='add'>+static unsigned char *regexp_looking_at (Re_Context_Type *ctx, register unsigned char *str, unsigned char *estr, unsigned char *buf, register int cs)</div><div class='add'>+{</div><div class='add'>+   register unsigned char p, p1;</div><div class='add'>+   unsigned char *save_str, *tmpstr;</div><div class='add'>+   int n, n0, n1;</div><div class='add'>+   int save_num_open;</div><div class='add'>+   char save_closed_matches[10];</div><div class='add'>+</div><div class='add'>+   p = *buf++;</div><div class='add'>+</div><div class='add'>+   while (p != 0)</div><div class='add'>+     {</div><div class='add'>+	/* p1 = UPPERCASE(*buf); */</div><div class='add'>+	/* if (str &lt; estr) c = UPPERCASE(*str); */</div><div class='add'>+</div><div class='add'>+	switch((unsigned char) p)</div><div class='add'>+	  {</div><div class='add'>+	   case BOW:</div><div class='add'>+	     if ((str != ctx-&gt;str)</div><div class='add'>+		 &amp;&amp; ((str &gt;= estr)</div><div class='add'>+		     || IS_WORD_CHAR(*(str - 1))</div><div class='add'>+		     || (0 == IS_WORD_CHAR(*str)))) return NULL;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case EOW:</div><div class='add'>+	     if ((str &lt; estr)</div><div class='add'>+		 &amp;&amp; IS_WORD_CHAR (*str)) return NULL;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case YES_CASE: cs = 1; break;</div><div class='add'>+	   case NO_CASE: cs = 0; break;</div><div class='add'>+</div><div class='add'>+	   case OPAREN:</div><div class='add'>+	     ctx-&gt;open_paren_number++;</div><div class='add'>+	     ctx-&gt;reg-&gt;beg_matches[ctx-&gt;open_paren_number] = (int) (str - ctx-&gt;str);</div><div class='add'>+	     break;</div><div class='add'>+	   case CPAREN:</div><div class='add'>+	     n = ctx-&gt;open_paren_number;</div><div class='add'>+	     while (n &gt; 0)</div><div class='add'>+	       {</div><div class='add'>+		  if (ctx-&gt;closed_paren_matches[n] != 0)</div><div class='add'>+		    {</div><div class='add'>+		       n--;</div><div class='add'>+		       continue;</div><div class='add'>+		    }</div><div class='add'>+		  ctx-&gt;closed_paren_matches[n] = 1;</div><div class='add'>+		  ctx-&gt;reg-&gt;end_matches[n] = (unsigned int) (str - (ctx-&gt;str + ctx-&gt;reg-&gt;beg_matches[n]));</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+#ifdef NOT_LITERAL</div><div class='add'>+	   case NOT_LITERAL:</div><div class='add'>+	     if ((str &gt;= estr) || (*buf == UPPERCASE(*str))) return (NULL);</div><div class='add'>+	     str++; buf++;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case MAYBE_ONCE | NOT_LITERAL:</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     if ((str &lt; estr) &amp;&amp; (*buf != UPPERCASE(*str))) str++;</div><div class='add'>+	     buf++;</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	   case NOT_LITERAL | LEAST_ONCE:   /* match at least once */</div><div class='add'>+	     if ((str &gt;= estr) || (UPPERCASE(*str) == UPPERCASE(*buf))) return (NULL);</div><div class='add'>+	     str++;</div><div class='add'>+	     /* drop */</div><div class='add'>+	   case STAR | NOT_LITERAL:</div><div class='add'>+	     save_str = str;  p1 = *buf;</div><div class='add'>+	     while ((str &lt; estr) &amp;&amp; (UPPERCASE(*str) != p1)) str++;</div><div class='add'>+	     buf++;</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	     /* this type consists of the expression + two bytes that</div><div class='add'>+	        determine number of matches to perform */</div><div class='add'>+	   case MANY | NOT_LITERAL:</div><div class='add'>+	     p1 = *buf; buf++;</div><div class='add'>+	     n = n0 = (int) (unsigned char) *buf++;</div><div class='add'>+	     /* minimum number to match--- could be 0 */</div><div class='add'>+	     n1 = (int) (unsigned char) *buf++;</div><div class='add'>+	     /* maximum number to match */</div><div class='add'>+</div><div class='add'>+	     while (n &amp;&amp; (str &lt; estr) &amp;&amp; (p1 != *str))</div><div class='add'>+	       {</div><div class='add'>+		  n--;</div><div class='add'>+		  str++;</div><div class='add'>+	       }</div><div class='add'>+	     if (n) return (NULL);</div><div class='add'>+</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     n = n1 - n0;</div><div class='add'>+	     while (n &amp;&amp; (str &lt; estr) &amp;&amp; (p1 != *str))</div><div class='add'>+	       {</div><div class='add'>+		  n--;</div><div class='add'>+		  str++;</div><div class='add'>+	       }</div><div class='add'>+	     goto match_rest;</div><div class='add'>+#endif				       /* NOT_LITERAL */</div><div class='add'>+	   case LITERAL:</div><div class='add'>+	     if ((str &gt;= estr) || (*buf != UPPERCASE(*str))) return (NULL);</div><div class='add'>+	     str++; buf++;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case MAYBE_ONCE | LITERAL:</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     if ((str &lt; estr) &amp;&amp; (*buf == UPPERCASE(*str))) str++;</div><div class='add'>+	     buf++;</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	   case LITERAL | LEAST_ONCE:   /* match at least once */</div><div class='add'>+	     if ((str &gt;= estr) || (UPPERCASE(*str) != UPPERCASE(*buf))) return (NULL);</div><div class='add'>+	     str++;</div><div class='add'>+	     /* drop */</div><div class='add'>+	   case STAR | LITERAL:</div><div class='add'>+	     save_str = str;  p1 = *buf;</div><div class='add'>+	     while ((str &lt; estr) &amp;&amp; (UPPERCASE(*str) == p1)) str++;</div><div class='add'>+	     buf++;</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	     /* this type consists of the expression + two bytes that</div><div class='add'>+	        determine number of matches to perform */</div><div class='add'>+	   case MANY | LITERAL:</div><div class='add'>+	     p1 = *buf; buf++;</div><div class='add'>+	     n = n0 = (int) (unsigned char) *buf++;</div><div class='add'>+	     /* minimum number to match--- could be 0 */</div><div class='add'>+	     n1 = (int) (unsigned char) *buf++;</div><div class='add'>+	     /* maximum number to match */</div><div class='add'>+</div><div class='add'>+	     while (n &amp;&amp; (str &lt; estr) &amp;&amp; (p1 == *str))</div><div class='add'>+	       {</div><div class='add'>+		  n--;</div><div class='add'>+		  str++;</div><div class='add'>+	       }</div><div class='add'>+	     if (n) return (NULL);</div><div class='add'>+</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     n = n1 - n0;</div><div class='add'>+	     while (n &amp;&amp; (str &lt; estr) &amp;&amp; (p1 == *str))</div><div class='add'>+	       {</div><div class='add'>+		  n--;</div><div class='add'>+		  str++;</div><div class='add'>+	       }</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	   case NTH_MATCH:</div><div class='add'>+	     if ((str = do_nth_match(ctx, (int) (unsigned char) *buf, str, estr)) == NULL) return(NULL);</div><div class='add'>+	     buf++;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case MAYBE_ONCE | NTH_MATCH:</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     tmpstr = do_nth_match (ctx, (int) (unsigned char) *buf, str, estr);</div><div class='add'>+	     buf++;</div><div class='add'>+	     if (tmpstr != NULL)</div><div class='add'>+	       {</div><div class='add'>+		  str = tmpstr;</div><div class='add'>+		  goto match_rest;</div><div class='add'>+	       }</div><div class='add'>+	     continue;</div><div class='add'>+</div><div class='add'>+	   case LEAST_ONCE | NTH_MATCH:</div><div class='add'>+	     if ((str = do_nth_match(ctx, (int) (unsigned char) *buf, str, estr)) == NULL) return(NULL);</div><div class='add'>+	     /* drop */</div><div class='add'>+	   case STAR | NTH_MATCH:</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     while (NULL != (tmpstr = do_nth_match(ctx, (int) (unsigned char) *buf, str, estr)))</div><div class='add'>+	       {</div><div class='add'>+		  str = tmpstr;</div><div class='add'>+	       }</div><div class='add'>+	     buf++;</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	   case MANY | NTH_MATCH: return(NULL);</div><div class='add'>+	     /* needs done */</div><div class='add'>+</div><div class='add'>+	   case RANGE:</div><div class='add'>+	     if (str &gt;= estr) return (NULL);</div><div class='add'>+	     if (TEST_BIT(buf, UPPERCASE(*str)) == 0) return (NULL);</div><div class='add'>+	     buf += 32; str++;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case MAYBE_ONCE | RANGE:</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     if ((str &lt; estr) &amp;&amp; TEST_BIT(buf, UPPERCASE(*str))) str++;</div><div class='add'>+	     buf += 32;</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	   case LEAST_ONCE | RANGE:</div><div class='add'>+	     if ((str &gt;= estr) || (0 == TEST_BIT(buf, UPPERCASE(*str)))) return NULL;</div><div class='add'>+	     str++;</div><div class='add'>+	     /* drop */</div><div class='add'>+	   case STAR | RANGE:</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     while ((str &lt; estr) &amp;&amp; TEST_BIT(buf, UPPERCASE(*str))) str++;</div><div class='add'>+	     buf += 32;</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	     /* The first 32 bytes correspond to the range and the two</div><div class='add'>+	      * following bytes indicate the min and max number of matches.</div><div class='add'>+	      */</div><div class='add'>+	   case MANY | RANGE:</div><div class='add'>+	     /* minimum number to match--- could be 0 */</div><div class='add'>+	     n = n0 = (int) (unsigned char) *(buf + 32);</div><div class='add'>+	     /* maximum number to match */</div><div class='add'>+	     n1 = (int) (unsigned char) *(buf + 33);</div><div class='add'>+</div><div class='add'>+	     while (n &amp;&amp; (str &lt; estr) &amp;&amp; (TEST_BIT(buf, UPPERCASE(*str))))</div><div class='add'>+	       {</div><div class='add'>+		  n--;</div><div class='add'>+		  str++;</div><div class='add'>+	       }</div><div class='add'>+	     if (n) return (NULL);</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     n = n1 - n0;</div><div class='add'>+	     while (n &amp;&amp; (str &lt; estr) &amp;&amp; (TEST_BIT(buf, UPPERCASE(*str))))</div><div class='add'>+	       {</div><div class='add'>+		  n--;</div><div class='add'>+		  str++;</div><div class='add'>+	       }</div><div class='add'>+	     buf += 34;		       /* 32 + 2 */</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	   case ANY_DIGIT:</div><div class='add'>+	     if ((str &gt;= estr) || (*str &gt; '9') || (*str &lt; '0')) return (NULL);</div><div class='add'>+	     str++;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case MAYBE_ONCE | ANY_DIGIT:</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     if ((str &lt; estr) &amp;&amp; ((*str &gt; '9') || (*str &lt; '0'))) str++;</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	   case LEAST_ONCE | ANY_DIGIT:</div><div class='add'>+	     if ((str &gt;= estr) || ((*str &gt; '9') || (*str &lt; '0'))) return NULL;</div><div class='add'>+	     str++;</div><div class='add'>+	     /* drop */</div><div class='add'>+	   case STAR | ANY_DIGIT:</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     while ((str &lt; estr) &amp;&amp; ((*str &lt;= '9') &amp;&amp; (*str &gt;= '0'))) str++;</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	   case MANY | ANY_DIGIT:</div><div class='add'>+	     /* needs finished */</div><div class='add'>+	     return (NULL);</div><div class='add'>+</div><div class='add'>+	   case ANY:</div><div class='add'>+	     if ((str &gt;= estr) || (*str == '\n')) return (NULL);</div><div class='add'>+	     str++;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case MAYBE_ONCE | ANY:</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     if ((str &lt; estr) &amp;&amp; (*str != '\n')) str++;</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	   case LEAST_ONCE | ANY:</div><div class='add'>+	     if ((str &gt;= estr) || (*str == '\n')) return (NULL);</div><div class='add'>+	     str++;</div><div class='add'>+	     /* drop */</div><div class='add'>+	   case STAR | ANY:</div><div class='add'>+	     save_str = str;</div><div class='add'>+	     while ((str &lt; estr) &amp;&amp; (*str != '\n')) str++;</div><div class='add'>+	     goto match_rest;</div><div class='add'>+</div><div class='add'>+	   case MANY | ANY:</div><div class='add'>+	     return (NULL);</div><div class='add'>+	     /* needs finished */</div><div class='add'>+</div><div class='add'>+	   case EOL:</div><div class='add'>+	     if ((str &gt;= estr) || (*str == '\n')) return (str);</div><div class='add'>+	     return(NULL);</div><div class='add'>+</div><div class='add'>+	   default: return (NULL);</div><div class='add'>+	  }</div><div class='add'>+	p = *buf++;</div><div class='add'>+	continue;</div><div class='add'>+</div><div class='add'>+	match_rest:</div><div class='add'>+	if (save_str == str)</div><div class='add'>+	  {</div><div class='add'>+	     p = *buf++;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* if (p == EOL)</div><div class='add'>+	 * {</div><div class='add'>+	 * if (str &lt; estr) return (NULL); else return (str);</div><div class='add'>+	 * }</div><div class='add'>+	 */</div><div class='add'>+</div><div class='add'>+	SLMEMCPY(save_closed_matches, ctx-&gt;closed_paren_matches, sizeof(save_closed_matches));</div><div class='add'>+	save_num_open = ctx-&gt;open_paren_number;</div><div class='add'>+	while (str &gt;= save_str)</div><div class='add'>+	  {</div><div class='add'>+	     tmpstr = regexp_looking_at (ctx, str, estr, buf, cs);</div><div class='add'>+	     if (tmpstr != NULL) return(tmpstr);</div><div class='add'>+	     SLMEMCPY(ctx-&gt;closed_paren_matches, save_closed_matches, sizeof(ctx-&gt;closed_paren_matches));</div><div class='add'>+	     ctx-&gt;open_paren_number = save_num_open;</div><div class='add'>+	     str--;</div><div class='add'>+	  }</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   if ((p != 0) &amp;&amp; (p != EOL)) return (NULL); else return (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+fixup_beg_end_matches (Re_Context_Type *ctx, SLRegexp_Type *r, unsigned char *str, unsigned char *epos)</div><div class='add'>+{</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   if (str == NULL)</div><div class='add'>+     {</div><div class='add'>+	r-&gt;beg_matches[0] = -1;</div><div class='add'>+	r-&gt;end_matches[0] = 0;</div><div class='add'>+	SLMEMSET(ctx-&gt;closed_paren_matches, 0, sizeof(ctx-&gt;closed_paren_matches));</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	r-&gt;beg_matches[0] = (int) (str - ctx-&gt;str);</div><div class='add'>+	r-&gt;end_matches[0] = (unsigned int) (epos - str);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   for (i = 1; i &lt; 10; i++)</div><div class='add'>+     {</div><div class='add'>+	if (ctx-&gt;closed_paren_matches [i] == 0)</div><div class='add'>+	  {</div><div class='add'>+	     r-&gt;beg_matches[i] = -1;</div><div class='add'>+	     r-&gt;end_matches[i] = 0;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void init_re_context (Re_Context_Type *ctx, SLRegexp_Type *reg, </div><div class='add'>+			     unsigned char *str, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   memset ((char *) ctx, 0, sizeof (Re_Context_Type));</div><div class='add'>+   ctx-&gt;reg = reg;</div><div class='add'>+   ctx-&gt;str = str;</div><div class='add'>+   ctx-&gt;len = len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned char *SLang_regexp_match(unsigned char *str,</div><div class='add'>+				  unsigned int len, SLRegexp_Type *reg)</div><div class='add'>+{</div><div class='add'>+   register unsigned char c = 0, *estr = str + len;</div><div class='add'>+   int cs = reg-&gt;case_sensitive, lit = 0;</div><div class='add'>+   unsigned char *buf = reg-&gt;buf, *epos = NULL;</div><div class='add'>+   Re_Context_Type ctx_buf;</div><div class='add'>+</div><div class='add'>+   if (reg-&gt;min_length &gt; len) return NULL;</div><div class='add'>+</div><div class='add'>+   init_re_context (&amp;ctx_buf, reg, str, len);</div><div class='add'>+</div><div class='add'>+   if (*buf == BOL)</div><div class='add'>+     {</div><div class='add'>+	if (NULL == (epos = regexp_looking_at (&amp;ctx_buf, str, estr, buf + 1, cs)))</div><div class='add'>+	  str = NULL;</div><div class='add'>+</div><div class='add'>+	fixup_beg_end_matches (&amp;ctx_buf, reg, str, epos);</div><div class='add'>+	return str;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (*buf == NO_CASE)</div><div class='add'>+     {</div><div class='add'>+	buf++;  cs = 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (*buf == YES_CASE)</div><div class='add'>+     {</div><div class='add'>+	buf++;  cs = 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (*buf == LITERAL)</div><div class='add'>+     {</div><div class='add'>+	lit = 1;</div><div class='add'>+	c = *(buf + 1);</div><div class='add'>+     }</div><div class='add'>+   else if ((*buf == OPAREN) &amp;&amp; (*(buf + 1) == LITERAL))</div><div class='add'>+     {</div><div class='add'>+	lit = 1;</div><div class='add'>+	c = *(buf + 2);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (str &lt; estr)</div><div class='add'>+     {</div><div class='add'>+	ctx_buf.open_paren_number = 0;</div><div class='add'>+	memset (ctx_buf.closed_paren_matches, 0, sizeof(ctx_buf.closed_paren_matches));</div><div class='add'>+	/* take care of leading chars */</div><div class='add'>+	if (lit)</div><div class='add'>+	  {</div><div class='add'>+	     while ((str &lt; estr) &amp;&amp; (c != UPPERCASE(*str))) str++;</div><div class='add'>+	     if (str &gt;= estr)</div><div class='add'>+	       break;		       /* failed */</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (NULL != (epos = regexp_looking_at(&amp;ctx_buf, str, estr, buf, cs)))</div><div class='add'>+	  {</div><div class='add'>+	     fixup_beg_end_matches (&amp;ctx_buf, reg, str, epos);</div><div class='add'>+	     return str;</div><div class='add'>+	  }</div><div class='add'>+	str++;</div><div class='add'>+     }</div><div class='add'>+   fixup_beg_end_matches (&amp;ctx_buf, reg, NULL, epos);</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char *convert_digit(unsigned char *pat, int *nn)</div><div class='add'>+{</div><div class='add'>+   int n = 0, m = 0;</div><div class='add'>+   unsigned char c;</div><div class='add'>+   while (c = (unsigned char) *pat, (c &lt;= '9') &amp;&amp; (c &gt;= '0'))</div><div class='add'>+     {</div><div class='add'>+	pat++;</div><div class='add'>+	n = 10 * n + (c - '0');</div><div class='add'>+	m++;</div><div class='add'>+     }</div><div class='add'>+   if (m == 0)</div><div class='add'>+     {</div><div class='add'>+	return (NULL);</div><div class='add'>+     }</div><div class='add'>+   *nn = n;</div><div class='add'>+   return pat;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define ERROR  return (int) (pat - reg-&gt;pat)</div><div class='add'>+</div><div class='add'>+/* Returns 0 if successful or offset in pattern of error */</div><div class='add'>+int SLang_regexp_compile (SLRegexp_Type *reg)</div><div class='add'>+{</div><div class='add'>+   register unsigned char *buf, *ebuf, *pat;</div><div class='add'>+   unsigned char *last = NULL, *tmppat;</div><div class='add'>+   register unsigned char c;</div><div class='add'>+   int i, reverse = 0, n, cs;</div><div class='add'>+   int oparen = 0, nparen = 0;</div><div class='add'>+   /* substring stuff */</div><div class='add'>+   int count, last_count, this_max_mm = 0, max_mm = 0, ordinary_search,</div><div class='add'>+     no_osearch = 0, min_length = 0;</div><div class='add'>+   unsigned char *mm_p = NULL, *this_mm_p = NULL;</div><div class='add'>+   static int already_initialized;</div><div class='add'>+</div><div class='add'>+   reg-&gt;beg_matches[0] = reg-&gt;end_matches[0] = 0;</div><div class='add'>+   buf = reg-&gt;buf;</div><div class='add'>+   ebuf = (reg-&gt;buf + reg-&gt;buf_len) - 2; /* make some room */</div><div class='add'>+   pat = reg-&gt;pat;</div><div class='add'>+   cs = reg-&gt;case_sensitive;</div><div class='add'>+</div><div class='add'>+   if (already_initialized == 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_init_case_tables ();</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+	SLmake_lut (Word_Chars, (unsigned char *) "_0-9a-zA-Z\200-\232\240-\245\341-\353", 0);</div><div class='add'>+#else</div><div class='add'>+	SLmake_lut (Word_Chars, (unsigned char *) "_0-9a-zA-Z\277-\326\330-\336\340-\366\370-\376", 0);</div><div class='add'>+#endif</div><div class='add'>+	already_initialized = 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   i = 1; while (i &lt; 10)</div><div class='add'>+     {</div><div class='add'>+	reg-&gt;beg_matches[i] = -1;</div><div class='add'>+	reg-&gt;end_matches[i] = 0;</div><div class='add'>+	i++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (*pat == '\\')</div><div class='add'>+     {</div><div class='add'>+	if (pat[1] == 'c')</div><div class='add'>+	  {</div><div class='add'>+	     cs = 1;</div><div class='add'>+	     pat += 2;</div><div class='add'>+	     no_osearch = 1;</div><div class='add'>+	  }</div><div class='add'>+	else if (pat[1] == 'C')</div><div class='add'>+	  {</div><div class='add'>+	     cs = 0;</div><div class='add'>+	     pat += 2;</div><div class='add'>+	     no_osearch = 1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (*pat == '^')</div><div class='add'>+     {</div><div class='add'>+	pat++;</div><div class='add'>+	*buf++ = BOL;</div><div class='add'>+	reg-&gt;must_match_bol = 1;</div><div class='add'>+     }</div><div class='add'>+   else reg-&gt;must_match_bol = 0;</div><div class='add'>+</div><div class='add'>+   if (cs != reg-&gt;case_sensitive)</div><div class='add'>+     {</div><div class='add'>+	if (cs) *buf++ = YES_CASE; </div><div class='add'>+	else *buf++ = NO_CASE; </div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *buf = 0;</div><div class='add'>+</div><div class='add'>+   last_count = count = 0;</div><div class='add'>+   while ((c = *pat++) != 0)</div><div class='add'>+     {</div><div class='add'>+	if (buf &gt;= ebuf - 3)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_doerror ("Pattern too large to be compiled.");</div><div class='add'>+	     ERROR;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	count++;</div><div class='add'>+	switch (c)</div><div class='add'>+	  {</div><div class='add'>+	   case '$':</div><div class='add'>+	     if (*pat != 0) goto literal_char;</div><div class='add'>+	     *buf++ = EOL;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '\\':</div><div class='add'>+	     c = *pat++;</div><div class='add'>+	     no_osearch = 1;</div><div class='add'>+	     switch(c)</div><div class='add'>+	       {</div><div class='add'>+		case 'e': c = 033; goto literal_char;</div><div class='add'>+		case 'n': c = '\n'; goto literal_char;</div><div class='add'>+		case 't': c = '\t'; goto literal_char;</div><div class='add'>+		case 'C': cs = 0; *buf++ = NO_CASE; break;</div><div class='add'>+		case 'c': cs = 1; *buf++ = YES_CASE; break;</div><div class='add'>+		case '1': case '2': case '3':  case '4':  case '5':</div><div class='add'>+		case '6': case '7': case '8':  case '9':</div><div class='add'>+		  c = c - '0';</div><div class='add'>+		  if ((int) c &gt; nparen) ERROR;</div><div class='add'>+		  last = buf;</div><div class='add'>+		  *buf++ = NTH_MATCH; *buf++ = c;</div><div class='add'>+		  break;</div><div class='add'>+#ifdef NOT_LITERAL</div><div class='add'>+		case '~':	       /* slang extension */</div><div class='add'>+		  if ((c = *pat) == 0) ERROR;</div><div class='add'>+		  pat++;</div><div class='add'>+		  last = buf;</div><div class='add'>+		  *buf++ = NOT_LITERAL;</div><div class='add'>+		  *buf++ = c;</div><div class='add'>+		  min_length++;</div><div class='add'>+		  break;</div><div class='add'>+#endif</div><div class='add'>+		case 'd':	       /* slang extension */</div><div class='add'>+		  last = buf;</div><div class='add'>+		  *buf++ = ANY_DIGIT;</div><div class='add'>+		  min_length++;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case '&lt;':</div><div class='add'>+		  last = NULL;</div><div class='add'>+		  *buf++ = BOW;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case '&gt;':</div><div class='add'>+		  last = NULL;</div><div class='add'>+		  *buf++ = EOW;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case '{':</div><div class='add'>+		  if (last == NULL) goto literal_char;</div><div class='add'>+		  *last |= MANY;</div><div class='add'>+		  tmppat = convert_digit(pat, &amp;n);</div><div class='add'>+		  if (tmppat == NULL) ERROR;</div><div class='add'>+		  pat = tmppat;</div><div class='add'>+		  *buf++ = n;</div><div class='add'>+</div><div class='add'>+		  min_length += (n - 1);</div><div class='add'>+</div><div class='add'>+		  if (*pat == '\\')</div><div class='add'>+		    {</div><div class='add'>+		       *buf++ = n;</div><div class='add'>+		    }</div><div class='add'>+		  else if (*pat == ',')</div><div class='add'>+		    {</div><div class='add'>+		       pat++;</div><div class='add'>+		       if (*pat == '\\')</div><div class='add'>+			 {</div><div class='add'>+			    n = 255;</div><div class='add'>+			 }</div><div class='add'>+		       else</div><div class='add'>+			 {</div><div class='add'>+			    tmppat = convert_digit(pat, &amp;n);</div><div class='add'>+			    if (tmppat == NULL) ERROR;</div><div class='add'>+			    pat = tmppat;</div><div class='add'>+			    if (*pat != '\\') ERROR;</div><div class='add'>+			 }</div><div class='add'>+		       *buf++ = n;</div><div class='add'>+		    }</div><div class='add'>+		  else ERROR;</div><div class='add'>+		  last = NULL;</div><div class='add'>+		  pat++;</div><div class='add'>+		  if (*pat != '}') ERROR;</div><div class='add'>+		  pat++;</div><div class='add'>+		  break;   /* case '{' */</div><div class='add'>+</div><div class='add'>+		case '(':</div><div class='add'>+		  oparen++;</div><div class='add'>+		  if (oparen &gt; 9) ERROR;</div><div class='add'>+		  *buf++ = OPAREN;</div><div class='add'>+		  break;</div><div class='add'>+		case ')':</div><div class='add'>+		  if (oparen == 0) ERROR;</div><div class='add'>+		  oparen--;</div><div class='add'>+		  nparen++;</div><div class='add'>+		  *buf++ = CPAREN;</div><div class='add'>+		  break;</div><div class='add'>+</div><div class='add'>+		case 0: ERROR;</div><div class='add'>+		default:</div><div class='add'>+		  goto literal_char;</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '[':</div><div class='add'>+</div><div class='add'>+	     *buf = RANGE;</div><div class='add'>+	     last = buf++;</div><div class='add'>+</div><div class='add'>+	     if (buf + 32 &gt;= ebuf) ERROR;</div><div class='add'>+</div><div class='add'>+	     for (i = 0; i &lt; 32; i++) buf[i] = 0;</div><div class='add'>+	     c = *pat++;</div><div class='add'>+	     if (c == '^')</div><div class='add'>+	       {</div><div class='add'>+		  reverse = 1;</div><div class='add'>+		  SET_BIT(buf, '\n');</div><div class='add'>+		  c = *pat++;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     if (c == ']')</div><div class='add'>+	       {</div><div class='add'>+		  SET_BIT(buf, c);</div><div class='add'>+		  c = *pat++;</div><div class='add'>+	       }</div><div class='add'>+	     while (c &amp;&amp; (c != ']'))</div><div class='add'>+	       {</div><div class='add'>+		  if (c == '\\')</div><div class='add'>+		    {</div><div class='add'>+		       c = *pat++;</div><div class='add'>+		       switch(c)</div><div class='add'>+			 {</div><div class='add'>+			    case 'n': c = '\n'; break;</div><div class='add'>+			    case 't': c = '\t'; break;</div><div class='add'>+			    case 0: ERROR;</div><div class='add'>+			 }</div><div class='add'>+		    }</div><div class='add'>+</div><div class='add'>+		  if (*pat == '-')</div><div class='add'>+		    {</div><div class='add'>+		       pat++;</div><div class='add'>+		       while (c &lt; *pat)</div><div class='add'>+			 {</div><div class='add'>+			    if (cs == 0)</div><div class='add'>+			      {</div><div class='add'>+				 SET_BIT(buf, UPPERCASE(c));</div><div class='add'>+				 SET_BIT(buf, LOWERCASE(c));</div><div class='add'>+			      }</div><div class='add'>+			    else SET_BIT(buf, c);</div><div class='add'>+			    c++;</div><div class='add'>+			 }</div><div class='add'>+		    }</div><div class='add'>+		  if (cs == 0)</div><div class='add'>+		    {</div><div class='add'>+		       SET_BIT(buf, UPPERCASE(c));</div><div class='add'>+		       SET_BIT(buf, LOWERCASE(c));</div><div class='add'>+		    }</div><div class='add'>+		  else SET_BIT(buf, c);</div><div class='add'>+		  c = *pat++;</div><div class='add'>+	       }</div><div class='add'>+	     if (c != ']') ERROR;</div><div class='add'>+	     if (reverse) for (i = 0; i &lt; 32; i++) buf[i] = buf[i] ^ 0xFF;</div><div class='add'>+	     reverse = 0;</div><div class='add'>+	     buf += 32;</div><div class='add'>+	     min_length++;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '.':</div><div class='add'>+	     last = buf;</div><div class='add'>+	     *buf++ = ANY;</div><div class='add'>+	     min_length++;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '*':</div><div class='add'>+	     if (last == NULL) goto literal_char;</div><div class='add'>+	     *last |= STAR;</div><div class='add'>+	     min_length--;</div><div class='add'>+	     last = NULL;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '+':</div><div class='add'>+	     if (last == NULL) goto literal_char;</div><div class='add'>+	     *last |= LEAST_ONCE;</div><div class='add'>+	     last = NULL;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '?':</div><div class='add'>+	     if (last == NULL) goto literal_char;</div><div class='add'>+	     *last |= MAYBE_ONCE;</div><div class='add'>+	     last = NULL;</div><div class='add'>+	     min_length--;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   literal_char:</div><div class='add'>+	   default:</div><div class='add'>+	     /* This is to keep track of longest substring */</div><div class='add'>+	     min_length++;</div><div class='add'>+	     this_max_mm++;</div><div class='add'>+	     if (last_count + 1 == count)</div><div class='add'>+	       {</div><div class='add'>+		  if (this_max_mm == 1)</div><div class='add'>+		    {</div><div class='add'>+		       this_mm_p = buf;</div><div class='add'>+		    }</div><div class='add'>+		  else if (max_mm &lt; this_max_mm)</div><div class='add'>+		    {</div><div class='add'>+		       mm_p = this_mm_p;</div><div class='add'>+		       max_mm = this_max_mm;</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+	     else</div><div class='add'>+	       {</div><div class='add'>+		  this_mm_p = buf;</div><div class='add'>+		  this_max_mm = 1;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     last_count = count;</div><div class='add'>+</div><div class='add'>+	     last = buf;</div><div class='add'>+	     *buf++ = LITERAL;</div><div class='add'>+	     *buf++ = UPPERCASE(c);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   *buf = 0;</div><div class='add'>+   /* Check for ordinary search */</div><div class='add'>+   ebuf = buf;</div><div class='add'>+   buf = reg-&gt;buf;</div><div class='add'>+</div><div class='add'>+   if (no_osearch) ordinary_search = 0;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	ordinary_search = 1;</div><div class='add'>+	while (buf &lt; ebuf)</div><div class='add'>+	  {</div><div class='add'>+	     if (*buf != LITERAL)</div><div class='add'>+	       {</div><div class='add'>+		  ordinary_search = 0;</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	     buf += 2;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   reg-&gt;osearch = ordinary_search;</div><div class='add'>+   reg-&gt;must_match_str[15] = 0;</div><div class='add'>+   reg-&gt;min_length = (min_length &gt; 0) ? (unsigned int) min_length : 0;</div><div class='add'>+   if (ordinary_search)</div><div class='add'>+     {</div><div class='add'>+	strncpy((char *) reg-&gt;must_match_str, (char *) reg-&gt;pat, 15);</div><div class='add'>+	reg-&gt;must_match = 1;</div><div class='add'>+	return(0);</div><div class='add'>+     }</div><div class='add'>+   /* check for longest substring of pattern */</div><div class='add'>+   reg-&gt;must_match = 0;</div><div class='add'>+   if ((mm_p == NULL) &amp;&amp; (this_mm_p != NULL)) mm_p = this_mm_p;</div><div class='add'>+   if (mm_p == NULL)</div><div class='add'>+     {</div><div class='add'>+	return (0);</div><div class='add'>+     }</div><div class='add'>+   n = 15;</div><div class='add'>+   pat = reg-&gt;must_match_str;</div><div class='add'>+   buf = mm_p;</div><div class='add'>+   while (n--)</div><div class='add'>+     {</div><div class='add'>+	if (*buf++ != LITERAL) break;</div><div class='add'>+	*pat++ = *buf++;</div><div class='add'>+     }</div><div class='add'>+   *pat = 0;</div><div class='add'>+   if (pat != reg-&gt;must_match_str) reg-&gt;must_match = 1;</div><div class='add'>+   return(0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLregexp_quote_string (char *re, char *buf, unsigned int buflen)</div><div class='add'>+{</div><div class='add'>+   char ch;</div><div class='add'>+   char *b, *bmax;</div><div class='add'>+</div><div class='add'>+   if (re == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+   b = buf;</div><div class='add'>+   bmax = buf + buflen;</div><div class='add'>+</div><div class='add'>+   while (b &lt; bmax)</div><div class='add'>+     {</div><div class='add'>+	switch (ch = *re++)</div><div class='add'>+	  {</div><div class='add'>+	   case 0:</div><div class='add'>+	     *b = 0;</div><div class='add'>+	     return buf;</div><div class='add'>+</div><div class='add'>+	   case '$':</div><div class='add'>+	   case '\\':</div><div class='add'>+	   case '[':</div><div class='add'>+	   case ']':</div><div class='add'>+	   case '.':</div><div class='add'>+	   case '^':</div><div class='add'>+	   case '*':</div><div class='add'>+	   case '+':</div><div class='add'>+	   case '?':</div><div class='add'>+	     *b++ = '\\';</div><div class='add'>+	    if (b == bmax) break;</div><div class='add'>+	     /* drop */</div><div class='add'>+</div><div class='add'>+	   default:</div><div class='add'>+	     *b++ = ch;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+#define MAX_EXP 4096</div><div class='add'>+int main(int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+   char *regexp, *file;</div><div class='add'>+   char expbuf[MAX_EXP], buf[512];</div><div class='add'>+   SLRegexp_Type reg;</div><div class='add'>+</div><div class='add'>+   file = argv[2];</div><div class='add'>+   regexp = argv[1];</div><div class='add'>+</div><div class='add'>+   if (NULL == (fp = fopen(file, "r")))</div><div class='add'>+     {</div><div class='add'>+	fprintf(stderr, "File not open\n");</div><div class='add'>+	return(1);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   reg.buf = expbuf;</div><div class='add'>+   reg.buf_len = MAX_EXP;</div><div class='add'>+   reg.pat = regexp;</div><div class='add'>+   reg.case_sensitive = 1;</div><div class='add'>+</div><div class='add'>+   if (!regexp_compile(&amp;reg)) while (NULL != fgets(buf, 511, fp))</div><div class='add'>+     {</div><div class='add'>+	if (reg.osearch)</div><div class='add'>+	  {</div><div class='add'>+	     if (NULL == strstr(buf, reg.pat)) continue;</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     if (reg.must_match &amp;&amp; (NULL == strstr(buf, reg.must_match_str))) continue;</div><div class='add'>+	     if (0 == regexp_match(buf, buf + strlen(buf), &amp;reg)) continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	fputs(buf, stdout);</div><div class='add'>+     }</div><div class='add'>+   return (0);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slrline.c b/mdk-stage1/slang/slrline.c<br/>new file mode 100644<br/>index 000000000..1874be0bb<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slrline.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slrline.c</a></div><div class='hunk'>@@ -0,0 +1,836 @@</div><div class='add'>+/* SLang_read_line interface --- uses SLang tty stuff */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+int SLang_RL_EOF_Char = 4;</div><div class='add'>+#else</div><div class='add'>+int SLang_RL_EOF_Char = 26;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLang_Rline_Quit;</div><div class='add'>+static SLang_RLine_Info_Type *This_RLI;</div><div class='add'>+</div><div class='add'>+static unsigned char Char_Widths[256];</div><div class='add'>+static void position_cursor (int);</div><div class='add'>+</div><div class='add'>+static void rl_beep (void)</div><div class='add'>+{</div><div class='add'>+   putc(7, stdout);</div><div class='add'>+   fflush (stdout);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* editing functions */</div><div class='add'>+static int rl_bol (void)</div><div class='add'>+{</div><div class='add'>+   if (This_RLI-&gt;point == 0) return 0;</div><div class='add'>+   This_RLI-&gt;point = 0;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_eol (void)</div><div class='add'>+{</div><div class='add'>+   if (This_RLI-&gt;point == This_RLI-&gt;len) return 0;</div><div class='add'>+   This_RLI-&gt;point = This_RLI-&gt;len;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_right (void)</div><div class='add'>+{</div><div class='add'>+   if (This_RLI-&gt;point == This_RLI-&gt;len) return 0;</div><div class='add'>+   This_RLI-&gt;point++;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_left (void)</div><div class='add'>+{</div><div class='add'>+   if (This_RLI-&gt;point == 0) return 0;</div><div class='add'>+   This_RLI-&gt;point--;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_self_insert (void)</div><div class='add'>+{</div><div class='add'>+   unsigned char *pmin, *p;</div><div class='add'>+</div><div class='add'>+   if (This_RLI-&gt;len == This_RLI-&gt;buf_len)</div><div class='add'>+     {</div><div class='add'>+	rl_beep ();</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   pmin = This_RLI-&gt;buf + This_RLI-&gt;point;</div><div class='add'>+   p = This_RLI-&gt;buf + This_RLI-&gt;len;</div><div class='add'>+   while (p &gt; pmin)</div><div class='add'>+     {</div><div class='add'>+	*p = *(p - 1);</div><div class='add'>+	p--;</div><div class='add'>+     }</div><div class='add'>+   *pmin = SLang_Last_Key_Char;</div><div class='add'>+</div><div class='add'>+   This_RLI-&gt;len++;</div><div class='add'>+   This_RLI-&gt;point++;</div><div class='add'>+   if ((This_RLI-&gt;curs_pos + 2 &gt;= This_RLI-&gt;edit_width)</div><div class='add'>+       || (This_RLI-&gt;tt_insert == NULL)</div><div class='add'>+       || (Char_Widths[SLang_Last_Key_Char] != 1)) return 1;</div><div class='add'>+</div><div class='add'>+   (*This_RLI-&gt;tt_insert)((char) SLang_Last_Key_Char);</div><div class='add'>+   /* update screen buf */</div><div class='add'>+   p = This_RLI-&gt;old_upd + (This_RLI-&gt;len - 1);</div><div class='add'>+   pmin = This_RLI-&gt;old_upd + (This_RLI-&gt;point - 1);</div><div class='add'>+   while (p &gt; pmin)</div><div class='add'>+     {</div><div class='add'>+	*p = *(p - 1);</div><div class='add'>+	p--;</div><div class='add'>+     }</div><div class='add'>+   *pmin = SLang_Last_Key_Char;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_rline_insert (char *s)</div><div class='add'>+{</div><div class='add'>+   unsigned char *pmin, *p;</div><div class='add'>+   int n;</div><div class='add'>+</div><div class='add'>+   n = strlen (s);</div><div class='add'>+   if (n &gt; This_RLI-&gt;buf_len - This_RLI-&gt;len)</div><div class='add'>+     n = This_RLI-&gt;buf_len - This_RLI-&gt;len;</div><div class='add'>+</div><div class='add'>+   if (n == 0) return 0;</div><div class='add'>+</div><div class='add'>+   pmin = This_RLI-&gt;buf + This_RLI-&gt;point;</div><div class='add'>+   p = This_RLI-&gt;buf + (This_RLI-&gt;len - 1);</div><div class='add'>+</div><div class='add'>+   while (p &gt;= pmin)</div><div class='add'>+     {</div><div class='add'>+	*(p + n) = *p;</div><div class='add'>+	p--;</div><div class='add'>+     }</div><div class='add'>+   SLMEMCPY ((char *) pmin, s, n);</div><div class='add'>+</div><div class='add'>+   This_RLI-&gt;len += n;</div><div class='add'>+   This_RLI-&gt;point += n;</div><div class='add'>+   return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_deln (int n)</div><div class='add'>+{</div><div class='add'>+   unsigned char *pmax, *p;</div><div class='add'>+</div><div class='add'>+   p = This_RLI-&gt;buf + This_RLI-&gt;point;</div><div class='add'>+   pmax = This_RLI-&gt;buf + This_RLI-&gt;len;</div><div class='add'>+</div><div class='add'>+   if (p + n &gt; pmax) n = (int) (pmax - p);</div><div class='add'>+   while (p &lt; pmax)</div><div class='add'>+     {</div><div class='add'>+	*p = *(p + n);</div><div class='add'>+	p++;</div><div class='add'>+     }</div><div class='add'>+   This_RLI-&gt;len -= n;</div><div class='add'>+   return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_del (void)</div><div class='add'>+{</div><div class='add'>+   return rl_deln(1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_quote_insert (void)</div><div class='add'>+{</div><div class='add'>+   int err = SLang_Error;</div><div class='add'>+   SLang_Error = 0;</div><div class='add'>+   SLang_Last_Key_Char = (*This_RLI-&gt;getkey)();</div><div class='add'>+   rl_self_insert ();</div><div class='add'>+   if (SLang_Error == SL_USER_BREAK) SLang_Error = 0;</div><div class='add'>+   else SLang_Error = err;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_trim (void)</div><div class='add'>+{</div><div class='add'>+   unsigned char *p, *pmax, *p1;</div><div class='add'>+   p = This_RLI-&gt;buf + This_RLI-&gt;point;</div><div class='add'>+   pmax = This_RLI-&gt;buf + This_RLI-&gt;len;</div><div class='add'>+</div><div class='add'>+   if (p == pmax)</div><div class='add'>+     {</div><div class='add'>+	if (p == This_RLI-&gt;buf) return 0;</div><div class='add'>+	p--;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((*p != ' ') &amp;&amp; (*p != '\t')) return 0;</div><div class='add'>+   p1 = p;</div><div class='add'>+   while ((p1 &lt; pmax) &amp;&amp; ((*p1 == ' ') || (*p1 == '\t'))) p1++;</div><div class='add'>+   pmax = p1;</div><div class='add'>+   p1 = This_RLI-&gt;buf;</div><div class='add'>+</div><div class='add'>+   while ((p &gt;= p1) &amp;&amp; ((*p == ' ') || (*p == '\t'))) p--;</div><div class='add'>+   if (p == pmax) return 0;</div><div class='add'>+   p++;</div><div class='add'>+</div><div class='add'>+   This_RLI-&gt;point = (int) (p - p1);</div><div class='add'>+   return rl_deln ((int) (pmax - p));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_bdel (void)</div><div class='add'>+{</div><div class='add'>+   if (rl_left()) return rl_del();</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_deleol (void)</div><div class='add'>+{</div><div class='add'>+   if (This_RLI-&gt;point == This_RLI-&gt;len) return 0;</div><div class='add'>+   *(This_RLI-&gt;buf + This_RLI-&gt;point) = 0;</div><div class='add'>+   This_RLI-&gt;len = This_RLI-&gt;point;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_delete_line (void)</div><div class='add'>+{</div><div class='add'>+   This_RLI-&gt;point = 0;</div><div class='add'>+   *(This_RLI-&gt;buf + This_RLI-&gt;point) = 0;</div><div class='add'>+   This_RLI-&gt;len = 0;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_enter (void)</div><div class='add'>+{</div><div class='add'>+   *(This_RLI-&gt;buf + This_RLI-&gt;len) = 0;</div><div class='add'>+   SLang_Rline_Quit = 1;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLKeyMap_List_Type *RL_Keymap;</div><div class='add'>+</div><div class='add'>+/* This update is designed for dumb terminals.  It assumes only that the</div><div class='add'>+ * terminal can backspace via ^H, and move cursor to start of line via ^M.</div><div class='add'>+ * There is a hook so the user can provide a more sophisticated update if</div><div class='add'>+ * necessary.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static void position_cursor (int col)</div><div class='add'>+{</div><div class='add'>+   unsigned char *p, *pmax;</div><div class='add'>+   int dc;</div><div class='add'>+</div><div class='add'>+   if (col == This_RLI-&gt;curs_pos)</div><div class='add'>+     {</div><div class='add'>+	fflush (stdout);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (This_RLI-&gt;tt_goto_column != NULL)</div><div class='add'>+     {</div><div class='add'>+	(*This_RLI-&gt;tt_goto_column)(col);</div><div class='add'>+	This_RLI-&gt;curs_pos = col;</div><div class='add'>+	fflush (stdout);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   dc = This_RLI-&gt;curs_pos - col;</div><div class='add'>+   if (dc &lt; 0)</div><div class='add'>+     {</div><div class='add'>+	p = This_RLI-&gt;new_upd + This_RLI-&gt;curs_pos;</div><div class='add'>+	pmax = This_RLI-&gt;new_upd + col;</div><div class='add'>+	while (p &lt; pmax) putc((char) *p++, stdout);</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	if (dc &lt; col)</div><div class='add'>+	  {</div><div class='add'>+	     while (dc--) putc(8, stdout);</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     putc('\r', stdout);</div><div class='add'>+	     p = This_RLI-&gt;new_upd;</div><div class='add'>+	     pmax = This_RLI-&gt;new_upd + col;</div><div class='add'>+	     while (p &lt; pmax) putc((char) *p++, stdout);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   This_RLI-&gt;curs_pos = col;</div><div class='add'>+   fflush (stdout);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void erase_eol (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+   unsigned char *p, *pmax;</div><div class='add'>+</div><div class='add'>+   p = rli-&gt;old_upd + rli-&gt;curs_pos;</div><div class='add'>+   pmax = rli-&gt;old_upd + rli-&gt;old_upd_len;</div><div class='add'>+</div><div class='add'>+   while (p++ &lt; pmax) putc(' ', stdout);</div><div class='add'>+</div><div class='add'>+   rli-&gt;curs_pos = rli-&gt;old_upd_len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char *spit_out(SLang_RLine_Info_Type *rli, unsigned char *p)</div><div class='add'>+{</div><div class='add'>+   unsigned char *pmax;</div><div class='add'>+   position_cursor ((int) (p - rli-&gt;new_upd));</div><div class='add'>+   pmax = rli-&gt;new_upd + rli-&gt;new_upd_len;</div><div class='add'>+   while (p &lt; pmax) putc((char) *p++, stdout);</div><div class='add'>+   rli-&gt;curs_pos = rli-&gt;new_upd_len;</div><div class='add'>+   return pmax;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void really_update (SLang_RLine_Info_Type *rli, int new_curs_position)</div><div class='add'>+{</div><div class='add'>+   unsigned char *b = rli-&gt;old_upd, *p = rli-&gt;new_upd, chb, chp;</div><div class='add'>+   unsigned char *pmax;</div><div class='add'>+</div><div class='add'>+   if (rli-&gt;update_hook != NULL)</div><div class='add'>+     {</div><div class='add'>+	(*rli-&gt;update_hook)(p, rli-&gt;edit_width, new_curs_position);</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	pmax = p + rli-&gt;edit_width;</div><div class='add'>+	while (p &lt; pmax)</div><div class='add'>+	  {</div><div class='add'>+	     chb = *b++; chp = *p++;</div><div class='add'>+	     if (chb == chp) continue;</div><div class='add'>+</div><div class='add'>+	     if (rli-&gt;old_upd_len &lt;= rli-&gt;new_upd_len)</div><div class='add'>+	       {</div><div class='add'>+		  /* easy one */</div><div class='add'>+		  (void) spit_out (rli, p - 1);</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	     spit_out(rli, p - 1);</div><div class='add'>+	     erase_eol (rli);</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	position_cursor (new_curs_position);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* update finished, so swap */</div><div class='add'>+</div><div class='add'>+   rli-&gt;old_upd_len = rli-&gt;new_upd_len;</div><div class='add'>+   p = rli-&gt;old_upd;</div><div class='add'>+   rli-&gt;old_upd = rli-&gt;new_upd;</div><div class='add'>+   rli-&gt;new_upd = p;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void RLupdate (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+   int len, dlen, start_len = 0, prompt_len = 0, tw = 0, count;</div><div class='add'>+   int want_cursor_pos;</div><div class='add'>+   unsigned char *b, chb, *b_point, *p;</div><div class='add'>+   int no_echo;</div><div class='add'>+</div><div class='add'>+   no_echo = rli-&gt;flags &amp; SL_RLINE_NO_ECHO;</div><div class='add'>+</div><div class='add'>+   b_point = (unsigned char *) (rli-&gt;buf + rli-&gt;point);</div><div class='add'>+   *(rli-&gt;buf + rli-&gt;len) = 0;</div><div class='add'>+</div><div class='add'>+   /* expand characters for output buffer --- handle prompt first.</div><div class='add'>+    * Do two passes --- first to find out where to begin upon horiz</div><div class='add'>+    * scroll and the second to actually fill the buffer. */</div><div class='add'>+   len = 0;</div><div class='add'>+   count = 2;			       /* once for prompt and once for buf */</div><div class='add'>+</div><div class='add'>+   b = (unsigned char *) rli-&gt;prompt;</div><div class='add'>+   while (count--)</div><div class='add'>+     {</div><div class='add'>+	if ((count == 0) &amp;&amp; no_echo)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	/* The prompt could be NULL */</div><div class='add'>+	if (b != NULL) while ((chb = *b) != 0)</div><div class='add'>+	  {</div><div class='add'>+	     /* This will ensure that the screen is scrolled a third of the edit</div><div class='add'>+	      * width each time */</div><div class='add'>+	     if (b_point == b) break;</div><div class='add'>+	     dlen = Char_Widths[chb];</div><div class='add'>+	     if ((chb == '\t') &amp;&amp; tw)</div><div class='add'>+	       {</div><div class='add'>+		  dlen = tw * ((len - prompt_len) / tw + 1) - (len - prompt_len);</div><div class='add'>+	       }</div><div class='add'>+	     len += dlen;</div><div class='add'>+	     b++;</div><div class='add'>+	  }</div><div class='add'>+	tw = rli-&gt;tab;</div><div class='add'>+	b = (unsigned char *) rli-&gt;buf;</div><div class='add'>+	if (count == 1) want_cursor_pos = prompt_len = len;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (len &lt; rli-&gt;edit_width - rli-&gt;dhscroll) start_len = 0;</div><div class='add'>+   else if ((rli-&gt;start_column &gt; len)</div><div class='add'>+	    || (rli-&gt;start_column + rli-&gt;edit_width &lt;= len))</div><div class='add'>+     {</div><div class='add'>+	start_len = len - (rli-&gt;edit_width - rli-&gt;dhscroll);</div><div class='add'>+	if (start_len &lt; 0) start_len = 0;</div><div class='add'>+     }</div><div class='add'>+   else start_len = rli-&gt;start_column;</div><div class='add'>+   rli-&gt;start_column = start_len;</div><div class='add'>+</div><div class='add'>+   want_cursor_pos = len - start_len;</div><div class='add'>+</div><div class='add'>+   /* second pass */</div><div class='add'>+   p = rli-&gt;new_upd;</div><div class='add'>+</div><div class='add'>+   len = 0;</div><div class='add'>+   count = 2;</div><div class='add'>+   b = (unsigned char *) rli-&gt;prompt;</div><div class='add'>+   if (b == NULL) b = (unsigned char *) "";</div><div class='add'>+</div><div class='add'>+   while ((len &lt; start_len) &amp;&amp; (*b))</div><div class='add'>+     {</div><div class='add'>+	len += Char_Widths[*b++];</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   tw = 0;</div><div class='add'>+   if (*b == 0)</div><div class='add'>+     {</div><div class='add'>+	b = (unsigned char *) rli-&gt;buf;</div><div class='add'>+	while (len &lt; start_len)</div><div class='add'>+	  {</div><div class='add'>+	     len += Char_Widths[*b++];</div><div class='add'>+	  }</div><div class='add'>+	tw = rli-&gt;tab;</div><div class='add'>+	count--;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   len = 0;</div><div class='add'>+   while (count--)</div><div class='add'>+     {</div><div class='add'>+	if ((count == 0) &amp;&amp; (no_echo))</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	while ((len &lt; rli-&gt;edit_width) &amp;&amp; ((chb = *b++) != 0))</div><div class='add'>+	  {</div><div class='add'>+	     dlen = Char_Widths[chb];</div><div class='add'>+	     if (dlen == 1) *p++ = chb;</div><div class='add'>+	     else</div><div class='add'>+	       {</div><div class='add'>+		  if ((chb == '\t') &amp;&amp; tw)</div><div class='add'>+		    {</div><div class='add'>+		       dlen = tw * ((len + start_len - prompt_len) / tw + 1) - (len + start_len - prompt_len);</div><div class='add'>+		       len += dlen;	       /* ok since dlen comes out 0  */</div><div class='add'>+		       if (len &gt; rli-&gt;edit_width) dlen = len - rli-&gt;edit_width;</div><div class='add'>+		       while (dlen--) *p++ = ' ';</div><div class='add'>+		       dlen = 0;</div><div class='add'>+		    }</div><div class='add'>+		  else</div><div class='add'>+		    {</div><div class='add'>+		       if (dlen == 3)</div><div class='add'>+			 {</div><div class='add'>+			    chb &amp;= 0x7F;</div><div class='add'>+			    *p++ = '~';</div><div class='add'>+			 }</div><div class='add'>+</div><div class='add'>+		       *p++ = '^';</div><div class='add'>+		       if (chb == 127)  *p++ = '?';</div><div class='add'>+		       else *p++ = chb + '@';</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+	     len += dlen;</div><div class='add'>+	  }</div><div class='add'>+	/* if (start_len &gt; prompt_len) break; */</div><div class='add'>+	tw = rli-&gt;tab;</div><div class='add'>+	b = (unsigned char *) rli-&gt;buf;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   rli-&gt;new_upd_len = (int) (p - rli-&gt;new_upd);</div><div class='add'>+   while (p &lt; rli-&gt;new_upd + rli-&gt;edit_width) *p++ = ' ';</div><div class='add'>+   really_update (rli, want_cursor_pos);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLrline_redraw (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+   unsigned char *p = rli-&gt;new_upd;</div><div class='add'>+   unsigned char *pmax = p + rli-&gt;edit_width;</div><div class='add'>+   while (p &lt; pmax) *p++ = ' ';</div><div class='add'>+   rli-&gt;new_upd_len = rli-&gt;edit_width;</div><div class='add'>+   really_update (rli, 0);</div><div class='add'>+   RLupdate (rli);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_eof_insert (void)</div><div class='add'>+{</div><div class='add'>+   if (This_RLI-&gt;len == 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_Last_Key_Char = SLang_RL_EOF_Char;</div><div class='add'>+	/* rl_self_insert (); */</div><div class='add'>+	return rl_enter ();</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is very naive.  It knows very little about nesting and nothing</div><div class='add'>+ * about quoting.</div><div class='add'>+ */</div><div class='add'>+static void blink_match (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+   unsigned char bra, ket;</div><div class='add'>+   unsigned int delta_column;</div><div class='add'>+   unsigned char *p, *pmin;</div><div class='add'>+   int dq_level, sq_level;</div><div class='add'>+   int level;</div><div class='add'>+</div><div class='add'>+   pmin = rli-&gt;buf;</div><div class='add'>+   p = pmin + rli-&gt;point;</div><div class='add'>+   if (pmin == p)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   ket = SLang_Last_Key_Char;</div><div class='add'>+   switch (ket)</div><div class='add'>+     {</div><div class='add'>+      case ')':</div><div class='add'>+	bra = '(';</div><div class='add'>+	break;</div><div class='add'>+      case ']':</div><div class='add'>+	bra = '[';</div><div class='add'>+	break;</div><div class='add'>+      case '}':</div><div class='add'>+	bra = '{';</div><div class='add'>+	break;</div><div class='add'>+      default:</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   level = 0;</div><div class='add'>+   sq_level = dq_level = 0;</div><div class='add'>+</div><div class='add'>+   delta_column = 0;</div><div class='add'>+   while (p &gt; pmin)</div><div class='add'>+     {</div><div class='add'>+	char ch;</div><div class='add'>+</div><div class='add'>+	p--;</div><div class='add'>+	delta_column++;</div><div class='add'>+	ch = *p;</div><div class='add'>+</div><div class='add'>+	if (ch == ket)</div><div class='add'>+	  {</div><div class='add'>+	     if ((dq_level == 0) &amp;&amp; (sq_level == 0))</div><div class='add'>+	       level++;</div><div class='add'>+	  }</div><div class='add'>+	else if (ch == bra)</div><div class='add'>+	  {</div><div class='add'>+	     if ((dq_level != 0) || (sq_level != 0))</div><div class='add'>+	       continue;</div><div class='add'>+</div><div class='add'>+	     level--;</div><div class='add'>+	     if (level == 0)</div><div class='add'>+	       {</div><div class='add'>+		  rli-&gt;point -= delta_column;</div><div class='add'>+		  RLupdate (rli);</div><div class='add'>+		  (*rli-&gt;input_pending)(10);</div><div class='add'>+		  rli-&gt;point += delta_column;</div><div class='add'>+		  RLupdate (rli);</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	     if (level &lt; 0)</div><div class='add'>+	       break;</div><div class='add'>+	  }</div><div class='add'>+	else if (ch == '"') dq_level = !dq_level;</div><div class='add'>+	else if (ch == '\'') sq_level = !sq_level;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_read_line (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+   unsigned char *p, *pmax;</div><div class='add'>+   SLang_Key_Type *key;</div><div class='add'>+</div><div class='add'>+   SLang_Rline_Quit = 0;</div><div class='add'>+   This_RLI = rli;</div><div class='add'>+   p = rli-&gt;old_upd; pmax = p + rli-&gt;edit_width;</div><div class='add'>+   while (p &lt; pmax) *p++ = ' ';</div><div class='add'>+</div><div class='add'>+   /* Sanity checking */</div><div class='add'>+   rli-&gt;len = strlen ((char *) rli-&gt;buf);</div><div class='add'>+   if (rli-&gt;len &gt;= rli-&gt;buf_len)</div><div class='add'>+     {</div><div class='add'>+	rli-&gt;len = 0;</div><div class='add'>+	*rli-&gt;buf = 0;</div><div class='add'>+     }</div><div class='add'>+   if (rli-&gt;point &gt; rli-&gt;len) rli-&gt;point = rli-&gt;len;</div><div class='add'>+   if (rli-&gt;point &lt; 0) rli-&gt;point = 0;</div><div class='add'>+</div><div class='add'>+   rli-&gt;curs_pos = rli-&gt;start_column = 0;</div><div class='add'>+   rli-&gt;new_upd_len = rli-&gt;old_upd_len = 0;</div><div class='add'>+</div><div class='add'>+   This_RLI-&gt;last_fun = NULL;</div><div class='add'>+   if (rli-&gt;update_hook == NULL)</div><div class='add'>+     putc ('\r', stdout);</div><div class='add'>+</div><div class='add'>+   RLupdate (rli);</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	key = SLang_do_key (RL_Keymap, (int (*)(void)) rli-&gt;getkey);</div><div class='add'>+</div><div class='add'>+	if ((key == NULL) || (key-&gt;f.f == NULL))</div><div class='add'>+	  rl_beep ();</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     if ((SLang_Last_Key_Char == SLang_RL_EOF_Char)</div><div class='add'>+		 &amp;&amp; (*key-&gt;str == 2)</div><div class='add'>+		 &amp;&amp; (This_RLI-&gt;len == 0))</div><div class='add'>+	       rl_eof_insert ();</div><div class='add'>+	     else if (key-&gt;type == SLKEY_F_INTRINSIC)</div><div class='add'>+	       {</div><div class='add'>+		  if ((key-&gt;f.f)())</div><div class='add'>+		    RLupdate (rli);</div><div class='add'>+</div><div class='add'>+		  if ((rli-&gt;flags &amp; SL_RLINE_BLINK_MATCH)</div><div class='add'>+		      &amp;&amp; (rli-&gt;input_pending != NULL))</div><div class='add'>+		    blink_match (rli);</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     if (SLang_Rline_Quit)</div><div class='add'>+	       {</div><div class='add'>+		  This_RLI-&gt;buf[This_RLI-&gt;len] = 0;</div><div class='add'>+		  if (SLang_Error == SL_USER_BREAK)</div><div class='add'>+		    {</div><div class='add'>+		       SLang_Error = 0;</div><div class='add'>+		       return -1;</div><div class='add'>+		    }</div><div class='add'>+		  return This_RLI-&gt;len;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	if (key != NULL)</div><div class='add'>+	  This_RLI-&gt;last_fun = key-&gt;f.f;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_abort (void)</div><div class='add'>+{</div><div class='add'>+   rl_delete_line ();</div><div class='add'>+   return rl_enter ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* TTY interface --- ANSI */</div><div class='add'>+</div><div class='add'>+static void ansi_goto_column (int n)</div><div class='add'>+{</div><div class='add'>+   putc('\r', stdout);</div><div class='add'>+   if (n) fprintf(stdout, "\033[%dC", n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void rl_select_line (SLang_Read_Line_Type *p)</div><div class='add'>+{</div><div class='add'>+   This_RLI-&gt;last = p;</div><div class='add'>+   strcpy ((char *) This_RLI-&gt;buf, (char *) p-&gt;buf);</div><div class='add'>+   This_RLI-&gt;point = This_RLI-&gt;len = strlen((char *) p-&gt;buf);</div><div class='add'>+}</div><div class='add'>+static int rl_next_line (void);</div><div class='add'>+static int rl_prev_line (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Read_Line_Type *prev;</div><div class='add'>+</div><div class='add'>+   if (((This_RLI-&gt;last_fun != (FVOID_STAR) rl_prev_line)</div><div class='add'>+	&amp;&amp; (This_RLI-&gt;last_fun != (FVOID_STAR) rl_next_line))</div><div class='add'>+       || (This_RLI-&gt;last == NULL))</div><div class='add'>+     {</div><div class='add'>+	prev = This_RLI-&gt;tail;</div><div class='add'>+     }</div><div class='add'>+   else prev = This_RLI-&gt;last-&gt;prev;</div><div class='add'>+</div><div class='add'>+   if (prev == NULL)</div><div class='add'>+     {</div><div class='add'>+	rl_beep ();</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   rl_select_line (prev);</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+static int rl_redraw (void)</div><div class='add'>+{</div><div class='add'>+   SLrline_redraw (This_RLI);</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int rl_next_line (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Read_Line_Type *next;</div><div class='add'>+</div><div class='add'>+   if (((This_RLI-&gt;last_fun != (FVOID_STAR) rl_prev_line)</div><div class='add'>+	&amp;&amp; (This_RLI-&gt;last_fun != (FVOID_STAR) rl_next_line))</div><div class='add'>+       || (This_RLI-&gt;last == NULL))</div><div class='add'>+      {</div><div class='add'>+	 rl_beep ();</div><div class='add'>+	 return 0;</div><div class='add'>+      }</div><div class='add'>+</div><div class='add'>+   next = This_RLI-&gt;last-&gt;next;</div><div class='add'>+</div><div class='add'>+   if (next == NULL)</div><div class='add'>+     {</div><div class='add'>+	This_RLI-&gt;len = This_RLI-&gt;point = 0;</div><div class='add'>+	*This_RLI-&gt;buf = 0;</div><div class='add'>+	This_RLI-&gt;last = NULL;</div><div class='add'>+     }</div><div class='add'>+   else rl_select_line (next);</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLKeymap_Function_Type SLReadLine_Functions[] =</div><div class='add'>+{</div><div class='add'>+   {"up", rl_prev_line},</div><div class='add'>+   {"down", rl_next_line},</div><div class='add'>+   {"bol", rl_bol},</div><div class='add'>+   {"eol", rl_eol},</div><div class='add'>+   {"right", rl_right},</div><div class='add'>+   {"left", rl_left},</div><div class='add'>+   {"self_insert", rl_self_insert},</div><div class='add'>+   {"bdel", rl_bdel},</div><div class='add'>+   {"del", rl_del},</div><div class='add'>+   {"deleol", rl_deleol},</div><div class='add'>+   {"enter", rl_enter},</div><div class='add'>+   {"trim", rl_trim},</div><div class='add'>+   {"quoted_insert", rl_quote_insert},</div><div class='add'>+   {(char *) NULL, NULL}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLang_init_readline (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+   int ch;</div><div class='add'>+   char simple[2];</div><div class='add'>+</div><div class='add'>+   if (RL_Keymap == NULL)</div><div class='add'>+     {</div><div class='add'>+	simple[1] = 0;</div><div class='add'>+	if (NULL == (RL_Keymap = SLang_create_keymap ("ReadLine", NULL)))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	RL_Keymap-&gt;functions = SLReadLine_Functions;</div><div class='add'>+</div><div class='add'>+	/* This breaks under some DEC ALPHA compilers (scary!) */</div><div class='add'>+#ifndef __DECC</div><div class='add'>+	for (ch = ' '; ch &lt; 256; ch++)</div><div class='add'>+	  {</div><div class='add'>+	     simple[0] = (char) ch;</div><div class='add'>+	     SLkm_define_key (simple, (FVOID_STAR) rl_self_insert, RL_Keymap);</div><div class='add'>+	  }</div><div class='add'>+#else</div><div class='add'>+	ch = ' ';</div><div class='add'>+	while (1)</div><div class='add'>+	  {</div><div class='add'>+	     simple[0] = (char) ch;</div><div class='add'>+	     SLkm_define_key (simple, (FVOID_STAR) rl_self_insert, RL_Keymap);</div><div class='add'>+	     ch = ch + 1;</div><div class='add'>+	     if (ch == 256) break;</div><div class='add'>+	  }</div><div class='add'>+#endif				       /* NOT __DECC */</div><div class='add'>+</div><div class='add'>+	simple[0] = SLang_Abort_Char;</div><div class='add'>+	SLkm_define_key (simple, (FVOID_STAR) rl_abort, RL_Keymap);</div><div class='add'>+	simple[0] = SLang_RL_EOF_Char;</div><div class='add'>+	SLkm_define_key (simple, (FVOID_STAR) rl_eof_insert, RL_Keymap);</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+	SLkm_define_key  ("^[[A", (FVOID_STAR) rl_prev_line, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^[[B", (FVOID_STAR) rl_next_line, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^[[C", (FVOID_STAR) rl_right, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^[[D", (FVOID_STAR) rl_left, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^[OA", (FVOID_STAR) rl_prev_line, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^[OB", (FVOID_STAR) rl_next_line, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^[OC", (FVOID_STAR) rl_right, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^[OD", (FVOID_STAR) rl_left, RL_Keymap);</div><div class='add'>+#else</div><div class='add'>+	SLkm_define_key  ("^@H", (FVOID_STAR) rl_prev_line, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^@P", (FVOID_STAR) rl_next_line, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^@M", (FVOID_STAR) rl_right, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^@K", (FVOID_STAR) rl_left, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^@S", (FVOID_STAR) rl_del, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^@O", (FVOID_STAR) rl_eol, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^@G", (FVOID_STAR) rl_bol, RL_Keymap);</div><div class='add'>+</div><div class='add'>+	SLkm_define_key  ("\xE0H", (FVOID_STAR) rl_prev_line, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("\xE0P", (FVOID_STAR) rl_next_line, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("\xE0M", (FVOID_STAR) rl_right, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("\xE0K", (FVOID_STAR) rl_left, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("\xE0S", (FVOID_STAR) rl_del, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("\xE0O", (FVOID_STAR) rl_eol, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("\xE0G", (FVOID_STAR) rl_bol, RL_Keymap);</div><div class='add'>+#endif</div><div class='add'>+	SLkm_define_key  ("^C", (FVOID_STAR) rl_abort, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^E", (FVOID_STAR) rl_eol, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^G", (FVOID_STAR) rl_abort, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^I", (FVOID_STAR) rl_self_insert, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^A", (FVOID_STAR) rl_bol, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("\r", (FVOID_STAR) rl_enter, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("\n", (FVOID_STAR) rl_enter, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^K", (FVOID_STAR) rl_deleol, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^L", (FVOID_STAR) rl_deleol, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^V", (FVOID_STAR) rl_del, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^D", (FVOID_STAR) rl_del, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^F", (FVOID_STAR) rl_right, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^B", (FVOID_STAR) rl_left, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^?", (FVOID_STAR) rl_bdel, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^H", (FVOID_STAR) rl_bdel, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^P", (FVOID_STAR) rl_prev_line, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^N", (FVOID_STAR) rl_next_line, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("^R", (FVOID_STAR) rl_redraw, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("`", (FVOID_STAR) rl_quote_insert, RL_Keymap);</div><div class='add'>+	SLkm_define_key  ("\033\\", (FVOID_STAR) rl_trim, RL_Keymap);</div><div class='add'>+	if (SLang_Error) return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (rli-&gt;prompt == NULL) rli-&gt;prompt = "";</div><div class='add'>+   if (rli-&gt;keymap == NULL) rli-&gt;keymap = RL_Keymap;</div><div class='add'>+   rli-&gt;old_upd = rli-&gt;upd_buf1;</div><div class='add'>+   rli-&gt;new_upd = rli-&gt;upd_buf2;</div><div class='add'>+   *rli-&gt;buf = 0;</div><div class='add'>+   rli-&gt;point = 0;</div><div class='add'>+</div><div class='add'>+   if (rli-&gt;flags &amp; SL_RLINE_USE_ANSI)</div><div class='add'>+     {</div><div class='add'>+	if (rli-&gt;tt_goto_column == NULL) rli-&gt;tt_goto_column = ansi_goto_column;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (Char_Widths[0] == 2) return 0;</div><div class='add'>+</div><div class='add'>+   for (ch = 0; ch &lt; 32; ch++) Char_Widths[ch] = 2;</div><div class='add'>+   for (ch = 32; ch &lt; 256; ch++) Char_Widths[ch] = 1;</div><div class='add'>+   Char_Widths[127] = 2;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+   for (ch = 128; ch &lt; 160; ch++) Char_Widths[ch] = 3;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Read_Line_Type *SLang_rline_save_line (SLang_RLine_Info_Type *rli)</div><div class='add'>+{</div><div class='add'>+   SLang_Read_Line_Type *rl = NULL;</div><div class='add'>+   unsigned char *buf;</div><div class='add'>+</div><div class='add'>+   if ((rli == NULL) || (rli-&gt;buf == NULL))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   if (NULL == (rl = (SLang_Read_Line_Type *) SLmalloc (sizeof (SLang_Read_Line_Type)))</div><div class='add'>+       || (NULL == (buf = (unsigned char *) SLmake_string ((char *)rli-&gt;buf))))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *)rl);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   rl-&gt;buf = buf;</div><div class='add'>+   rl-&gt;buf_len = strlen ((char *)buf);</div><div class='add'>+   rl-&gt;num = rl-&gt;misc = 0;</div><div class='add'>+   rl-&gt;next = rl-&gt;prev = NULL;</div><div class='add'>+</div><div class='add'>+   if (rli-&gt;tail != NULL)</div><div class='add'>+     {</div><div class='add'>+	rli-&gt;tail-&gt;next = rl;</div><div class='add'>+	rl-&gt;prev = rli-&gt;tail;</div><div class='add'>+     }</div><div class='add'>+   rli-&gt;tail = rl;</div><div class='add'>+</div><div class='add'>+   return rl;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slscanf.c b/mdk-stage1/slang/slscanf.c<br/>new file mode 100644<br/>index 000000000..5bd93ff41<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slscanf.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slscanf.c</a></div><div class='hunk'>@@ -0,0 +1,718 @@</div><div class='add'>+/* sscanf function for S-Lang */</div><div class='add'>+/* Copyright (c) 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+#include &lt;math.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static char *skip_whitespace (char *s)</div><div class='add'>+{</div><div class='add'>+   while (isspace (*s))</div><div class='add'>+     s++;</div><div class='add'>+   </div><div class='add'>+   return s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void init_map (unsigned char map[256], int base)</div><div class='add'>+{</div><div class='add'>+   memset ((char *) map, 0xFF, 256);</div><div class='add'>+   </div><div class='add'>+   map['0'] = 0;   map['1'] = 1;   map['2'] = 2;   map['3'] = 3;</div><div class='add'>+   map['4'] = 4;   map['5'] = 5;   map['6'] = 6;   map['7'] = 7;</div><div class='add'>+   if (base == 8)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   map['8'] = 8;   map['9'] = 9;</div><div class='add'>+   if (base == 10)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   map['A'] = 10;   map['B'] = 11;   map['C'] = 12;   map['D'] = 13;</div><div class='add'>+   map['E'] = 14;   map['F'] = 15;   map['a'] = 10;   map['b'] = 11;</div><div class='add'>+   map['c'] = 12;   map['d'] = 13;   map['e'] = 14;   map['f'] = 15;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *get_sign (char *s, char *smax, int *sign)</div><div class='add'>+{</div><div class='add'>+   *sign = 1;</div><div class='add'>+   if (s + 1 &lt; smax)</div><div class='add'>+     {</div><div class='add'>+	if (*s == '+') s++;</div><div class='add'>+	else if (*s == '-')</div><div class='add'>+	  {</div><div class='add'>+	     s++;</div><div class='add'>+	     *sign = -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   return s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int parse_long (char **sp, char *smax, long *np,</div><div class='add'>+		       long base, unsigned char map[256])</div><div class='add'>+{</div><div class='add'>+   char *s, *s0;</div><div class='add'>+   long n;</div><div class='add'>+   int sign;</div><div class='add'>+</div><div class='add'>+   s = s0 = get_sign (*sp, smax, &amp;sign);</div><div class='add'>+</div><div class='add'>+   n = 0;</div><div class='add'>+   while (s &lt; smax)</div><div class='add'>+     {</div><div class='add'>+	unsigned char value;</div><div class='add'>+</div><div class='add'>+	value = map [(unsigned char) *s];</div><div class='add'>+	if (value == 0xFF)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	n = base * n + value;</div><div class='add'>+	s++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *sp = s;</div><div class='add'>+   if (s == s0)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   *np = n * sign;</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int parse_int (char **sp, char *smax, int *np,</div><div class='add'>+		      long base, unsigned char map[256])</div><div class='add'>+{</div><div class='add'>+   long n;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   if (1 == (status = parse_long (sp, smax, &amp;n, base, map)))</div><div class='add'>+     *np = (int) n;</div><div class='add'>+   return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_short (char **sp, char *smax, short *np,</div><div class='add'>+			long base, unsigned char map[256])</div><div class='add'>+{</div><div class='add'>+   long n;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   if (1 == (status = parse_long (sp, smax, &amp;n, base, map)))</div><div class='add'>+     *np = (short) n;</div><div class='add'>+   return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_ulong (char **sp, char *smax, unsigned long *np,</div><div class='add'>+			long base, unsigned char map[256])</div><div class='add'>+{</div><div class='add'>+   return parse_long (sp, smax, (long *) np, base, map);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_uint (char **sp, char *smax, unsigned int *np,</div><div class='add'>+		       long base, unsigned char map[256])</div><div class='add'>+{</div><div class='add'>+   return parse_int (sp, smax, (int *) np, base, map);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_ushort (char **sp, char *smax, unsigned short *np,</div><div class='add'>+			 long base, unsigned char map[256])</div><div class='add'>+{</div><div class='add'>+   return parse_short (sp, smax, (short *) np, base, map);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+/* </div><div class='add'>+ * In an ideal world, strtod would be the correct function to use.  However,</div><div class='add'>+ * there may be problems relying on this function because some systems do</div><div class='add'>+ * not support and some that do get it wrong.  So, I will handle the parsing</div><div class='add'>+ * of the string and let atof or strtod handle the arithmetic.</div><div class='add'>+ */</div><div class='add'>+static int parse_double (char **sp, char *smax, double *d)</div><div class='add'>+{</div><div class='add'>+   char *s, *s0;</div><div class='add'>+   int sign;</div><div class='add'>+   int expon;</div><div class='add'>+   unsigned char map[256];</div><div class='add'>+   char buf[128];</div><div class='add'>+   int has_leading_zeros;</div><div class='add'>+   char *start_pos, *sign_pos;</div><div class='add'>+   char *b, *bmax;</div><div class='add'>+</div><div class='add'>+   start_pos = *sp;</div><div class='add'>+   s = get_sign (start_pos, smax, &amp;sign);</div><div class='add'>+   if (s &gt;= smax)</div><div class='add'>+     {</div><div class='add'>+	errno = _SLerrno_errno = EINVAL;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Prepare the buffer that will be passed to strtod */</div><div class='add'>+   /* Allow the exponent to be 5 significant digits: E+xxxxx\0 */</div><div class='add'>+   bmax = buf + (sizeof (buf) - 8);</div><div class='add'>+   buf[0] = '0'; buf[1] = '.';</div><div class='add'>+   b = buf + 2;</div><div class='add'>+</div><div class='add'>+   init_map (map, 10);</div><div class='add'>+</div><div class='add'>+   /* Skip leading 0s */</div><div class='add'>+   s0 = s;</div><div class='add'>+   while ((s &lt; smax) &amp;&amp; (*s == '0'))</div><div class='add'>+     s++;</div><div class='add'>+   has_leading_zeros = (s != s0);</div><div class='add'>+</div><div class='add'>+   expon = 0;</div><div class='add'>+   while (s &lt; smax)</div><div class='add'>+     {</div><div class='add'>+	unsigned char value = map [(unsigned char) *s];</div><div class='add'>+</div><div class='add'>+	if (value == 0xFF)</div><div class='add'>+	  break;</div><div class='add'>+	</div><div class='add'>+	if (b &lt; bmax)</div><div class='add'>+	  *b++ = *s;</div><div class='add'>+	</div><div class='add'>+	expon++;</div><div class='add'>+	s++;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if ((s &lt; smax) &amp;&amp; (*s == '.'))</div><div class='add'>+     {</div><div class='add'>+	s++;</div><div class='add'>+	if (b == buf + 2)	       /* nothing added yet */</div><div class='add'>+	  {</div><div class='add'>+	     while ((s &lt; smax) &amp;&amp; (*s == '0'))</div><div class='add'>+	       {</div><div class='add'>+		  expon--;</div><div class='add'>+		  s++;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	while (s &lt; smax)</div><div class='add'>+	  {</div><div class='add'>+	     unsigned char value = map [(unsigned char) *s];</div><div class='add'>+</div><div class='add'>+	     if (value == 0xFF)</div><div class='add'>+	       break;</div><div class='add'>+	     </div><div class='add'>+	     if (b &lt; bmax)</div><div class='add'>+	       *b++ = *s;</div><div class='add'>+	     s++;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((b == buf + 2)</div><div class='add'>+       &amp;&amp; (has_leading_zeros == 0))</div><div class='add'>+     {</div><div class='add'>+	*sp = start_pos;</div><div class='add'>+	errno = EINVAL;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((s + 1 &lt; smax) &amp;&amp; ((*s == 'E') || (*s == 'e')))</div><div class='add'>+     {</div><div class='add'>+	int e;</div><div class='add'>+	int esign;</div><div class='add'>+</div><div class='add'>+	s0 = s;</div><div class='add'>+	s = get_sign (s + 1, smax, &amp;esign);</div><div class='add'>+	sign_pos = s;</div><div class='add'>+	e = 0;</div><div class='add'>+	while (s &lt; smax)</div><div class='add'>+	  {</div><div class='add'>+	     unsigned char value = map [(unsigned char) *s];</div><div class='add'>+	     if (value == 0xFF)</div><div class='add'>+	       break;</div><div class='add'>+	     if (e &lt; 25000)	       /* avoid overflow if 16 bit */</div><div class='add'>+	       e = 10 * e + value;</div><div class='add'>+	     s++;</div><div class='add'>+	  }</div><div class='add'>+#ifdef ERANGE</div><div class='add'>+	if (e &gt;= 25000)</div><div class='add'>+	  errno = ERANGE;</div><div class='add'>+#endif</div><div class='add'>+	if (s == sign_pos)</div><div class='add'>+	  s = s0;		       /* ...E-X */</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     e = esign * e;</div><div class='add'>+	     expon += e;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (expon != 0)</div><div class='add'>+     sprintf (b, "e%d", expon);</div><div class='add'>+   else</div><div class='add'>+     *b = 0;</div><div class='add'>+   </div><div class='add'>+   *sp = s;</div><div class='add'>+#if HAVE_STRTOD</div><div class='add'>+   *d = sign * strtod (buf, NULL);</div><div class='add'>+#else</div><div class='add'>+   *d = sign * atof (buf);</div><div class='add'>+#endif</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_float (char **sp, char *smax, float *d)</div><div class='add'>+{</div><div class='add'>+   double x;</div><div class='add'>+   if (1 == parse_double (sp, smax, &amp;x))</div><div class='add'>+     {</div><div class='add'>+	*d = (float) x;</div><div class='add'>+	return 1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+#endif				       /* SLANG_HAS_FLOAT */</div><div class='add'>+</div><div class='add'>+static int parse_string (char **sp, char *smax, char **str)</div><div class='add'>+{</div><div class='add'>+   char *s, *s0;</div><div class='add'>+   </div><div class='add'>+   s0 = s = *sp;</div><div class='add'>+   while (s &lt; smax)</div><div class='add'>+     {</div><div class='add'>+	if (isspace (*s))</div><div class='add'>+	  break;</div><div class='add'>+	s++;</div><div class='add'>+     }</div><div class='add'>+   if (NULL == (*str = SLang_create_nslstring (s0, (unsigned int) (s - s0))))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   *sp = s;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_bstring (char **sp, char *smax, char **str)</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+   </div><div class='add'>+   s = *sp;</div><div class='add'>+   if (NULL == (*str = SLang_create_nslstring (s, (unsigned int) (smax - s))))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   *sp = smax;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int parse_range (char **sp, char *smax, char **fp, char **str)</div><div class='add'>+{</div><div class='add'>+   char *s, *s0;</div><div class='add'>+   char *range;</div><div class='add'>+   char *f;</div><div class='add'>+   unsigned char map[256];</div><div class='add'>+   unsigned char reverse;</div><div class='add'>+</div><div class='add'>+   /* How can one represent a range with just '^'?  The naive answer is</div><div class='add'>+    * is [^].  However, this may be interpreted as meaning any character</div><div class='add'>+    * but ']' and others.  Let's assume that the user will not use a range</div><div class='add'>+    * to match '^'.</div><div class='add'>+    */</div><div class='add'>+   f = *fp;</div><div class='add'>+   /* f is a pointer to (one char after) [...]. */</div><div class='add'>+   if (*f == '^')</div><div class='add'>+     {</div><div class='add'>+	f++;</div><div class='add'>+	reverse = 1;</div><div class='add'>+     }</div><div class='add'>+   else reverse = 0;</div><div class='add'>+</div><div class='add'>+   s0 = f;</div><div class='add'>+   if (*f == ']')</div><div class='add'>+     f++;</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	char ch = *f;</div><div class='add'>+</div><div class='add'>+	if (ch == 0)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_INVALID_PARM, "Unexpected end of range in format");</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	if (ch == ']')</div><div class='add'>+	  break;</div><div class='add'>+	f++;</div><div class='add'>+     }</div><div class='add'>+   if (NULL == (range = SLmake_nstring (s0, (unsigned int) (f - s0))))</div><div class='add'>+     return -1;</div><div class='add'>+   *fp = f + 1;			       /* skip ] */</div><div class='add'>+   </div><div class='add'>+   SLmake_lut (map, (unsigned char *) range, reverse);</div><div class='add'>+   SLfree (range);</div><div class='add'>+</div><div class='add'>+   s0 = s = *sp;</div><div class='add'>+   while ((s &lt; smax) &amp;&amp; map [(unsigned char) *s])</div><div class='add'>+     s++;</div><div class='add'>+   </div><div class='add'>+   if (NULL == (*str = SLang_create_nslstring (s0, (unsigned int) (s - s0))))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   *sp = s;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+  </div><div class='add'>+int _SLang_sscanf (void)</div><div class='add'>+{</div><div class='add'>+   int num;</div><div class='add'>+   unsigned int num_refs;</div><div class='add'>+   char *format;</div><div class='add'>+   char *input_string, *input_string_max;</div><div class='add'>+   char *f, *s;</div><div class='add'>+   unsigned char map8[256], map10[256], map16[256];</div><div class='add'>+</div><div class='add'>+   if (SLang_Num_Function_Args &lt; 2)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Int_Type sscanf (str, format, ...)");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   num_refs = (unsigned int) SLang_Num_Function_Args;</div><div class='add'>+   if (-1 == SLreverse_stack (num_refs))</div><div class='add'>+     return -1;</div><div class='add'>+   num_refs -= 2;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_slstring (&amp;input_string))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_slstring (&amp;format))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (input_string);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   f = format;</div><div class='add'>+   s = input_string;</div><div class='add'>+   input_string_max = input_string + strlen (input_string);</div><div class='add'>+</div><div class='add'>+   init_map (map8, 8);</div><div class='add'>+   init_map (map10, 10);</div><div class='add'>+   init_map (map16, 16);</div><div class='add'>+</div><div class='add'>+   num = 0;</div><div class='add'>+</div><div class='add'>+   while (num_refs != 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_Object_Type obj;</div><div class='add'>+	SLang_Ref_Type *ref;</div><div class='add'>+	char *smax;</div><div class='add'>+	unsigned char *map;</div><div class='add'>+	int base;</div><div class='add'>+	int no_assign;</div><div class='add'>+	int is_short;</div><div class='add'>+	int is_long;</div><div class='add'>+	int status;</div><div class='add'>+	char chf;</div><div class='add'>+	unsigned int width;</div><div class='add'>+	int has_width;</div><div class='add'>+</div><div class='add'>+	chf = *f++;</div><div class='add'>+</div><div class='add'>+	if (chf == 0)</div><div class='add'>+	  {</div><div class='add'>+	     /* Hmmm....  what is the most useful thing to do?? */</div><div class='add'>+#if 1</div><div class='add'>+	     break;</div><div class='add'>+#else</div><div class='add'>+	     SLang_verror (SL_INVALID_PARM, "sscanf: format not big enough for output list");</div><div class='add'>+	     goto return_error;</div><div class='add'>+#endif</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (isspace (chf))</div><div class='add'>+	  {</div><div class='add'>+	     s = skip_whitespace (s);</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+	</div><div class='add'>+	if ((chf != '%')</div><div class='add'>+	    || ((chf = *f++) == '%'))</div><div class='add'>+	  {</div><div class='add'>+	     if (*s != chf)</div><div class='add'>+	       break;</div><div class='add'>+	     s++;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	no_assign = 0;</div><div class='add'>+	is_short = 0;</div><div class='add'>+	is_long = 0;</div><div class='add'>+	width = 0;</div><div class='add'>+	smax = input_string_max;</div><div class='add'>+</div><div class='add'>+	/* Look for the flag character */</div><div class='add'>+	if (chf == '*')</div><div class='add'>+	  {</div><div class='add'>+	     no_assign = 1;</div><div class='add'>+	     chf = *f++;</div><div class='add'>+	  }</div><div class='add'>+	</div><div class='add'>+	/* Width */</div><div class='add'>+	has_width = isdigit (chf);</div><div class='add'>+	if (has_width)</div><div class='add'>+	  {</div><div class='add'>+	     f--;</div><div class='add'>+	     (void) parse_uint (&amp;f, f + strlen(f), &amp;width, 10, map10);</div><div class='add'>+	     chf = *f++;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* Now the type modifier */</div><div class='add'>+	switch (chf)</div><div class='add'>+	  {</div><div class='add'>+	   case 'h':</div><div class='add'>+	     is_short = 1;</div><div class='add'>+	     chf = *f++;</div><div class='add'>+	     break;</div><div class='add'>+	     </div><div class='add'>+	   case 'L':		       /* not implemented */</div><div class='add'>+	   case 'l':</div><div class='add'>+	     is_long = 1;</div><div class='add'>+	     chf = *f++;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	status = -1;</div><div class='add'>+</div><div class='add'>+	if ((chf != 'c') &amp;&amp; (chf != '['))</div><div class='add'>+	  s = skip_whitespace (s);</div><div class='add'>+</div><div class='add'>+	if (has_width)</div><div class='add'>+	  {</div><div class='add'>+	     if (width &gt; (unsigned int) (input_string_max - s))</div><div class='add'>+	       width = (unsigned int) (input_string_max - s);</div><div class='add'>+	     smax = s + width;</div><div class='add'>+	  }</div><div class='add'>+	     </div><div class='add'>+	/* Now the format descriptor */</div><div class='add'>+</div><div class='add'>+	map = map10;</div><div class='add'>+	base = 10;</div><div class='add'>+</div><div class='add'>+	try_again:		       /* used by i, x, and o, conversions */</div><div class='add'>+	switch (chf)</div><div class='add'>+	  {</div><div class='add'>+	   case 0:</div><div class='add'>+	     SLang_verror (SL_INVALID_PARM, "sscanf: Unexpected end of format");</div><div class='add'>+	     goto return_error;</div><div class='add'>+	   case 'D':</div><div class='add'>+	     is_long = 1;</div><div class='add'>+	   case 'd':</div><div class='add'>+	     if (is_short)</div><div class='add'>+	       {</div><div class='add'>+		  obj.data_type = SLANG_SHORT_TYPE;</div><div class='add'>+		  status = parse_short (&amp;s, smax, &amp;obj.v.short_val, base, map);</div><div class='add'>+	       }</div><div class='add'>+	     else if (is_long)</div><div class='add'>+	       {</div><div class='add'>+		  obj.data_type = SLANG_LONG_TYPE;</div><div class='add'>+		  status = parse_long (&amp;s, smax, &amp;obj.v.long_val, base, map);</div><div class='add'>+	       }</div><div class='add'>+	     else</div><div class='add'>+	       {</div><div class='add'>+		  obj.data_type = SLANG_INT_TYPE;</div><div class='add'>+		  status = parse_int (&amp;s, smax, &amp;obj.v.int_val, base, map);</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+	     </div><div class='add'>+</div><div class='add'>+	   case 'U':</div><div class='add'>+	     is_long = 1;</div><div class='add'>+	   case 'u':</div><div class='add'>+	     if (is_short)</div><div class='add'>+	       {</div><div class='add'>+		  obj.data_type = SLANG_USHORT_TYPE;</div><div class='add'>+		  status = parse_ushort (&amp;s, smax, &amp;obj.v.ushort_val, base, map);</div><div class='add'>+	       }</div><div class='add'>+	     else if (is_long)</div><div class='add'>+	       {</div><div class='add'>+		  obj.data_type = SLANG_ULONG_TYPE;</div><div class='add'>+		  status = parse_ulong (&amp;s, smax, &amp;obj.v.ulong_val, base, map);</div><div class='add'>+	       }</div><div class='add'>+	     else</div><div class='add'>+	       {</div><div class='add'>+		  obj.data_type = SLANG_INT_TYPE;</div><div class='add'>+		  status = parse_uint (&amp;s, smax, &amp;obj.v.uint_val, base, map);</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 'I':</div><div class='add'>+	     is_long = 1;</div><div class='add'>+	   case 'i':</div><div class='add'>+	     if ((s + 1 &gt;= smax)</div><div class='add'>+		 || (*s != 0))</div><div class='add'>+	       chf = 'd';</div><div class='add'>+	     else if (((s[1] == 'x') || (s[1] == 'X'))</div><div class='add'>+		      &amp;&amp; (s + 2 &lt; smax))</div><div class='add'>+	       {</div><div class='add'>+		  s += 2;</div><div class='add'>+		  chf = 'x';</div><div class='add'>+	       }</div><div class='add'>+	     else chf = 'o';</div><div class='add'>+	     goto try_again;</div><div class='add'>+	     </div><div class='add'>+	   case 'O':</div><div class='add'>+	     is_long = 1;</div><div class='add'>+	   case 'o':</div><div class='add'>+	     map = map8;</div><div class='add'>+	     base = 8;</div><div class='add'>+	     chf = 'd';</div><div class='add'>+	     goto try_again;</div><div class='add'>+	     </div><div class='add'>+	   case 'X':</div><div class='add'>+	     is_long = 1;</div><div class='add'>+	   case 'x':</div><div class='add'>+	     base = 16;</div><div class='add'>+	     map = map16;</div><div class='add'>+	     chf = 'd';</div><div class='add'>+	     goto try_again;</div><div class='add'>+</div><div class='add'>+	   case 'E':</div><div class='add'>+	   case 'F':</div><div class='add'>+	     is_long = 1;</div><div class='add'>+	   case 'e':</div><div class='add'>+	   case 'f':</div><div class='add'>+	   case 'g':</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	     if (is_long)</div><div class='add'>+	       {</div><div class='add'>+		  obj.data_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+		  status = parse_double (&amp;s, smax, &amp;obj.v.double_val);</div><div class='add'>+	       }</div><div class='add'>+	     else</div><div class='add'>+	       {</div><div class='add'>+		  obj.data_type = SLANG_FLOAT_TYPE;</div><div class='add'>+		  status = parse_float (&amp;s, smax, &amp;obj.v.float_val);</div><div class='add'>+	       }</div><div class='add'>+#else</div><div class='add'>+	     SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+			   "This version of the S-Lang does not support floating point");</div><div class='add'>+	     status = -1;</div><div class='add'>+#endif</div><div class='add'>+	     break;</div><div class='add'>+		  </div><div class='add'>+	   case 's':</div><div class='add'>+	     obj.data_type = SLANG_STRING_TYPE;</div><div class='add'>+	     status = parse_string (&amp;s, smax, &amp;obj.v.s_val);</div><div class='add'>+	     break;</div><div class='add'>+	     </div><div class='add'>+	   case 'c':</div><div class='add'>+	     if (has_width == 0)</div><div class='add'>+	       {</div><div class='add'>+		  obj.data_type = SLANG_UCHAR_TYPE;</div><div class='add'>+		  obj.v.uchar_val = *s++;</div><div class='add'>+		  status = 1;</div><div class='add'>+		  break;</div><div class='add'>+	       }</div><div class='add'>+	     obj.data_type = SLANG_STRING_TYPE;</div><div class='add'>+	     status = parse_bstring (&amp;s, smax, &amp;obj.v.s_val);</div><div class='add'>+	     break;</div><div class='add'>+	     </div><div class='add'>+	   case '[':</div><div class='add'>+	     obj.data_type = SLANG_STRING_TYPE;</div><div class='add'>+	     status = parse_range (&amp;s, smax, &amp;f, &amp;obj.v.s_val);</div><div class='add'>+	     break;</div><div class='add'>+	     </div><div class='add'>+	   case 'n':</div><div class='add'>+	     obj.data_type = SLANG_UINT_TYPE;</div><div class='add'>+	     obj.v.uint_val = (unsigned int) (s - input_string);</div><div class='add'>+	     status = 1;</div><div class='add'>+	     break;</div><div class='add'>+	     </div><div class='add'>+	   default:</div><div class='add'>+	     status = -1;</div><div class='add'>+	     SLang_verror (SL_NOT_IMPLEMENTED, "format specifier '%c' is not supported", chf);</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	</div><div class='add'>+	if (status == 0)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	if (status == -1)</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	if (no_assign)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_object (&amp;obj);</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (-1 == SLang_pop_ref (&amp;ref))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_object (&amp;obj);</div><div class='add'>+	     goto return_error;</div><div class='add'>+	  }</div><div class='add'>+	</div><div class='add'>+	if (-1 == SLang_push (&amp;obj))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_object (&amp;obj);</div><div class='add'>+	     SLang_free_ref (ref);</div><div class='add'>+	     goto return_error;</div><div class='add'>+	  }</div><div class='add'>+	</div><div class='add'>+	if (-1 == _SLang_deref_assign (ref))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_ref (ref);</div><div class='add'>+	     goto return_error;</div><div class='add'>+	  }</div><div class='add'>+	SLang_free_ref (ref);</div><div class='add'>+</div><div class='add'>+	num++;</div><div class='add'>+	num_refs--;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == SLdo_pop_n (num_refs))</div><div class='add'>+     goto return_error;</div><div class='add'>+   </div><div class='add'>+   SLang_free_slstring (format);</div><div class='add'>+   SLang_free_slstring (input_string);</div><div class='add'>+   return num;</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   /* NULLS ok */</div><div class='add'>+   SLang_free_slstring (format);</div><div class='add'>+   SLang_free_slstring (input_string);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+   </div><div class='add'>+# if SLANG_HAS_FLOAT</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_STDLIB_H</div><div class='add'>+/* Oh dear.  Where is the prototype for atof?  If not in stdlib, then</div><div class='add'>+ * I do not know where.  Not in math.h on some systems either.</div><div class='add'>+ */</div><div class='add'>+extern double atof ();</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+double _SLang_atof (char *s)</div><div class='add'>+{</div><div class='add'>+   double x;</div><div class='add'>+</div><div class='add'>+   s = skip_whitespace (s);</div><div class='add'>+   errno = 0;</div><div class='add'>+</div><div class='add'>+   if (1 != parse_double (&amp;s, s + strlen (s), &amp;x))</div><div class='add'>+     {</div><div class='add'>+	if ((0 == strcmp ("NaN", s))</div><div class='add'>+	    || (0 == strcmp ("-Inf", s))</div><div class='add'>+	    || (0 == strcmp ("Inf", s)))</div><div class='add'>+	  return atof (s);	       /* let this deal with it */</div><div class='add'>+#ifdef EINVAL</div><div class='add'>+	errno = _SLerrno_errno = EINVAL;</div><div class='add'>+#endif</div><div class='add'>+	return 0.0;</div><div class='add'>+     }</div><div class='add'>+   if (errno) </div><div class='add'>+     _SLerrno_errno = errno;</div><div class='add'>+   return x;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slscroll.c b/mdk-stage1/slang/slscroll.c<br/>new file mode 100644<br/>index 000000000..358296116<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slscroll.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slscroll.c</a></div><div class='hunk'>@@ -0,0 +1,450 @@</div><div class='add'>+/* SLang Scrolling Window Routines */</div><div class='add'>+/* Copyright (c) 1996, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+static void find_window_bottom (SLscroll_Window_Type *win)</div><div class='add'>+{</div><div class='add'>+   unsigned int nrows;</div><div class='add'>+   unsigned int hidden_mask;</div><div class='add'>+   SLscroll_Type *bot, *cline, *last_bot;</div><div class='add'>+   unsigned int row;</div><div class='add'>+</div><div class='add'>+   nrows = win-&gt;nrows;</div><div class='add'>+   hidden_mask = win-&gt;hidden_mask;</div><div class='add'>+   cline = win-&gt;current_line;</div><div class='add'>+</div><div class='add'>+   win-&gt;window_row = row = 0;</div><div class='add'>+   last_bot = bot = win-&gt;top_window_line;</div><div class='add'>+</div><div class='add'>+   while (row &lt; nrows)</div><div class='add'>+     {</div><div class='add'>+	if (bot == cline)</div><div class='add'>+	  win-&gt;window_row = row;</div><div class='add'>+</div><div class='add'>+	last_bot = bot;</div><div class='add'>+</div><div class='add'>+	if (bot == NULL)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	bot = bot-&gt;next;</div><div class='add'>+</div><div class='add'>+	if (hidden_mask)</div><div class='add'>+	  {</div><div class='add'>+	     while ((bot != NULL) &amp;&amp; (bot-&gt;flags &amp; hidden_mask))</div><div class='add'>+	       bot = bot-&gt;next;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	row++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   win-&gt;bot_window_line = last_bot;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int find_top_to_recenter (SLscroll_Window_Type *win)</div><div class='add'>+{</div><div class='add'>+   unsigned int nrows;</div><div class='add'>+   unsigned int hidden_mask;</div><div class='add'>+   SLscroll_Type *prev, *last_prev, *cline;</div><div class='add'>+</div><div class='add'>+   nrows = win-&gt;nrows;</div><div class='add'>+   cline = win-&gt;current_line;</div><div class='add'>+   hidden_mask = win-&gt;hidden_mask;</div><div class='add'>+</div><div class='add'>+   nrows = nrows / 2;</div><div class='add'>+</div><div class='add'>+   last_prev = prev = cline;</div><div class='add'>+</div><div class='add'>+   while (nrows &amp;&amp; (prev != NULL))</div><div class='add'>+     {</div><div class='add'>+	nrows--;</div><div class='add'>+	last_prev = prev;</div><div class='add'>+	do</div><div class='add'>+	  {</div><div class='add'>+	     prev = prev-&gt;prev;</div><div class='add'>+	  }</div><div class='add'>+	while (hidden_mask</div><div class='add'>+	       &amp;&amp; (prev != NULL)</div><div class='add'>+	       &amp;&amp; (prev-&gt;flags &amp; hidden_mask));</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (prev == NULL) prev = last_prev;</div><div class='add'>+</div><div class='add'>+   win-&gt;top_window_line = prev;</div><div class='add'>+   find_window_bottom (win);</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define HAS_BORDER_CODE 1</div><div class='add'>+int SLscroll_find_top (SLscroll_Window_Type *win)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+   SLscroll_Type *cline, *prev, *next;</div><div class='add'>+   SLscroll_Type *top_window_line;</div><div class='add'>+   unsigned int nrows;</div><div class='add'>+   unsigned int hidden_mask;</div><div class='add'>+   int scroll_mode;</div><div class='add'>+   unsigned int border;</div><div class='add'>+</div><div class='add'>+   cline = win-&gt;current_line;</div><div class='add'>+   nrows = win-&gt;nrows;</div><div class='add'>+   scroll_mode = win-&gt;cannot_scroll;</div><div class='add'>+   border = win-&gt;border;</div><div class='add'>+   if (scroll_mode == 2)</div><div class='add'>+     border = 0;</div><div class='add'>+</div><div class='add'>+   if ((cline == NULL) || (nrows &lt;= 1))</div><div class='add'>+     {</div><div class='add'>+	win-&gt;top_window_line = cline;</div><div class='add'>+	find_window_bottom (win);</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   hidden_mask = win-&gt;hidden_mask;</div><div class='add'>+</div><div class='add'>+   /* Note: top_window_line might be a bogus pointer.  This means that I cannot</div><div class='add'>+    * access it unless it really corresponds to a pointer in the buffer.</div><div class='add'>+    */</div><div class='add'>+   top_window_line = win-&gt;top_window_line;</div><div class='add'>+</div><div class='add'>+   if (top_window_line == NULL)</div><div class='add'>+     return find_top_to_recenter (win);</div><div class='add'>+</div><div class='add'>+   /* Chances are that the current line is visible in the window.  This means</div><div class='add'>+    * that the top window line should be above it.</div><div class='add'>+    */</div><div class='add'>+   prev = cline;</div><div class='add'>+</div><div class='add'>+   i = 0;</div><div class='add'>+</div><div class='add'>+   while ((i &lt; nrows) &amp;&amp; (prev != NULL))</div><div class='add'>+     {</div><div class='add'>+	if (prev == top_window_line)</div><div class='add'>+	  {</div><div class='add'>+	     SLscroll_Type *twl = top_window_line;</div><div class='add'>+	     int dir = 0;</div><div class='add'>+</div><div class='add'>+	     if (i &lt; border) dir = -1; else if (i + border &gt;= nrows) dir = 1;</div><div class='add'>+</div><div class='add'>+	     if (dir) while (border)</div><div class='add'>+	       {</div><div class='add'>+		  if (dir &lt; 0) twl = twl-&gt;prev;</div><div class='add'>+		  else twl = twl-&gt;next;</div><div class='add'>+</div><div class='add'>+		  if (twl == NULL)</div><div class='add'>+		    {</div><div class='add'>+		       twl = top_window_line;</div><div class='add'>+		       break;</div><div class='add'>+		    }</div><div class='add'>+		  if ((hidden_mask == 0)</div><div class='add'>+		      || (0 == (twl-&gt;flags &amp; hidden_mask)))</div><div class='add'>+		    border--;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     win-&gt;top_window_line = twl;</div><div class='add'>+	     find_window_bottom (win);</div><div class='add'>+	     return 0;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	do</div><div class='add'>+	  {</div><div class='add'>+	     prev = prev-&gt;prev;</div><div class='add'>+	  }</div><div class='add'>+	while (hidden_mask</div><div class='add'>+	       &amp;&amp; (prev != NULL)</div><div class='add'>+	       &amp;&amp; (prev-&gt;flags &amp; hidden_mask));</div><div class='add'>+	i++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Now check the borders of the window.  Perhaps the current line lies</div><div class='add'>+    * outsider the border by a line.  Only do this if terminal can scroll.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   if (scroll_mode == 1)</div><div class='add'>+     return find_top_to_recenter (win);</div><div class='add'>+   else if (scroll_mode == -1)</div><div class='add'>+     scroll_mode = 0;</div><div class='add'>+</div><div class='add'>+   next = cline-&gt;next;</div><div class='add'>+   while (hidden_mask</div><div class='add'>+	  &amp;&amp; (next != NULL)</div><div class='add'>+	  &amp;&amp; (next-&gt;flags &amp; hidden_mask))</div><div class='add'>+     next = next-&gt;next;</div><div class='add'>+</div><div class='add'>+   if ((next != NULL)</div><div class='add'>+       &amp;&amp; (next == top_window_line))</div><div class='add'>+     {</div><div class='add'>+	/* The current line is one line above the window.  This means user</div><div class='add'>+	 * has moved up past the top of the window.  If scroll_mode is set</div><div class='add'>+	 * to scroll by pages, we need to do a page up.</div><div class='add'>+	 */</div><div class='add'>+</div><div class='add'>+	win-&gt;top_window_line = cline;</div><div class='add'>+	find_window_bottom (win);</div><div class='add'>+</div><div class='add'>+	if (scroll_mode) return SLscroll_pageup (win);</div><div class='add'>+</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   prev = cline-&gt;prev;</div><div class='add'>+</div><div class='add'>+   while (hidden_mask</div><div class='add'>+	  &amp;&amp; (prev != NULL)</div><div class='add'>+	  &amp;&amp; (prev-&gt;flags &amp; hidden_mask))</div><div class='add'>+     prev = prev-&gt;prev;</div><div class='add'>+</div><div class='add'>+   if ((prev == NULL)</div><div class='add'>+       || (prev != win-&gt;bot_window_line))</div><div class='add'>+     return find_top_to_recenter (win);</div><div class='add'>+</div><div class='add'>+   /* It looks like cline is below window by one line.  See what line should</div><div class='add'>+    * be at top to scroll it into view.  Only do this unless we are scrolling</div><div class='add'>+    * by pages.</div><div class='add'>+    */</div><div class='add'>+   if (scroll_mode)</div><div class='add'>+     {</div><div class='add'>+	win-&gt;top_window_line = cline;</div><div class='add'>+	find_window_bottom (win);</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   i = 2;</div><div class='add'>+   while ((i &lt; nrows) &amp;&amp; (prev != NULL))</div><div class='add'>+     {</div><div class='add'>+	do</div><div class='add'>+	  {</div><div class='add'>+	     prev = prev-&gt;prev;</div><div class='add'>+	  }</div><div class='add'>+	while (hidden_mask</div><div class='add'>+	       &amp;&amp; (prev != NULL)</div><div class='add'>+	       &amp;&amp; (prev-&gt;flags &amp; hidden_mask));</div><div class='add'>+	i++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (prev != NULL)</div><div class='add'>+     {</div><div class='add'>+	win-&gt;top_window_line = prev;</div><div class='add'>+	find_window_bottom (win);</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return find_top_to_recenter (win);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLscroll_find_line_num (SLscroll_Window_Type *win)</div><div class='add'>+{</div><div class='add'>+   SLscroll_Type *cline, *l;</div><div class='add'>+   unsigned int n;</div><div class='add'>+   unsigned int hidden_mask;</div><div class='add'>+</div><div class='add'>+   if (win == NULL) return -1;</div><div class='add'>+</div><div class='add'>+   hidden_mask = win-&gt;hidden_mask;</div><div class='add'>+   cline = win-&gt;current_line;</div><div class='add'>+</div><div class='add'>+   n = 1;</div><div class='add'>+</div><div class='add'>+   l = win-&gt;lines;</div><div class='add'>+   while (l != cline)</div><div class='add'>+     {</div><div class='add'>+	if ((hidden_mask == 0)</div><div class='add'>+	    || (0 == (l-&gt;flags &amp; hidden_mask)))</div><div class='add'>+	  n++;</div><div class='add'>+</div><div class='add'>+	l = l-&gt;next;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   win-&gt;line_num = n;</div><div class='add'>+   n--;</div><div class='add'>+</div><div class='add'>+   while (l != NULL)</div><div class='add'>+     {</div><div class='add'>+	if ((hidden_mask == 0)</div><div class='add'>+	    || (0 == (l-&gt;flags &amp; hidden_mask)))</div><div class='add'>+	  n++;</div><div class='add'>+	l = l-&gt;next;</div><div class='add'>+     }</div><div class='add'>+   win-&gt;num_lines = n;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int SLscroll_next_n (SLscroll_Window_Type *win, unsigned int n)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+   unsigned int hidden_mask;</div><div class='add'>+   SLscroll_Type *l, *cline;</div><div class='add'>+</div><div class='add'>+   if ((win == NULL)</div><div class='add'>+       || (NULL == (cline = win-&gt;current_line)))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   hidden_mask = win-&gt;hidden_mask;</div><div class='add'>+   l = cline;</div><div class='add'>+   i = 0;</div><div class='add'>+   while (i &lt; n)</div><div class='add'>+     {</div><div class='add'>+	l = l-&gt;next;</div><div class='add'>+	while (hidden_mask</div><div class='add'>+	       &amp;&amp; (l != NULL) &amp;&amp; (l-&gt;flags &amp; hidden_mask))</div><div class='add'>+	  l = l-&gt;next;</div><div class='add'>+</div><div class='add'>+	if (l == NULL)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	i++;</div><div class='add'>+	cline = l;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   win-&gt;current_line = cline;</div><div class='add'>+   win-&gt;line_num += i;</div><div class='add'>+   return i;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int SLscroll_prev_n (SLscroll_Window_Type *win, unsigned int n)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+   unsigned int hidden_mask;</div><div class='add'>+   SLscroll_Type *l, *cline;</div><div class='add'>+</div><div class='add'>+   if ((win == NULL)</div><div class='add'>+       || (NULL == (cline = win-&gt;current_line)))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   hidden_mask = win-&gt;hidden_mask;</div><div class='add'>+   l = cline;</div><div class='add'>+   i = 0;</div><div class='add'>+   while (i &lt; n)</div><div class='add'>+     {</div><div class='add'>+	l = l-&gt;prev;</div><div class='add'>+	while (hidden_mask</div><div class='add'>+	       &amp;&amp; (l != NULL) &amp;&amp; (l-&gt;flags &amp; hidden_mask))</div><div class='add'>+	  l = l-&gt;prev;</div><div class='add'>+</div><div class='add'>+	if (l == NULL)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	i++;</div><div class='add'>+	cline = l;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   win-&gt;current_line = cline;</div><div class='add'>+   win-&gt;line_num -= i;</div><div class='add'>+   return i;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLscroll_pageup (SLscroll_Window_Type *win)</div><div class='add'>+{</div><div class='add'>+   SLscroll_Type *l, *top;</div><div class='add'>+   unsigned int nrows, hidden_mask;</div><div class='add'>+   unsigned int n;</div><div class='add'>+</div><div class='add'>+   if (win == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   (void) SLscroll_find_top (win);</div><div class='add'>+</div><div class='add'>+   nrows = win-&gt;nrows;</div><div class='add'>+</div><div class='add'>+   if ((NULL != (top = win-&gt;top_window_line))</div><div class='add'>+       &amp;&amp; (nrows &gt; 2))</div><div class='add'>+     {</div><div class='add'>+	n = 0;</div><div class='add'>+	hidden_mask = win-&gt;hidden_mask;</div><div class='add'>+	l = win-&gt;current_line;</div><div class='add'>+	while ((l != NULL) &amp;&amp; (l != top))</div><div class='add'>+	  {</div><div class='add'>+	     l = l-&gt;prev;</div><div class='add'>+	     if ((hidden_mask == 0)</div><div class='add'>+		 || ((l != NULL) &amp;&amp; (0 == (l-&gt;flags &amp; hidden_mask))))</div><div class='add'>+	       n++;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (l != NULL)</div><div class='add'>+	  {</div><div class='add'>+	     unsigned int save_line_num;</div><div class='add'>+	     int ret = 0;</div><div class='add'>+</div><div class='add'>+	     win-&gt;current_line = l;</div><div class='add'>+	     win-&gt;line_num -= n;</div><div class='add'>+</div><div class='add'>+	     /* Compute a new top/bottom header */</div><div class='add'>+	     save_line_num = win-&gt;line_num;</div><div class='add'>+</div><div class='add'>+	     if ((0 == SLscroll_prev_n (win, nrows - 1))</div><div class='add'>+		 &amp;&amp; (n == 0))</div><div class='add'>+	       ret = -1;</div><div class='add'>+</div><div class='add'>+	     win-&gt;top_window_line = win-&gt;current_line;</div><div class='add'>+	     win-&gt;current_line = l;</div><div class='add'>+	     win-&gt;line_num = save_line_num;</div><div class='add'>+</div><div class='add'>+	     find_window_bottom (win);</div><div class='add'>+	     return ret;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (nrows &lt; 2) nrows++;</div><div class='add'>+   if (0 == SLscroll_prev_n (win, nrows - 1))</div><div class='add'>+     return -1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLscroll_pagedown (SLscroll_Window_Type *win)</div><div class='add'>+{</div><div class='add'>+   SLscroll_Type *l, *bot;</div><div class='add'>+   unsigned int nrows, hidden_mask;</div><div class='add'>+   unsigned int n;</div><div class='add'>+</div><div class='add'>+   if (win == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   (void) SLscroll_find_top (win);</div><div class='add'>+</div><div class='add'>+   nrows = win-&gt;nrows;</div><div class='add'>+</div><div class='add'>+   if ((NULL != (bot = win-&gt;bot_window_line))</div><div class='add'>+       &amp;&amp; (nrows &gt; 2))</div><div class='add'>+     {</div><div class='add'>+	n = 0;</div><div class='add'>+	hidden_mask = win-&gt;hidden_mask;</div><div class='add'>+	l = win-&gt;current_line;</div><div class='add'>+	while ((l != NULL) &amp;&amp; (l != bot))</div><div class='add'>+	  {</div><div class='add'>+	     l = l-&gt;next;</div><div class='add'>+	     if ((hidden_mask == 0)</div><div class='add'>+		 || ((l != NULL) &amp;&amp; (0 == (l-&gt;flags &amp; hidden_mask))))</div><div class='add'>+	       n++;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (l != NULL)</div><div class='add'>+	  {</div><div class='add'>+	     win-&gt;current_line = l;</div><div class='add'>+	     win-&gt;top_window_line = l;</div><div class='add'>+	     win-&gt;line_num += n;</div><div class='add'>+</div><div class='add'>+	     find_window_bottom (win);</div><div class='add'>+</div><div class='add'>+	     if (n || (bot != win-&gt;bot_window_line))</div><div class='add'>+	       return 0;</div><div class='add'>+</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (nrows &lt; 2) nrows++;</div><div class='add'>+   if (0 == SLscroll_next_n (win, nrows - 1))</div><div class='add'>+     return -1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slsearch.c b/mdk-stage1/slang/slsearch.c<br/>new file mode 100644<br/>index 000000000..a9a427a7d<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slsearch.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slsearch.c</a></div><div class='hunk'>@@ -0,0 +1,239 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifdef upcase</div><div class='add'>+# undef upcase</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define upcase(ch) (cs ? ch : UPPER_CASE(ch))</div><div class='add'>+</div><div class='add'>+static unsigned char *search_forward (register unsigned char *beg,</div><div class='add'>+				      unsigned char *end,</div><div class='add'>+				      unsigned char *key,</div><div class='add'>+				      register int key_len, int cs, int *ind)</div><div class='add'>+{</div><div class='add'>+   register unsigned char char1;</div><div class='add'>+   unsigned char *pos;</div><div class='add'>+   int j, str_len;</div><div class='add'>+   register unsigned char ch;</div><div class='add'>+   register int db;</div><div class='add'>+</div><div class='add'>+   str_len = (int) (end - beg);</div><div class='add'>+   if (str_len &lt; key_len) return (NULL);</div><div class='add'>+   </div><div class='add'>+   if (key_len == 0)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   char1 = key[key_len - 1];</div><div class='add'>+   beg += (key_len - 1);</div><div class='add'>+</div><div class='add'>+   while(1)</div><div class='add'>+     {</div><div class='add'>+	if (cs) while (beg &lt; end)</div><div class='add'>+	  {</div><div class='add'>+	     ch = *beg;</div><div class='add'>+	     db = ind[(unsigned char) ch];</div><div class='add'>+	     if ((db &lt; key_len) &amp;&amp; (ch == char1)) break;</div><div class='add'>+	     beg += db; /* ind[(unsigned char) ch]; */</div><div class='add'>+	  }</div><div class='add'>+	else while (beg &lt; end)</div><div class='add'>+	  {</div><div class='add'>+	     ch = *beg;</div><div class='add'>+	     db = ind[(unsigned char) ch];</div><div class='add'>+	     if ((db &lt; key_len) &amp;&amp;</div><div class='add'>+		 (UPPER_CASE(ch) == char1)) break;</div><div class='add'>+	     beg += db; /* ind[(unsigned char) ch]; */</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (beg &gt;= end) return(NULL);</div><div class='add'>+</div><div class='add'>+	pos = beg - (key_len - 1);</div><div class='add'>+	for (j = 0; j &lt; key_len; j++)</div><div class='add'>+	  {</div><div class='add'>+	     ch = upcase(pos[j]);</div><div class='add'>+	     if (ch != (unsigned char) key[j]) break;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (j == key_len) return(pos);</div><div class='add'>+	beg += 1;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char *search_backward (unsigned char *beg,unsigned char *end,</div><div class='add'>+				       unsigned char *key, int key_len,</div><div class='add'>+				       int cs, int *ind)</div><div class='add'>+{</div><div class='add'>+   unsigned char ch, char1;</div><div class='add'>+   int j, str_len, ofs;</div><div class='add'>+</div><div class='add'>+    str_len = (int) (end - beg);</div><div class='add'>+    if (str_len &lt; key_len) return (NULL);</div><div class='add'>+   </div><div class='add'>+   if (key_len == 0)</div><div class='add'>+     return NULL;</div><div class='add'>+	</div><div class='add'>+   /*  end -= (key_len - 1); */</div><div class='add'>+   end -= key_len;</div><div class='add'>+</div><div class='add'>+    char1 = key[0];</div><div class='add'>+</div><div class='add'>+    while(1)</div><div class='add'>+      {</div><div class='add'>+	 while ((beg &lt;= end) &amp;&amp; (ch = *end, ch = upcase(ch), ch != char1))</div><div class='add'>+	   {</div><div class='add'>+	      ofs = ind[(unsigned char) ch];</div><div class='add'>+#ifdef __MSDOS__</div><div class='add'>+	      /* This is needed for msdos segment wrapping problems */</div><div class='add'>+	      if (beg + ofs &gt; end) return(NULL);</div><div class='add'>+#endif</div><div class='add'>+	      end -= ofs;</div><div class='add'>+	   }</div><div class='add'>+	 if (beg &gt; end) return(NULL);</div><div class='add'>+	 for (j = 1; j &lt; key_len; j++)</div><div class='add'>+	   {</div><div class='add'>+	      ch = upcase(end[j]);</div><div class='add'>+	      if (ch != key[j]) break;</div><div class='add'>+	   }</div><div class='add'>+	 if (j == key_len) return(end);</div><div class='add'>+	 end--;</div><div class='add'>+      }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned char *SLsearch (unsigned char *pmin, unsigned char *pmax,</div><div class='add'>+			 SLsearch_Type *st)</div><div class='add'>+{</div><div class='add'>+   if (st-&gt;dir &gt; 0) return search_forward (pmin, pmax, st-&gt;key,</div><div class='add'>+					   st-&gt;key_len, st-&gt;cs, st-&gt;ind);</div><div class='add'>+   else return search_backward (pmin, pmax, st-&gt;key,</div><div class='add'>+				st-&gt;key_len, st-&gt;cs, st-&gt;ind);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int Case_Tables_Ok;</div><div class='add'>+</div><div class='add'>+int SLsearch_init (char *str, int dir, int cs, SLsearch_Type *st)</div><div class='add'>+{</div><div class='add'>+   int i, maxi;</div><div class='add'>+   register int max = strlen(str);</div><div class='add'>+   unsigned char *w, *work = st-&gt;key;</div><div class='add'>+   register int *indp, *indpm;</div><div class='add'>+   int *ind = st-&gt;ind;</div><div class='add'>+</div><div class='add'>+   if (max &gt;= (int) sizeof (st-&gt;key))</div><div class='add'>+     {</div><div class='add'>+	SLang_doerror ("Search string too long.");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   st-&gt;dir = dir; st-&gt;cs = cs;</div><div class='add'>+</div><div class='add'>+   if (!Case_Tables_Ok) SLang_init_case_tables ();</div><div class='add'>+</div><div class='add'>+   if (dir &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	w = work;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	maxi = max - 1;</div><div class='add'>+	str = str + maxi;</div><div class='add'>+	w = work + maxi;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* for (i = 0; i &lt; 256; i++) ind[i] = max; */</div><div class='add'>+   indp = ind; indpm = ind + 256;</div><div class='add'>+   while (indp &lt; indpm)</div><div class='add'>+     {</div><div class='add'>+	*indp++ = max;</div><div class='add'>+	*indp++ = max;</div><div class='add'>+	*indp++ = max;</div><div class='add'>+	*indp++ = max;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   i = 0;</div><div class='add'>+   if (cs) while (i &lt; max)</div><div class='add'>+     {</div><div class='add'>+	i++;</div><div class='add'>+	maxi = max - i;</div><div class='add'>+	*w = *str;</div><div class='add'>+	ind[(unsigned char) *str] = maxi;</div><div class='add'>+	str += dir; w += dir;</div><div class='add'>+     }</div><div class='add'>+   else while (i &lt; max)</div><div class='add'>+     {</div><div class='add'>+	i++;</div><div class='add'>+	maxi = max - i;</div><div class='add'>+	*w = UPPER_CASE(*str);</div><div class='add'>+	ind[(unsigned char) *w] = maxi;</div><div class='add'>+	ind[(unsigned char) LOWER_CASE(*str)] = maxi;</div><div class='add'>+	str += dir; w += dir;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   work[max] = 0;</div><div class='add'>+   st-&gt;key_len = max;</div><div class='add'>+   return max;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* 8bit clean upper and lowercase macros */</div><div class='add'>+unsigned char _SLChg_LCase_Lut[256];</div><div class='add'>+unsigned char _SLChg_UCase_Lut[256];</div><div class='add'>+</div><div class='add'>+void SLang_define_case (int *u, int *l)</div><div class='add'>+{</div><div class='add'>+   unsigned char up = (unsigned char) *u, dn = (unsigned char) *l;</div><div class='add'>+</div><div class='add'>+   _SLChg_LCase_Lut[up] = dn;</div><div class='add'>+   _SLChg_LCase_Lut[dn] = dn;</div><div class='add'>+   _SLChg_UCase_Lut[dn] = up;</div><div class='add'>+   _SLChg_UCase_Lut[up] = up;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_init_case_tables (void)</div><div class='add'>+{</div><div class='add'>+   int i, j;</div><div class='add'>+   if (Case_Tables_Ok) return;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; 256; i++)</div><div class='add'>+     {</div><div class='add'>+	_SLChg_UCase_Lut[i] = i;</div><div class='add'>+	_SLChg_LCase_Lut[i] = i;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   for (i = 'A'; i &lt;= 'Z'; i++)</div><div class='add'>+     {</div><div class='add'>+	j = i + 32;</div><div class='add'>+	_SLChg_UCase_Lut[j] = i;</div><div class='add'>+	_SLChg_LCase_Lut[i] = j;</div><div class='add'>+     }</div><div class='add'>+#ifdef PC_SYSTEM</div><div class='add'>+   /* Initialize for DOS code page 437. */</div><div class='add'>+   _SLChg_UCase_Lut[135] = 128; _SLChg_LCase_Lut[128] = 135;</div><div class='add'>+   _SLChg_UCase_Lut[132] = 142; _SLChg_LCase_Lut[142] = 132;</div><div class='add'>+   _SLChg_UCase_Lut[134] = 143; _SLChg_LCase_Lut[143] = 134;</div><div class='add'>+   _SLChg_UCase_Lut[130] = 144; _SLChg_LCase_Lut[144] = 130;</div><div class='add'>+   _SLChg_UCase_Lut[145] = 146; _SLChg_LCase_Lut[146] = 145;</div><div class='add'>+   _SLChg_UCase_Lut[148] = 153; _SLChg_LCase_Lut[153] = 148;</div><div class='add'>+   _SLChg_UCase_Lut[129] = 154; _SLChg_LCase_Lut[154] = 129;</div><div class='add'>+   _SLChg_UCase_Lut[164] = 165; _SLChg_LCase_Lut[165] = 164;</div><div class='add'>+#else</div><div class='add'>+   /* ISO Latin */</div><div class='add'>+   for (i = 192; i &lt;= 221; i++)</div><div class='add'>+     {</div><div class='add'>+	j = i + 32;</div><div class='add'>+	_SLChg_UCase_Lut[j] = i;</div><div class='add'>+	_SLChg_LCase_Lut[i] = j;</div><div class='add'>+     }</div><div class='add'>+   _SLChg_UCase_Lut[215] = 215; _SLChg_LCase_Lut[215] = 215;</div><div class='add'>+   _SLChg_UCase_Lut[223] = 223; _SLChg_LCase_Lut[223] = 223;</div><div class='add'>+   _SLChg_UCase_Lut[247] = 247; _SLChg_LCase_Lut[247] = 247;</div><div class='add'>+   _SLChg_UCase_Lut[255] = 255; _SLChg_LCase_Lut[255] = 255;</div><div class='add'>+#endif</div><div class='add'>+   Case_Tables_Ok = 1;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slsignal.c b/mdk-stage1/slang/slsignal.c<br/>new file mode 100644<br/>index 000000000..30707dea5<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slsignal.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slsignal.c</a></div><div class='hunk'>@@ -0,0 +1,336 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SYS_TYPES_H</div><div class='add'>+# include &lt;sys/types.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SYS_WAIT_H</div><div class='add'>+# include &lt;sys/wait.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/* Do not trust these environments */</div><div class='add'>+#if defined(__CYGWIN32__) || defined(__MINGW32__) || defined(AMIGA)</div><div class='add'>+# ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+#  undef SLANG_POSIX_SIGNALS</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* This function will cause system calls to be restarted after signal if possible */</div><div class='add'>+SLSig_Fun_Type *SLsignal (int sig, SLSig_Fun_Type *f)</div><div class='add'>+{</div><div class='add'>+#if defined(SLANG_POSIX_SIGNALS)</div><div class='add'>+   struct sigaction old_sa, new_sa;</div><div class='add'>+</div><div class='add'>+# ifdef SIGALRM</div><div class='add'>+   /* We want system calls to be interrupted by SIGALRM. */</div><div class='add'>+   if (sig == SIGALRM) return SLsignal_intr (sig, f);</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+   sigemptyset (&amp;new_sa.sa_mask);</div><div class='add'>+   new_sa.sa_handler = f;</div><div class='add'>+</div><div class='add'>+   new_sa.sa_flags = 0;</div><div class='add'>+# ifdef SA_RESTART</div><div class='add'>+   new_sa.sa_flags |= SA_RESTART;</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+   if (-1 == sigaction (sig, &amp;new_sa, &amp;old_sa))</div><div class='add'>+     return (SLSig_Fun_Type *) SIG_ERR;</div><div class='add'>+</div><div class='add'>+   return old_sa.sa_handler;</div><div class='add'>+#else</div><div class='add'>+   /* Not POSIX. */</div><div class='add'>+   return signal (sig, f);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will NOT cause system calls to be restarted after</div><div class='add'>+ * signal if possible</div><div class='add'>+ */</div><div class='add'>+SLSig_Fun_Type *SLsignal_intr (int sig, SLSig_Fun_Type *f)</div><div class='add'>+{</div><div class='add'>+#ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+   struct sigaction old_sa, new_sa;</div><div class='add'>+</div><div class='add'>+   sigemptyset (&amp;new_sa.sa_mask);</div><div class='add'>+   new_sa.sa_handler = f;</div><div class='add'>+</div><div class='add'>+   new_sa.sa_flags = 0;</div><div class='add'>+# ifdef SA_INTERRUPT</div><div class='add'>+   new_sa.sa_flags |= SA_INTERRUPT;</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+   if (-1 == sigaction (sig, &amp;new_sa, &amp;old_sa))</div><div class='add'>+     return (SLSig_Fun_Type *) SIG_ERR;</div><div class='add'>+</div><div class='add'>+   return old_sa.sa_handler;</div><div class='add'>+#else</div><div class='add'>+   /* Not POSIX. */</div><div class='add'>+   return signal (sig, f);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* We are primarily interested in blocking signals that would cause the</div><div class='add'>+ * application to reset the tty.  These include suspend signals and</div><div class='add'>+ * possibly interrupt signals.</div><div class='add'>+ */</div><div class='add'>+#ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+static sigset_t Old_Signal_Mask;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static volatile unsigned int Blocked_Depth;</div><div class='add'>+</div><div class='add'>+int SLsig_block_signals (void)</div><div class='add'>+{</div><div class='add'>+#ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+   sigset_t new_mask;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   Blocked_Depth++;</div><div class='add'>+   if (Blocked_Depth != 1)</div><div class='add'>+     {</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+   sigemptyset (&amp;new_mask);</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+   sigaddset (&amp;new_mask, SIGQUIT);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGTSTP</div><div class='add'>+   sigaddset (&amp;new_mask, SIGTSTP);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+   sigaddset (&amp;new_mask, SIGINT);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGTTIN</div><div class='add'>+   sigaddset (&amp;new_mask, SIGTTIN);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGTTOU</div><div class='add'>+   sigaddset (&amp;new_mask, SIGTTOU);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGWINCH</div><div class='add'>+   sigaddset (&amp;new_mask, SIGWINCH);</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+   (void) sigprocmask (SIG_BLOCK, &amp;new_mask, &amp;Old_Signal_Mask);</div><div class='add'>+   return 0;</div><div class='add'>+#else</div><div class='add'>+   /* Not implemented. */</div><div class='add'>+   return -1;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLsig_unblock_signals (void)</div><div class='add'>+{</div><div class='add'>+   if (Blocked_Depth == 0)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   Blocked_Depth--;</div><div class='add'>+</div><div class='add'>+   if (Blocked_Depth != 0)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+#ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+   (void) sigprocmask (SIG_SETMASK, &amp;Old_Signal_Mask, NULL);</div><div class='add'>+   return 0;</div><div class='add'>+#else</div><div class='add'>+   return -1;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef MSWINDOWS</div><div class='add'>+int SLsystem (char *cmd)</div><div class='add'>+{</div><div class='add'>+   SLang_verror (SL_NOT_IMPLEMENTED, "system not implemented");</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#else</div><div class='add'>+int SLsystem (char *cmd)</div><div class='add'>+{</div><div class='add'>+#ifdef SLANG_POSIX_SIGNALS</div><div class='add'>+   pid_t pid;</div><div class='add'>+   int status;</div><div class='add'>+   struct sigaction ignore;</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+   struct sigaction save_intr;</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+   struct sigaction save_quit;</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGCHLD</div><div class='add'>+   sigset_t child_mask, save_mask;</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+   if (cmd == NULL) return 1;</div><div class='add'>+</div><div class='add'>+   ignore.sa_handler = SIG_IGN;</div><div class='add'>+   sigemptyset (&amp;ignore.sa_mask);</div><div class='add'>+   ignore.sa_flags = 0;</div><div class='add'>+</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+   if (-1 == sigaction (SIGINT, &amp;ignore, &amp;save_intr))</div><div class='add'>+     return -1;</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+   if (-1 == sigaction (SIGQUIT, &amp;ignore, &amp;save_quit))</div><div class='add'>+     {</div><div class='add'>+	(void) sigaction (SIGINT, &amp;save_intr, NULL);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+# ifdef SIGCHLD</div><div class='add'>+   sigemptyset (&amp;child_mask);</div><div class='add'>+   sigaddset (&amp;child_mask, SIGCHLD);</div><div class='add'>+   if (-1 == sigprocmask (SIG_BLOCK, &amp;child_mask, &amp;save_mask))</div><div class='add'>+     {</div><div class='add'>+#  ifdef SIGINT</div><div class='add'>+	(void) sigaction (SIGINT, &amp;save_intr, NULL);</div><div class='add'>+#  endif</div><div class='add'>+#  ifdef SIGQUIT</div><div class='add'>+	(void) sigaction (SIGQUIT, &amp;save_quit, NULL);</div><div class='add'>+#  endif</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+   pid = fork();</div><div class='add'>+</div><div class='add'>+   if (pid == -1)</div><div class='add'>+     status = -1;</div><div class='add'>+   else if (pid == 0)</div><div class='add'>+     {</div><div class='add'>+	/* Child */</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+	(void) sigaction (SIGINT, &amp;save_intr, NULL);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+	(void) sigaction (SIGQUIT, &amp;save_quit, NULL);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGCHLD</div><div class='add'>+	(void) sigprocmask (SIG_SETMASK, &amp;save_mask, NULL);</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+	execl ("/bin/sh", "sh", "-c", cmd, NULL);</div><div class='add'>+	_exit (127);</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	/* parent */</div><div class='add'>+	while (-1 == waitpid (pid, &amp;status, 0))</div><div class='add'>+	  {</div><div class='add'>+# ifdef EINTR</div><div class='add'>+	     if (errno == EINTR)</div><div class='add'>+	       continue;</div><div class='add'>+# endif</div><div class='add'>+# ifdef ERESTARTSYS</div><div class='add'>+	     if (errno == ERESTARTSYS)</div><div class='add'>+	       continue;</div><div class='add'>+# endif</div><div class='add'>+	     status = -1;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+   if (-1 == sigaction (SIGINT, &amp;save_intr, NULL))</div><div class='add'>+     status = -1;</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+   if (-1 == sigaction (SIGQUIT, &amp;save_quit, NULL))</div><div class='add'>+     status = -1;</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGCHLD</div><div class='add'>+   if (-1 == sigprocmask (SIG_SETMASK, &amp;save_mask, NULL))</div><div class='add'>+     status = -1;</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+   return status;</div><div class='add'>+</div><div class='add'>+#else				       /* No POSIX Signals */</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+   void (*sint)(int);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+   void (*squit)(int);</div><div class='add'>+# endif</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+   squit = SLsignal (SIGQUIT, SIG_IGN);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+   sint = SLsignal (SIGINT, SIG_IGN);</div><div class='add'>+# endif</div><div class='add'>+   status = system (cmd);</div><div class='add'>+# ifdef SIGINT</div><div class='add'>+   SLsignal (SIGINT, sint);</div><div class='add'>+# endif</div><div class='add'>+# ifdef SIGQUIT</div><div class='add'>+   SLsignal (SIGQUIT, squit);</div><div class='add'>+# endif</div><div class='add'>+   return status;</div><div class='add'>+#endif				       /* POSIX_SIGNALS */</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+#include &lt;windows.h&gt;</div><div class='add'>+static int msw_system (char *cmd)</div><div class='add'>+{</div><div class='add'>+   STARTUPINFO startup_info;</div><div class='add'>+   PROCESS_INFORMATION process_info;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   if (cmd == NULL) return -1;</div><div class='add'>+</div><div class='add'>+   memset ((char *) &amp;startup_info, 0, sizeof (STARTUPINFO));</div><div class='add'>+   startup_info.cb = sizeof(STARTUPINFO);</div><div class='add'>+   startup_info.dwFlags = STARTF_USESHOWWINDOW;</div><div class='add'>+   startup_info.wShowWindow = SW_SHOWDEFAULT;</div><div class='add'>+</div><div class='add'>+   if (FALSE == CreateProcess (NULL,</div><div class='add'>+			       cmd,</div><div class='add'>+			       NULL,</div><div class='add'>+			       NULL,</div><div class='add'>+			       FALSE,</div><div class='add'>+			       NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,</div><div class='add'>+			       NULL,</div><div class='add'>+			       NULL,</div><div class='add'>+			       &amp;startup_info,</div><div class='add'>+			       &amp;process_info))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (0, "%s: CreateProcess failed.", cmd);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   status = -1;</div><div class='add'>+</div><div class='add'>+   if (0xFFFFFFFFUL != WaitForSingleObject (process_info.hProcess, INFINITE))</div><div class='add'>+     {</div><div class='add'>+	DWORD exit_code;</div><div class='add'>+</div><div class='add'>+	if (TRUE == GetExitCodeProcess (process_info.hProcess, &amp;exit_code))</div><div class='add'>+	  status = (int) exit_code;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   CloseHandle (process_info.hThread);</div><div class='add'>+   CloseHandle (process_info.hProcess);</div><div class='add'>+</div><div class='add'>+   return status;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='head'>diff --git a/mdk-stage1/slang/slsmg.c b/mdk-stage1/slang/slsmg.c<br/>new file mode 100644<br/>index 000000000..088557f27<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slsmg.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slsmg.c</a></div><div class='hunk'>@@ -0,0 +1,1584 @@</div><div class='add'>+/* SLang Screen management routines */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+typedef struct Screen_Type</div><div class='add'>+  {</div><div class='add'>+     int n;                    /* number of chars written last time */</div><div class='add'>+     int flags;                /* line untouched, etc... */</div><div class='add'>+     SLsmg_Char_Type *old, *neew;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+     unsigned long old_hash, new_hash;</div><div class='add'>+#endif</div><div class='add'>+  }</div><div class='add'>+Screen_Type;</div><div class='add'>+</div><div class='add'>+#define TOUCHED 0x1</div><div class='add'>+#define TRASHED 0x2</div><div class='add'>+static int Screen_Trashed;</div><div class='add'>+</div><div class='add'>+#if !defined(__MSDOS_16BIT__)</div><div class='add'>+# define MAX_SCREEN_SIZE 256</div><div class='add'>+#else</div><div class='add'>+# define MAX_SCREEN_SIZE 75</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+Screen_Type SL_Screen[MAX_SCREEN_SIZE];</div><div class='add'>+static int Start_Col, Start_Row;</div><div class='add'>+static int Screen_Cols, Screen_Rows;</div><div class='add'>+static int This_Row, This_Col;</div><div class='add'>+static int This_Color;		       /* only the first 8 bits of this</div><div class='add'>+					* are used.  The highest bit is used</div><div class='add'>+					* to indicate an alternate character</div><div class='add'>+					* set.  This leaves 127 userdefineable</div><div class='add'>+					* color combination.</div><div class='add'>+					*/</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+#define ALT_CHAR_FLAG 0x80</div><div class='add'>+#else</div><div class='add'>+#define ALT_CHAR_FLAG 0x00</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SLTT_HAS_NON_BCE_SUPPORT &amp;&amp; !defined(IBMPC_SYSTEM)</div><div class='add'>+#define REQUIRES_NON_BCE_SUPPORT 1</div><div class='add'>+static int Bce_Color_Offset;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLsmg_Newline_Behavior = 0;</div><div class='add'>+int SLsmg_Backspace_Moves = 0;</div><div class='add'>+/* Backward compatibility. Not used. */</div><div class='add'>+/* int SLsmg_Newline_Moves; */</div><div class='add'>+</div><div class='add'>+static void (*tt_normal_video)(void) = SLtt_normal_video;</div><div class='add'>+static void (*tt_goto_rc)(int, int) = SLtt_goto_rc;</div><div class='add'>+static void (*tt_cls) (void) = SLtt_cls;</div><div class='add'>+static void (*tt_del_eol) (void) = SLtt_del_eol;</div><div class='add'>+static void (*tt_smart_puts) (SLsmg_Char_Type *, SLsmg_Char_Type *, int, int) = SLtt_smart_puts;</div><div class='add'>+static int (*tt_flush_output) (void) = SLtt_flush_output;</div><div class='add'>+static int (*tt_reset_video) (void) = SLtt_reset_video;</div><div class='add'>+static int (*tt_init_video) (void) = SLtt_init_video;</div><div class='add'>+static int *tt_Screen_Rows = &amp;SLtt_Screen_Rows;</div><div class='add'>+static int *tt_Screen_Cols = &amp;SLtt_Screen_Cols;</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+static void (*tt_set_scroll_region)(int, int) = SLtt_set_scroll_region;</div><div class='add'>+static void (*tt_reverse_index)(int) = SLtt_reverse_index;</div><div class='add'>+static void (*tt_reset_scroll_region)(void) = SLtt_reset_scroll_region;</div><div class='add'>+static void (*tt_delete_nlines)(int) = SLtt_delete_nlines;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+static int *tt_Term_Cannot_Scroll = &amp;SLtt_Term_Cannot_Scroll;</div><div class='add'>+static int *tt_Has_Alt_Charset = &amp;SLtt_Has_Alt_Charset;</div><div class='add'>+static char **tt_Graphics_Char_Pairs = &amp;SLtt_Graphics_Char_Pairs;</div><div class='add'>+static int *tt_Use_Blink_For_ACS = &amp;SLtt_Use_Blink_For_ACS;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int Smg_Inited;</div><div class='add'>+</div><div class='add'>+static void blank_line (SLsmg_Char_Type *p, int n, unsigned char ch)</div><div class='add'>+{</div><div class='add'>+   register SLsmg_Char_Type *pmax = p + n;</div><div class='add'>+   register SLsmg_Char_Type color_ch;</div><div class='add'>+</div><div class='add'>+   color_ch = SLSMG_BUILD_CHAR(ch,This_Color);</div><div class='add'>+</div><div class='add'>+   while (p &lt; pmax)</div><div class='add'>+     {</div><div class='add'>+	*p++ = color_ch;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void clear_region (int row, int n)</div><div class='add'>+{</div><div class='add'>+   int i;</div><div class='add'>+   int imax = row + n;</div><div class='add'>+</div><div class='add'>+   if (imax &gt; Screen_Rows) imax = Screen_Rows;</div><div class='add'>+   for (i = row; i &lt; imax; i++)</div><div class='add'>+     {</div><div class='add'>+	if (i &gt;= 0)</div><div class='add'>+	  {</div><div class='add'>+	     blank_line (SL_Screen[i].neew, Screen_Cols, ' ');</div><div class='add'>+	     SL_Screen[i].flags |= TOUCHED;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_erase_eol (void)</div><div class='add'>+{</div><div class='add'>+   int r, c;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   c = This_Col - Start_Col;</div><div class='add'>+   r = This_Row - Start_Row;</div><div class='add'>+</div><div class='add'>+   if ((r &lt; 0) || (r &gt;= Screen_Rows)) return;</div><div class='add'>+   if (c &lt; 0) c = 0; else if (c &gt;= Screen_Cols) return;</div><div class='add'>+   blank_line (SL_Screen[This_Row].neew + c , Screen_Cols - c, ' ');</div><div class='add'>+   SL_Screen[This_Row].flags |= TOUCHED;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void scroll_up (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int i, imax;</div><div class='add'>+   SLsmg_Char_Type *neew;</div><div class='add'>+</div><div class='add'>+   neew = SL_Screen[0].neew;</div><div class='add'>+   imax = Screen_Rows - 1;</div><div class='add'>+   for (i = 0; i &lt; imax; i++)</div><div class='add'>+     {</div><div class='add'>+	SL_Screen[i].neew = SL_Screen[i + 1].neew;</div><div class='add'>+	SL_Screen[i].flags |= TOUCHED;</div><div class='add'>+     }</div><div class='add'>+   SL_Screen[i].neew = neew;</div><div class='add'>+   SL_Screen[i].flags |= TOUCHED;</div><div class='add'>+   blank_line (neew, Screen_Cols, ' ');</div><div class='add'>+   This_Row--;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_gotorc (int r, int c)</div><div class='add'>+{</div><div class='add'>+   This_Row = r;</div><div class='add'>+   This_Col = c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLsmg_get_row (void)</div><div class='add'>+{</div><div class='add'>+   return This_Row;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLsmg_get_column (void)</div><div class='add'>+{</div><div class='add'>+   return This_Col;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_erase_eos (void)</div><div class='add'>+{</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   SLsmg_erase_eol ();</div><div class='add'>+   clear_region (This_Row + 1, Screen_Rows);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int This_Alt_Char;</div><div class='add'>+</div><div class='add'>+void SLsmg_set_char_set (int i)</div><div class='add'>+{</div><div class='add'>+#ifdef IBMPC_SYSTEM</div><div class='add'>+   (void) i;</div><div class='add'>+#else</div><div class='add'>+   if ((tt_Use_Blink_For_ACS != NULL)</div><div class='add'>+       &amp;&amp; (*tt_Use_Blink_For_ACS != 0))</div><div class='add'>+     return;/* alt chars not used and the alt bit</div><div class='add'>+	     * is used to indicate a blink.</div><div class='add'>+	     */</div><div class='add'>+</div><div class='add'>+   if (i) This_Alt_Char = ALT_CHAR_FLAG;</div><div class='add'>+   else This_Alt_Char = 0;</div><div class='add'>+</div><div class='add'>+   This_Color &amp;= 0x7F;</div><div class='add'>+   This_Color |= This_Alt_Char;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_set_color (int color)</div><div class='add'>+{</div><div class='add'>+   if (color &lt; 0) return;</div><div class='add'>+#ifdef REQUIRES_NON_BCE_SUPPORT</div><div class='add'>+   color += Bce_Color_Offset;</div><div class='add'>+#endif</div><div class='add'>+   This_Color = color | This_Alt_Char;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_reverse_video (void)</div><div class='add'>+{</div><div class='add'>+   SLsmg_set_color (1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_normal_video (void)</div><div class='add'>+{</div><div class='add'>+   SLsmg_set_color (0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int point_visible (int col_too)</div><div class='add'>+{</div><div class='add'>+   return ((This_Row &gt;= Start_Row) &amp;&amp; (This_Row &lt; Start_Row + Screen_Rows)</div><div class='add'>+	   &amp;&amp; ((col_too == 0)</div><div class='add'>+	       || ((This_Col &gt;= Start_Col)</div><div class='add'>+		   &amp;&amp; (This_Col &lt; Start_Col + Screen_Cols))));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_write_string (char *str)</div><div class='add'>+{</div><div class='add'>+   SLsmg_write_nchars (str, strlen (str));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_write_nstring (char *str, unsigned int n)</div><div class='add'>+{</div><div class='add'>+   unsigned int width;</div><div class='add'>+   char blank = ' ';</div><div class='add'>+</div><div class='add'>+   /* Avoid a problem if a user accidently passes a negative value */</div><div class='add'>+   if ((int) n &lt; 0)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (str == NULL) width = 0;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	width = strlen (str);</div><div class='add'>+	if (width &gt; n) width = n;</div><div class='add'>+	SLsmg_write_nchars (str, width);</div><div class='add'>+     }</div><div class='add'>+   while (width++ &lt; n) SLsmg_write_nchars (&amp;blank, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_write_wrapped_string (char *s, int r, int c,</div><div class='add'>+				 unsigned int dr, unsigned int dc,</div><div class='add'>+				 int fill)</div><div class='add'>+{</div><div class='add'>+   register char ch, *p;</div><div class='add'>+   int maxc = (int) dc;</div><div class='add'>+</div><div class='add'>+   if ((dr == 0) || (dc == 0)) return;</div><div class='add'>+   p = s;</div><div class='add'>+   dc = 0;</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	ch = *p++;</div><div class='add'>+	if ((ch == 0) || (ch == '\n'))</div><div class='add'>+	  {</div><div class='add'>+	     int diff;</div><div class='add'>+</div><div class='add'>+	     diff = maxc - (int) dc;</div><div class='add'>+</div><div class='add'>+	     SLsmg_gotorc (r, c);</div><div class='add'>+	     SLsmg_write_nchars (s, dc);</div><div class='add'>+	     if (fill &amp;&amp; (diff &gt; 0))</div><div class='add'>+	       {</div><div class='add'>+		  while (diff--) SLsmg_write_char (' ');</div><div class='add'>+	       }</div><div class='add'>+	     if ((ch == 0) || (dr == 1)) break;</div><div class='add'>+</div><div class='add'>+	     r++;</div><div class='add'>+	     dc = 0;</div><div class='add'>+	     dr--;</div><div class='add'>+	     s = p;</div><div class='add'>+	  }</div><div class='add'>+	else if ((int) dc == maxc)</div><div class='add'>+	  {</div><div class='add'>+	     SLsmg_gotorc (r, c);</div><div class='add'>+	     SLsmg_write_nchars (s, dc + 1);</div><div class='add'>+	     if (dr == 1) break;</div><div class='add'>+</div><div class='add'>+	     r++;</div><div class='add'>+	     dc = 0;</div><div class='add'>+	     dr--;</div><div class='add'>+	     s = p;</div><div class='add'>+	  }</div><div class='add'>+	else dc++;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLsmg_Tab_Width = 8;</div><div class='add'>+</div><div class='add'>+/* Minimum value for which eight bit char is displayed as is. */</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+int SLsmg_Display_Eight_Bit = 160;</div><div class='add'>+static unsigned char Alt_Char_Set[129];/* 129th is used as a flag */</div><div class='add'>+#else</div><div class='add'>+int SLsmg_Display_Eight_Bit = 128;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+void SLsmg_write_nchars (char *str, unsigned int n)</div><div class='add'>+{</div><div class='add'>+   register SLsmg_Char_Type *p, old, neew, color;</div><div class='add'>+   unsigned char ch;</div><div class='add'>+   unsigned int flags;</div><div class='add'>+   int len, start_len, max_len;</div><div class='add'>+   char *str_max;</div><div class='add'>+   int newline_flag;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+   int alt_char_set_flag;</div><div class='add'>+</div><div class='add'>+   alt_char_set_flag = ((This_Color &amp; ALT_CHAR_FLAG)</div><div class='add'>+			&amp;&amp; ((tt_Use_Blink_For_ACS == NULL)</div><div class='add'>+			    || (*tt_Use_Blink_For_ACS == 0)));</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   str_max = str + n;</div><div class='add'>+   color = This_Color;</div><div class='add'>+</div><div class='add'>+   top:				       /* get here only on newline */</div><div class='add'>+</div><div class='add'>+   newline_flag = 0;</div><div class='add'>+   start_len = Start_Col;</div><div class='add'>+</div><div class='add'>+   if (point_visible (0) == 0) return;</div><div class='add'>+</div><div class='add'>+   len = This_Col;</div><div class='add'>+   max_len = start_len + Screen_Cols;</div><div class='add'>+</div><div class='add'>+   p = SL_Screen[This_Row - Start_Row].neew;</div><div class='add'>+   if (len &gt; start_len) p += (len - start_len);</div><div class='add'>+</div><div class='add'>+   flags = SL_Screen[This_Row - Start_Row].flags;</div><div class='add'>+   while ((len &lt; max_len) &amp;&amp; (str &lt; str_max))</div><div class='add'>+     {</div><div class='add'>+	ch = (unsigned char) *str++;</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+	if (alt_char_set_flag)</div><div class='add'>+	  ch = Alt_Char_Set [ch &amp; 0x7F];</div><div class='add'>+#endif</div><div class='add'>+	if (((ch &gt;= ' ') &amp;&amp; (ch &lt; 127))</div><div class='add'>+	    || (ch &gt;= (unsigned char) SLsmg_Display_Eight_Bit)</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+	    || alt_char_set_flag</div><div class='add'>+#endif</div><div class='add'>+	    )</div><div class='add'>+	  {</div><div class='add'>+	     len += 1;</div><div class='add'>+	     if (len &gt; start_len)</div><div class='add'>+	       {</div><div class='add'>+		  old = *p;</div><div class='add'>+		  neew = SLSMG_BUILD_CHAR(ch,color);</div><div class='add'>+		  if (old != neew)</div><div class='add'>+		    {</div><div class='add'>+		       flags |= TOUCHED;</div><div class='add'>+		       *p = neew;</div><div class='add'>+		    }</div><div class='add'>+		  p++;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	else if ((ch == '\t') &amp;&amp; (SLsmg_Tab_Width &gt; 0))</div><div class='add'>+	  {</div><div class='add'>+	     n = len;</div><div class='add'>+	     n += SLsmg_Tab_Width;</div><div class='add'>+	     n = SLsmg_Tab_Width - (n % SLsmg_Tab_Width);</div><div class='add'>+	     if ((unsigned int) len + n &gt; (unsigned int) max_len)</div><div class='add'>+	       n = (unsigned int) (max_len - len);</div><div class='add'>+	     neew = SLSMG_BUILD_CHAR(' ',color);</div><div class='add'>+	     while (n--)</div><div class='add'>+	       {</div><div class='add'>+		  len += 1;</div><div class='add'>+		  if (len &gt; start_len)</div><div class='add'>+		    {</div><div class='add'>+		       if (*p != neew)</div><div class='add'>+			 {</div><div class='add'>+			    flags |= TOUCHED;</div><div class='add'>+			    *p = neew;</div><div class='add'>+			 }</div><div class='add'>+		       p++;</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	else if ((ch == '\n')</div><div class='add'>+		 &amp;&amp; (SLsmg_Newline_Behavior != SLSMG_NEWLINE_PRINTABLE))</div><div class='add'>+	  {</div><div class='add'>+	     newline_flag = 1;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	else if ((ch == 0x8) &amp;&amp; SLsmg_Backspace_Moves)</div><div class='add'>+	  {</div><div class='add'>+	     if (len != 0) len--;</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     if (ch &amp; 0x80)</div><div class='add'>+	       {</div><div class='add'>+		  neew = SLSMG_BUILD_CHAR('~',color);</div><div class='add'>+		  len += 1;</div><div class='add'>+		  if (len &gt; start_len)</div><div class='add'>+		    {</div><div class='add'>+		       if (*p != neew)</div><div class='add'>+			 {</div><div class='add'>+			    *p = neew;</div><div class='add'>+			    flags |= TOUCHED;</div><div class='add'>+			 }</div><div class='add'>+		       p++;</div><div class='add'>+		       if (len == max_len) break;</div><div class='add'>+		       ch &amp;= 0x7F;</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     len += 1;</div><div class='add'>+	     if (len &gt; start_len)</div><div class='add'>+	       {</div><div class='add'>+		  neew = SLSMG_BUILD_CHAR('^',color);</div><div class='add'>+		  if (*p != neew)</div><div class='add'>+		    {</div><div class='add'>+		       *p = neew;</div><div class='add'>+		       flags |= TOUCHED;</div><div class='add'>+		    }</div><div class='add'>+		  p++;</div><div class='add'>+		  if (len == max_len) break;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     if (ch == 127) ch = '?'; else ch = ch + '@';</div><div class='add'>+	     len++;</div><div class='add'>+	     if (len &gt; start_len)</div><div class='add'>+	       {</div><div class='add'>+		  neew = SLSMG_BUILD_CHAR(ch,color);</div><div class='add'>+		  if (*p != neew)</div><div class='add'>+		    {</div><div class='add'>+		       *p = neew;</div><div class='add'>+		       flags |= TOUCHED;</div><div class='add'>+		    }</div><div class='add'>+		  p++;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SL_Screen[This_Row - Start_Row].flags = flags;</div><div class='add'>+   This_Col = len;</div><div class='add'>+</div><div class='add'>+   if (SLsmg_Newline_Behavior == 0)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (newline_flag == 0)</div><div class='add'>+     {</div><div class='add'>+	while (str &lt; str_max)</div><div class='add'>+	  {</div><div class='add'>+	     if (*str == '\n') break;</div><div class='add'>+	     str++;</div><div class='add'>+	  }</div><div class='add'>+	if (str == str_max) return;</div><div class='add'>+	str++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   This_Row++;</div><div class='add'>+   This_Col = 0;</div><div class='add'>+   if (This_Row == Start_Row + Screen_Rows)</div><div class='add'>+     {</div><div class='add'>+	if (SLsmg_Newline_Behavior == SLSMG_NEWLINE_SCROLLS) scroll_up ();</div><div class='add'>+     }</div><div class='add'>+   goto top;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_write_char (char ch)</div><div class='add'>+{</div><div class='add'>+   SLsmg_write_nchars (&amp;ch, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int Cls_Flag;</div><div class='add'>+</div><div class='add'>+void SLsmg_cls (void)</div><div class='add'>+{</div><div class='add'>+   int tac;</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   tac = This_Alt_Char; This_Alt_Char = 0;</div><div class='add'>+   SLsmg_set_color (0);</div><div class='add'>+   clear_region (0, Screen_Rows);</div><div class='add'>+   This_Alt_Char = tac;</div><div class='add'>+   SLsmg_set_color (0);</div><div class='add'>+   Cls_Flag = 1;</div><div class='add'>+}</div><div class='add'>+#if 0</div><div class='add'>+static void do_copy (SLsmg_Char_Type *a, SLsmg_Char_Type *b)</div><div class='add'>+{</div><div class='add'>+   SLsmg_Char_Type *amax = a + Screen_Cols;</div><div class='add'>+</div><div class='add'>+   while (a &lt; amax) *a++ = *b++;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+int SLsmg_Scroll_Hash_Border = 0;</div><div class='add'>+static unsigned long compute_hash (SLsmg_Char_Type *s, int n)</div><div class='add'>+{</div><div class='add'>+   register unsigned long h = 0, g;</div><div class='add'>+   register unsigned long sum = 0;</div><div class='add'>+   register SLsmg_Char_Type *smax, ch;</div><div class='add'>+   int is_blank = 2;</div><div class='add'>+</div><div class='add'>+   s += SLsmg_Scroll_Hash_Border;</div><div class='add'>+   smax = s + (n - SLsmg_Scroll_Hash_Border);</div><div class='add'>+   while (s &lt; smax)</div><div class='add'>+     {</div><div class='add'>+	ch = *s++;</div><div class='add'>+	if (is_blank &amp;&amp; (SLSMG_EXTRACT_CHAR(ch) != 32)) is_blank--;</div><div class='add'>+</div><div class='add'>+	sum += ch;</div><div class='add'>+</div><div class='add'>+	h = sum + (h &lt;&lt; 3);</div><div class='add'>+	if ((g = h &amp; 0xE0000000UL) != 0)</div><div class='add'>+	  {</div><div class='add'>+	     h = h ^ (g &gt;&gt; 24);</div><div class='add'>+	     h = h ^ g;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   if (is_blank) return 0;</div><div class='add'>+   return h;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned long Blank_Hash;</div><div class='add'>+</div><div class='add'>+static int try_scroll_down (int rmin, int rmax)</div><div class='add'>+{</div><div class='add'>+   int i, r1, r2, di, j;</div><div class='add'>+   unsigned long hash;</div><div class='add'>+   int did_scroll;</div><div class='add'>+   int color;</div><div class='add'>+   SLsmg_Char_Type *tmp;</div><div class='add'>+   int ignore;</div><div class='add'>+</div><div class='add'>+   did_scroll = 0;</div><div class='add'>+   for (i = rmax; i &gt; rmin; i--)</div><div class='add'>+     {</div><div class='add'>+	hash = SL_Screen[i].new_hash;</div><div class='add'>+	if (hash == Blank_Hash) continue;</div><div class='add'>+</div><div class='add'>+	if ((hash == SL_Screen[i].old_hash)</div><div class='add'>+#if 0</div><div class='add'>+	    || ((i + 1 &lt; Screen_Rows) &amp;&amp; (hash == SL_Screen[i + 1].old_hash))</div><div class='add'>+	    || ((i - 1 &gt; rmin) &amp;&amp; (SL_Screen[i].old_hash == SL_Screen[i - 1].new_hash))</div><div class='add'>+#endif</div><div class='add'>+	    )</div><div class='add'>+	  continue;</div><div class='add'>+</div><div class='add'>+	for (j = i - 1; j &gt;= rmin; j--)</div><div class='add'>+	  {</div><div class='add'>+	     if (hash == SL_Screen[j].old_hash) break;</div><div class='add'>+	  }</div><div class='add'>+	if (j &lt; rmin) continue;</div><div class='add'>+</div><div class='add'>+	r2 = i;			       /* end scroll region */</div><div class='add'>+</div><div class='add'>+	di = i - j;</div><div class='add'>+	j--;</div><div class='add'>+	ignore = 0;</div><div class='add'>+	while ((j &gt;= rmin) &amp;&amp; (SL_Screen[j].old_hash == SL_Screen[j + di].new_hash))</div><div class='add'>+	  {</div><div class='add'>+	     if (SL_Screen[j].old_hash == Blank_Hash) ignore++;</div><div class='add'>+	     j--;</div><div class='add'>+	  }</div><div class='add'>+	r1 = j + 1;</div><div class='add'>+</div><div class='add'>+	/* If this scroll only scrolls this line into place, don't do it.</div><div class='add'>+	 */</div><div class='add'>+	if ((di &gt; 1) &amp;&amp; (r1 + di + ignore == r2)) continue;</div><div class='add'>+</div><div class='add'>+	/* If there is anything in the scrolling region that is ok, abort the</div><div class='add'>+	 * scroll.</div><div class='add'>+	 */</div><div class='add'>+</div><div class='add'>+	for (j = r1; j &lt;= r2; j++)</div><div class='add'>+	  {</div><div class='add'>+	     if ((SL_Screen[j].old_hash != Blank_Hash)</div><div class='add'>+		 &amp;&amp; (SL_Screen[j].old_hash == SL_Screen[j].new_hash))</div><div class='add'>+	       {</div><div class='add'>+		  /* See if the scroll is happens to scroll this one into place. */</div><div class='add'>+		  if ((j + di &gt; r2) || (SL_Screen[j].old_hash != SL_Screen[j + di].new_hash))</div><div class='add'>+		    break;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	if (j &lt;= r2) continue;</div><div class='add'>+</div><div class='add'>+	color = This_Color;  This_Color = 0;</div><div class='add'>+	did_scroll = 1;</div><div class='add'>+	(*tt_normal_video) ();</div><div class='add'>+	(*tt_set_scroll_region) (r1, r2);</div><div class='add'>+	(*tt_goto_rc) (0, 0);</div><div class='add'>+	(*tt_reverse_index) (di);</div><div class='add'>+	(*tt_reset_scroll_region) ();</div><div class='add'>+	/* Now we have a hole in the screen.</div><div class='add'>+	 * Make the virtual screen look like it.</div><div class='add'>+	 * </div><div class='add'>+	 * Note that if the terminal does not support BCE, then we have</div><div class='add'>+	 * no idea what color the hole is.  So, for this case, we do not</div><div class='add'>+	 * want to add Bce_Color_Offset to This_Color since if Bce_Color_Offset</div><div class='add'>+	 * is non-zero, then This_Color = 0 does not match any valid color</div><div class='add'>+	 * obtained by adding Bce_Color_Offset.</div><div class='add'>+	 */</div><div class='add'>+	for (j = r1; j &lt;= r2; j++) SL_Screen[j].flags = TOUCHED;</div><div class='add'>+</div><div class='add'>+	while (di--)</div><div class='add'>+	  {</div><div class='add'>+	     tmp = SL_Screen[r2].old;</div><div class='add'>+	     for (j = r2; j &gt; r1; j--)</div><div class='add'>+	       {</div><div class='add'>+		  SL_Screen[j].old = SL_Screen[j - 1].old;</div><div class='add'>+		  SL_Screen[j].old_hash = SL_Screen[j - 1].old_hash;</div><div class='add'>+	       }</div><div class='add'>+	     SL_Screen[r1].old = tmp;</div><div class='add'>+	     blank_line (SL_Screen[r1].old, Screen_Cols, ' ');</div><div class='add'>+	     SL_Screen[r1].old_hash = Blank_Hash;</div><div class='add'>+	     r1++;</div><div class='add'>+	  }</div><div class='add'>+	This_Color = color;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return did_scroll;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int try_scroll_up (int rmin, int rmax)</div><div class='add'>+{</div><div class='add'>+   int i, r1, r2, di, j;</div><div class='add'>+   unsigned long hash;</div><div class='add'>+   int did_scroll;</div><div class='add'>+   int color;</div><div class='add'>+   SLsmg_Char_Type *tmp;</div><div class='add'>+   int ignore;</div><div class='add'>+</div><div class='add'>+   did_scroll = 0;</div><div class='add'>+   for (i = rmin; i &lt; rmax; i++)</div><div class='add'>+     {</div><div class='add'>+	hash = SL_Screen[i].new_hash;</div><div class='add'>+	if (hash == Blank_Hash) continue;</div><div class='add'>+	if (hash == SL_Screen[i].old_hash)</div><div class='add'>+	  continue;</div><div class='add'>+	/* find a match further down screen */</div><div class='add'>+	for (j = i + 1; j &lt;= rmax; j++)</div><div class='add'>+	  {</div><div class='add'>+	     if (hash == SL_Screen[j].old_hash) break;</div><div class='add'>+	  }</div><div class='add'>+	if (j &gt; rmax) continue;</div><div class='add'>+</div><div class='add'>+	r1 = i;			       /* beg scroll region */</div><div class='add'>+	di = j - i;		       /* number of lines to scroll */</div><div class='add'>+	j++;			       /* since we know this is a match */</div><div class='add'>+</div><div class='add'>+	/* find end of scroll region */</div><div class='add'>+	ignore = 0;</div><div class='add'>+	while ((j &lt;= rmax) &amp;&amp; (SL_Screen[j].old_hash == SL_Screen[j - di].new_hash))</div><div class='add'>+	  {</div><div class='add'>+	     if (SL_Screen[j].old_hash == Blank_Hash) ignore++;</div><div class='add'>+	     j++;</div><div class='add'>+	  }</div><div class='add'>+	r2 = j - 1;		       /* end of scroll region */</div><div class='add'>+</div><div class='add'>+	/* If this scroll only scrolls this line into place, don't do it.</div><div class='add'>+	 */</div><div class='add'>+	if ((di &gt; 1) &amp;&amp; (r1 + di + ignore == r2)) continue;</div><div class='add'>+</div><div class='add'>+	/* If there is anything in the scrolling region that is ok, abort the</div><div class='add'>+	 * scroll.</div><div class='add'>+	 */</div><div class='add'>+</div><div class='add'>+	for (j = r1; j &lt;= r2; j++)</div><div class='add'>+	  {</div><div class='add'>+	     if ((SL_Screen[j].old_hash != Blank_Hash)</div><div class='add'>+		 &amp;&amp; (SL_Screen[j].old_hash == SL_Screen[j].new_hash))</div><div class='add'>+	       {</div><div class='add'>+		  if ((j - di &lt; r1) || (SL_Screen[j].old_hash != SL_Screen[j - di].new_hash))</div><div class='add'>+		    break;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	  }</div><div class='add'>+	if (j &lt;= r2) continue;</div><div class='add'>+</div><div class='add'>+	did_scroll = 1;</div><div class='add'>+</div><div class='add'>+	/* See the above comments about BCE */</div><div class='add'>+	color = This_Color;  This_Color = 0;</div><div class='add'>+	(*tt_normal_video) ();</div><div class='add'>+	(*tt_set_scroll_region) (r1, r2);</div><div class='add'>+	(*tt_goto_rc) (0, 0);	       /* relative to scroll region */</div><div class='add'>+	(*tt_delete_nlines) (di);</div><div class='add'>+	(*tt_reset_scroll_region) ();</div><div class='add'>+	/* Now we have a hole in the screen.  Make the virtual screen look</div><div class='add'>+	 * like it.</div><div class='add'>+	 */</div><div class='add'>+	for (j = r1; j &lt;= r2; j++) SL_Screen[j].flags = TOUCHED;</div><div class='add'>+</div><div class='add'>+	while (di--)</div><div class='add'>+	  {</div><div class='add'>+	     tmp = SL_Screen[r1].old;</div><div class='add'>+	     for (j = r1; j &lt; r2; j++)</div><div class='add'>+	       {</div><div class='add'>+		  SL_Screen[j].old = SL_Screen[j + 1].old;</div><div class='add'>+		  SL_Screen[j].old_hash = SL_Screen[j + 1].old_hash;</div><div class='add'>+	       }</div><div class='add'>+	     SL_Screen[r2].old = tmp;</div><div class='add'>+	     blank_line (SL_Screen[r2].old, Screen_Cols, ' ');</div><div class='add'>+	     SL_Screen[r2].old_hash = Blank_Hash;</div><div class='add'>+	     r2--;</div><div class='add'>+	  }</div><div class='add'>+	This_Color = color;</div><div class='add'>+     }</div><div class='add'>+   return did_scroll;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void try_scroll (void)</div><div class='add'>+{</div><div class='add'>+   int r1, rmin, rmax;</div><div class='add'>+   int num_up, num_down;</div><div class='add'>+   /* find region limits. */</div><div class='add'>+</div><div class='add'>+   for (rmax = Screen_Rows - 1; rmax &gt; 0; rmax--)</div><div class='add'>+     {</div><div class='add'>+	if (SL_Screen[rmax].new_hash != SL_Screen[rmax].old_hash)</div><div class='add'>+	  {</div><div class='add'>+	     r1 = rmax - 1;</div><div class='add'>+	     if ((r1 == 0)</div><div class='add'>+		 || (SL_Screen[r1].new_hash != SL_Screen[r1].old_hash))</div><div class='add'>+	       break;</div><div class='add'>+</div><div class='add'>+	     rmax = r1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   for (rmin = 0; rmin &lt; rmax; rmin++)</div><div class='add'>+     {</div><div class='add'>+	if (SL_Screen[rmin].new_hash != SL_Screen[rmin].old_hash)</div><div class='add'>+	  {</div><div class='add'>+	     r1 = rmin + 1;</div><div class='add'>+	     if ((r1 == rmax)</div><div class='add'>+		 || (SL_Screen[r1].new_hash != SL_Screen[r1].old_hash))</div><div class='add'>+	       break;</div><div class='add'>+</div><div class='add'>+	     rmin = r1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Below, we have two scrolling algorithms.  The first has the effect of</div><div class='add'>+    * scrolling lines down.  This is usually appropriate when one moves</div><div class='add'>+    * up the display, e.g., with the UP arrow.  The second algorithm is</div><div class='add'>+    * appropriate for going the other way.  It is important to choose the</div><div class='add'>+    * correct one.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   num_up = 0;</div><div class='add'>+   for (r1 = rmin; r1 &lt; rmax; r1++)</div><div class='add'>+     {</div><div class='add'>+	if (SL_Screen[r1].new_hash == SL_Screen[r1 + 1].old_hash)</div><div class='add'>+	  num_up++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   num_down = 0;</div><div class='add'>+   for (r1 = rmax; r1 &gt; rmin; r1--)</div><div class='add'>+     {</div><div class='add'>+	if (SL_Screen[r1 - 1].old_hash == SL_Screen[r1].new_hash)</div><div class='add'>+	  num_down++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (num_up &gt; num_down)</div><div class='add'>+     {</div><div class='add'>+	if (try_scroll_up (rmin, rmax))</div><div class='add'>+	  return;</div><div class='add'>+</div><div class='add'>+	(void) try_scroll_down (rmin, rmax);</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	if (try_scroll_down (rmin, rmax))</div><div class='add'>+	  return;</div><div class='add'>+</div><div class='add'>+	(void) try_scroll_up (rmin, rmax);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+#endif   /* NOT IBMPC_SYSTEM */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#ifdef REQUIRES_NON_BCE_SUPPORT</div><div class='add'>+static void adjust_colors (void)</div><div class='add'>+{</div><div class='add'>+   int bce;</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   bce = Bce_Color_Offset;</div><div class='add'>+   Bce_Color_Offset = _SLtt_get_bce_color_offset ();</div><div class='add'>+   if (bce == Bce_Color_Offset)</div><div class='add'>+     return;</div><div class='add'>+   </div><div class='add'>+  if ((tt_Use_Blink_For_ACS != NULL)</div><div class='add'>+       &amp;&amp; (*tt_Use_Blink_For_ACS != 0))</div><div class='add'>+     return;			       /* this mode does not support non-BCE</div><div class='add'>+					* terminals.</div><div class='add'>+					*/</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; Screen_Rows; i++)</div><div class='add'>+     {</div><div class='add'>+	SLsmg_Char_Type *s, *smax;</div><div class='add'>+</div><div class='add'>+	SL_Screen[i].flags |= TRASHED;</div><div class='add'>+	s = SL_Screen[i].neew;</div><div class='add'>+	smax = s + Screen_Cols;</div><div class='add'>+	</div><div class='add'>+	while (s &lt; smax)</div><div class='add'>+	  {</div><div class='add'>+	     int color = (int) SLSMG_EXTRACT_COLOR(*s);</div><div class='add'>+	     int acs;</div><div class='add'>+</div><div class='add'>+	     if (color &lt; 0)</div><div class='add'>+	       {</div><div class='add'>+		  s++;</div><div class='add'>+		  continue;</div><div class='add'>+	       }</div><div class='add'>+	     </div><div class='add'>+	     acs = color &amp; 0x80;</div><div class='add'>+	     color = (color &amp; 0x7F) - bce;</div><div class='add'>+	     color += Bce_Color_Offset;</div><div class='add'>+	     if (color &gt;= 0)</div><div class='add'>+	       {</div><div class='add'>+		  unsigned char ch = SLSMG_EXTRACT_CHAR(*s);</div><div class='add'>+		  *s = SLSMG_BUILD_CHAR(ch, ((color&amp;0x7F)|acs));</div><div class='add'>+	       }</div><div class='add'>+	     s++;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+void SLsmg_refresh (void)</div><div class='add'>+{</div><div class='add'>+   int i;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+   int trashed = 0;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+   </div><div class='add'>+   if (Screen_Trashed)</div><div class='add'>+     {</div><div class='add'>+	Cls_Flag = 1;</div><div class='add'>+	for (i = 0; i &lt; Screen_Rows; i++)</div><div class='add'>+	  SL_Screen[i].flags |= TRASHED;</div><div class='add'>+#ifdef REQUIRES_NON_BCE_SUPPORT</div><div class='add'>+	adjust_colors ();</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+   for (i = 0; i &lt; Screen_Rows; i++)</div><div class='add'>+     {</div><div class='add'>+	if (SL_Screen[i].flags == 0) continue;</div><div class='add'>+	SL_Screen[i].new_hash = compute_hash (SL_Screen[i].neew, Screen_Cols);</div><div class='add'>+	trashed = 1;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (Cls_Flag)</div><div class='add'>+     {</div><div class='add'>+	(*tt_normal_video) ();  (*tt_cls) ();</div><div class='add'>+     }</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+   else if (trashed &amp;&amp; (*tt_Term_Cannot_Scroll == 0)) try_scroll ();</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; Screen_Rows; i++)</div><div class='add'>+     {</div><div class='add'>+	if (SL_Screen[i].flags == 0) continue;</div><div class='add'>+</div><div class='add'>+	if (Cls_Flag || SL_Screen[i].flags &amp; TRASHED)</div><div class='add'>+	  {</div><div class='add'>+	     int color = This_Color;</div><div class='add'>+</div><div class='add'>+	     if (Cls_Flag == 0) </div><div class='add'>+	       {</div><div class='add'>+		  (*tt_goto_rc) (i, 0);</div><div class='add'>+		  (*tt_del_eol) ();</div><div class='add'>+	       }</div><div class='add'>+	     This_Color = 0;</div><div class='add'>+	     blank_line (SL_Screen[i].old, Screen_Cols, ' ');</div><div class='add'>+	     This_Color = color;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	SL_Screen[i].old[Screen_Cols] = 0;</div><div class='add'>+	SL_Screen[i].neew[Screen_Cols] = 0;</div><div class='add'>+</div><div class='add'>+	(*tt_smart_puts) (SL_Screen[i].neew, SL_Screen[i].old, Screen_Cols, i);</div><div class='add'>+</div><div class='add'>+	SLMEMCPY ((char *) SL_Screen[i].old, (char *) SL_Screen[i].neew,</div><div class='add'>+		  Screen_Cols * sizeof (SLsmg_Char_Type));</div><div class='add'>+</div><div class='add'>+	SL_Screen[i].flags = 0;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+	SL_Screen[i].old_hash = SL_Screen[i].new_hash;</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (point_visible (1)) (*tt_goto_rc) (This_Row - Start_Row, This_Col - Start_Col);</div><div class='add'>+   (*tt_flush_output) ();</div><div class='add'>+   Cls_Flag = 0;</div><div class='add'>+   Screen_Trashed = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int compute_clip (int row, int n, int box_start, int box_end,</div><div class='add'>+			 int *rmin, int *rmax)</div><div class='add'>+{</div><div class='add'>+   int row_max;</div><div class='add'>+</div><div class='add'>+   if (n &lt; 0) return 0;</div><div class='add'>+   if (row &gt;= box_end) return 0;</div><div class='add'>+   row_max = row + n;</div><div class='add'>+   if (row_max &lt;= box_start) return 0;</div><div class='add'>+</div><div class='add'>+   if (row &lt; box_start) row = box_start;</div><div class='add'>+   if (row_max &gt;= box_end) row_max = box_end;</div><div class='add'>+   *rmin = row;</div><div class='add'>+   *rmax = row_max;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_touch_lines (int row, unsigned int n)</div><div class='add'>+{</div><div class='add'>+   int i;</div><div class='add'>+   int r1, r2;</div><div class='add'>+</div><div class='add'>+   /* Allow this function to be called even when we are not initialied.</div><div class='add'>+    * Calling this function is useful after calling SLtt_set_color</div><div class='add'>+    * to force the display to be redrawn</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (0 == compute_clip (row, (int) n, Start_Row, Start_Row + Screen_Rows, &amp;r1, &amp;r2))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   r1 -= Start_Row;</div><div class='add'>+   r2 -= Start_Row;</div><div class='add'>+   for (i = r1; i &lt; r2; i++)</div><div class='add'>+     {</div><div class='add'>+	SL_Screen[i].flags |= TRASHED;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_touch_screen (void)</div><div class='add'>+{</div><div class='add'>+   Screen_Trashed = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+			  </div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+static char Fake_Alt_Char_Pairs [] = "a:j+k+l+m+q-t+u+v+w+x|n+`+f\\g#~o,&lt;+&gt;.v-^h#0#";</div><div class='add'>+</div><div class='add'>+static void init_alt_char_set (void)</div><div class='add'>+{</div><div class='add'>+   int i;</div><div class='add'>+   unsigned char *p, *pmax, ch;</div><div class='add'>+</div><div class='add'>+   if (Alt_Char_Set[128] == 128) return;</div><div class='add'>+</div><div class='add'>+   i = 32;</div><div class='add'>+   memset ((char *)Alt_Char_Set, ' ', i);</div><div class='add'>+   while (i &lt;= 128)</div><div class='add'>+     {</div><div class='add'>+	Alt_Char_Set [i] = i;</div><div class='add'>+	i++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Map to VT100 */</div><div class='add'>+   if (*tt_Has_Alt_Charset)</div><div class='add'>+     {</div><div class='add'>+	if (tt_Graphics_Char_Pairs == NULL) p = NULL;</div><div class='add'>+	else p = (unsigned char *) *tt_Graphics_Char_Pairs;</div><div class='add'>+	if (p == NULL) return;</div><div class='add'>+     }</div><div class='add'>+   else	p = (unsigned char *) Fake_Alt_Char_Pairs;</div><div class='add'>+   pmax = p + strlen ((char *) p);</div><div class='add'>+</div><div class='add'>+   /* Some systems have messed up entries for this */</div><div class='add'>+   while (p &lt; pmax)</div><div class='add'>+     {</div><div class='add'>+	ch = *p++;</div><div class='add'>+	ch &amp;= 0x7F;		       /* should be unnecessary */</div><div class='add'>+	Alt_Char_Set [ch] = *p;</div><div class='add'>+	p++;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+# define BLOCK_SIGNALS SLsig_block_signals ()</div><div class='add'>+# define UNBLOCK_SIGNALS SLsig_unblock_signals ()</div><div class='add'>+#else</div><div class='add'>+# define BLOCK_SIGNALS (void)0</div><div class='add'>+# define UNBLOCK_SIGNALS (void)0</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int Smg_Suspended;</div><div class='add'>+int SLsmg_suspend_smg (void)</div><div class='add'>+{</div><div class='add'>+   BLOCK_SIGNALS;</div><div class='add'>+</div><div class='add'>+   if (Smg_Suspended == 0)</div><div class='add'>+     {</div><div class='add'>+	(*tt_reset_video) ();</div><div class='add'>+	Smg_Suspended = 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   UNBLOCK_SIGNALS;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLsmg_resume_smg (void)</div><div class='add'>+{</div><div class='add'>+   BLOCK_SIGNALS;</div><div class='add'>+</div><div class='add'>+   if (Smg_Suspended == 0)</div><div class='add'>+     {</div><div class='add'>+	UNBLOCK_SIGNALS;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Smg_Suspended = 0;</div><div class='add'>+</div><div class='add'>+   if (-1 == (*tt_init_video) ())</div><div class='add'>+     {</div><div class='add'>+	UNBLOCK_SIGNALS;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Cls_Flag = 1;</div><div class='add'>+   SLsmg_touch_screen ();</div><div class='add'>+   SLsmg_refresh ();</div><div class='add'>+</div><div class='add'>+   UNBLOCK_SIGNALS;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+   </div><div class='add'>+static void reset_smg (void)</div><div class='add'>+{</div><div class='add'>+   int i;</div><div class='add'>+   if (Smg_Inited == 0)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; Screen_Rows; i++)</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *)SL_Screen[i].old);</div><div class='add'>+	SLfree ((char *)SL_Screen[i].neew);</div><div class='add'>+	SL_Screen[i].old = SL_Screen[i].neew = NULL;</div><div class='add'>+     }</div><div class='add'>+   This_Alt_Char = This_Color = 0;</div><div class='add'>+   Smg_Inited = 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int init_smg (void)</div><div class='add'>+{</div><div class='add'>+   int i, len;</div><div class='add'>+   SLsmg_Char_Type *old, *neew;</div><div class='add'>+</div><div class='add'>+   Smg_Inited = 0;</div><div class='add'>+</div><div class='add'>+#ifdef REQUIRES_NON_BCE_SUPPORT</div><div class='add'>+   Bce_Color_Offset = _SLtt_get_bce_color_offset ();</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   Screen_Rows = *tt_Screen_Rows;</div><div class='add'>+   if (Screen_Rows &gt; MAX_SCREEN_SIZE)</div><div class='add'>+     Screen_Rows = MAX_SCREEN_SIZE;</div><div class='add'>+</div><div class='add'>+   Screen_Cols = *tt_Screen_Cols;</div><div class='add'>+</div><div class='add'>+   This_Col = This_Row = Start_Col = Start_Row = 0;</div><div class='add'>+</div><div class='add'>+   This_Alt_Char = 0;</div><div class='add'>+   SLsmg_set_color (0);</div><div class='add'>+   Cls_Flag = 1;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+   init_alt_char_set ();</div><div class='add'>+#endif</div><div class='add'>+   len = Screen_Cols + 3;</div><div class='add'>+   for (i = 0; i &lt; Screen_Rows; i++)</div><div class='add'>+     {</div><div class='add'>+	if ((NULL == (old = (SLsmg_Char_Type *) SLmalloc (sizeof(SLsmg_Char_Type) * len)))</div><div class='add'>+	    || ((NULL == (neew = (SLsmg_Char_Type *) SLmalloc (sizeof(SLsmg_Char_Type) * len)))))</div><div class='add'>+	  {</div><div class='add'>+	     SLfree ((char *) old);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	blank_line (old, len, ' ');</div><div class='add'>+	blank_line (neew, len, ' ');</div><div class='add'>+	SL_Screen[i].old = old;</div><div class='add'>+	SL_Screen[i].neew = neew;</div><div class='add'>+	SL_Screen[i].flags = 0;</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+	Blank_Hash = compute_hash (old, Screen_Cols);</div><div class='add'>+	SL_Screen[i].new_hash = SL_Screen[i].old_hash =  Blank_Hash;</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   _SLtt_color_changed_hook = SLsmg_touch_screen;</div><div class='add'>+   Screen_Trashed = 1;</div><div class='add'>+   Smg_Inited = 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+int SLsmg_init_smg (void)</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   BLOCK_SIGNALS;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited)</div><div class='add'>+     SLsmg_reset_smg ();</div><div class='add'>+</div><div class='add'>+   if (-1 == (*tt_init_video) ())</div><div class='add'>+     {</div><div class='add'>+	UNBLOCK_SIGNALS;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (-1 == (ret = init_smg ()))</div><div class='add'>+     (void) (*tt_reset_video)();</div><div class='add'>+</div><div class='add'>+   UNBLOCK_SIGNALS;</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLsmg_reinit_smg (void)</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0)</div><div class='add'>+     return SLsmg_init_smg ();</div><div class='add'>+</div><div class='add'>+   BLOCK_SIGNALS;</div><div class='add'>+   reset_smg ();</div><div class='add'>+   ret = init_smg ();</div><div class='add'>+   UNBLOCK_SIGNALS;</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_reset_smg (void)</div><div class='add'>+{   </div><div class='add'>+   if (Smg_Inited == 0)</div><div class='add'>+     return;</div><div class='add'>+   </div><div class='add'>+   BLOCK_SIGNALS;</div><div class='add'>+</div><div class='add'>+   reset_smg ();</div><div class='add'>+   (*tt_reset_video)();</div><div class='add'>+</div><div class='add'>+   UNBLOCK_SIGNALS;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLsmg_Char_Type SLsmg_char_at (void)</div><div class='add'>+{</div><div class='add'>+   if (Smg_Inited == 0) return 0;</div><div class='add'>+</div><div class='add'>+   if (point_visible (1))</div><div class='add'>+     {</div><div class='add'>+	return SL_Screen[This_Row - Start_Row].neew[This_Col - Start_Col];</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_vprintf (char *fmt, va_list ap)</div><div class='add'>+{</div><div class='add'>+   char buf[1024];</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   (void) _SLvsnprintf (buf, sizeof (buf), fmt, ap);</div><div class='add'>+   SLsmg_write_string (buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_printf (char *fmt, ...)</div><div class='add'>+{</div><div class='add'>+   va_list ap;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   char *f;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   va_start(ap, fmt);</div><div class='add'>+</div><div class='add'>+   f = fmt;</div><div class='add'>+   while (*f &amp;&amp; (*f != '%'))</div><div class='add'>+     f++;</div><div class='add'>+   len = (unsigned int) (f - fmt);</div><div class='add'>+   if (len) SLsmg_write_nchars (fmt, len);</div><div class='add'>+</div><div class='add'>+   if (*f != 0)</div><div class='add'>+     SLsmg_vprintf (f, ap);</div><div class='add'>+</div><div class='add'>+   va_end (ap);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_set_screen_start (int *r, int *c)</div><div class='add'>+{</div><div class='add'>+   int orow = Start_Row, oc = Start_Col;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   if (c == NULL) Start_Col = 0;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	Start_Col = *c;</div><div class='add'>+	*c = oc;</div><div class='add'>+     }</div><div class='add'>+   if (r == NULL) Start_Row = 0;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	Start_Row = *r;</div><div class='add'>+	*r = orow;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_draw_object (int r, int c, unsigned char object)</div><div class='add'>+{</div><div class='add'>+   This_Row = r;  This_Col = c;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   if (point_visible (1))</div><div class='add'>+     {</div><div class='add'>+	int color = This_Color;</div><div class='add'>+	This_Color |= ALT_CHAR_FLAG;</div><div class='add'>+	SLsmg_write_char (object);</div><div class='add'>+	This_Color = color;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   This_Col = c + 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_draw_hline (unsigned int n)</div><div class='add'>+{</div><div class='add'>+   static unsigned char hbuf[16];</div><div class='add'>+   int count;</div><div class='add'>+   int cmin, cmax;</div><div class='add'>+   int final_col = This_Col + (int) n;</div><div class='add'>+   int save_color;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   if ((This_Row &lt; Start_Row) || (This_Row &gt;= Start_Row + Screen_Rows)</div><div class='add'>+       || (0 == compute_clip (This_Col, n, Start_Col, Start_Col + Screen_Cols,</div><div class='add'>+			      &amp;cmin, &amp;cmax)))</div><div class='add'>+     {</div><div class='add'>+	This_Col = final_col;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (hbuf[0] == 0)</div><div class='add'>+     {</div><div class='add'>+	SLMEMSET ((char *) hbuf, SLSMG_HLINE_CHAR, 16);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   n = (unsigned int)(cmax - cmin);</div><div class='add'>+   count = n / 16;</div><div class='add'>+</div><div class='add'>+   save_color = This_Color;</div><div class='add'>+   This_Color |= ALT_CHAR_FLAG;</div><div class='add'>+   This_Col = cmin;</div><div class='add'>+</div><div class='add'>+   SLsmg_write_nchars ((char *) hbuf, n % 16);</div><div class='add'>+   while (count-- &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	SLsmg_write_nchars ((char *) hbuf, 16);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   This_Color = save_color;</div><div class='add'>+   This_Col = final_col;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_draw_vline (int n)</div><div class='add'>+{</div><div class='add'>+   unsigned char ch = SLSMG_VLINE_CHAR;</div><div class='add'>+   int c = This_Col, rmin, rmax;</div><div class='add'>+   int final_row = This_Row + n;</div><div class='add'>+   int save_color;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   if (((c &lt; Start_Col) || (c &gt;= Start_Col + Screen_Cols)) ||</div><div class='add'>+       (0 == compute_clip (This_Row, n, Start_Row, Start_Row + Screen_Rows,</div><div class='add'>+			  &amp;rmin, &amp;rmax)))</div><div class='add'>+     {</div><div class='add'>+	This_Row = final_row;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   save_color = This_Color;</div><div class='add'>+   This_Color |= ALT_CHAR_FLAG;</div><div class='add'>+</div><div class='add'>+   for (This_Row = rmin; This_Row &lt; rmax; This_Row++)</div><div class='add'>+     {</div><div class='add'>+	This_Col = c;</div><div class='add'>+	SLsmg_write_nchars ((char *) &amp;ch, 1);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   This_Col = c;  This_Row = final_row;</div><div class='add'>+   This_Color = save_color;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_draw_box (int r, int c, unsigned int dr, unsigned int dc)</div><div class='add'>+{</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   if (!dr || !dc) return;</div><div class='add'>+   This_Row = r;  This_Col = c;</div><div class='add'>+   dr--; dc--;</div><div class='add'>+   SLsmg_draw_hline (dc);</div><div class='add'>+   SLsmg_draw_vline (dr);</div><div class='add'>+   This_Row = r;  This_Col = c;</div><div class='add'>+   SLsmg_draw_vline (dr);</div><div class='add'>+   SLsmg_draw_hline (dc);</div><div class='add'>+   SLsmg_draw_object (r, c, SLSMG_ULCORN_CHAR);</div><div class='add'>+   SLsmg_draw_object (r, c + (int) dc, SLSMG_URCORN_CHAR);</div><div class='add'>+   SLsmg_draw_object (r + (int) dr, c, SLSMG_LLCORN_CHAR);</div><div class='add'>+   SLsmg_draw_object (r + (int) dr, c + (int) dc, SLSMG_LRCORN_CHAR);</div><div class='add'>+   This_Row = r; This_Col = c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_fill_region (int r, int c, unsigned int dr, unsigned int dc, unsigned char ch)</div><div class='add'>+{</div><div class='add'>+   static unsigned char hbuf[16];</div><div class='add'>+   int count;</div><div class='add'>+   int dcmax, rmax;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   SLsmg_gotorc (r, c);</div><div class='add'>+   r = This_Row; c = This_Col;</div><div class='add'>+</div><div class='add'>+   dcmax = Screen_Cols - This_Col;</div><div class='add'>+   if (dcmax &lt; 0)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (dc &gt; (unsigned int) dcmax) dc = (unsigned int) dcmax;</div><div class='add'>+</div><div class='add'>+   rmax = This_Row + dr;</div><div class='add'>+   if (rmax &gt; Screen_Rows) rmax = Screen_Rows;</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+   ch = Alt_Char_Set[ch];</div><div class='add'>+#endif</div><div class='add'>+   if (ch != hbuf[0]) SLMEMSET ((char *) hbuf, (char) ch, 16);</div><div class='add'>+</div><div class='add'>+   for (This_Row = r; This_Row &lt; rmax; This_Row++)</div><div class='add'>+     {</div><div class='add'>+	This_Col = c;</div><div class='add'>+	count = dc / 16;</div><div class='add'>+	SLsmg_write_nchars ((char *) hbuf, dc % 16);</div><div class='add'>+	while (count-- &gt; 0)</div><div class='add'>+	  {</div><div class='add'>+	     SLsmg_write_nchars ((char *) hbuf, 16);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   This_Row = r;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_forward (int n)</div><div class='add'>+{</div><div class='add'>+   This_Col += n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_write_color_chars (SLsmg_Char_Type *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   SLsmg_Char_Type *smax, sh;</div><div class='add'>+   char buf[32], *b, *bmax;</div><div class='add'>+   int color, save_color;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   smax = s + len;</div><div class='add'>+   b = buf;</div><div class='add'>+   bmax = b + sizeof (buf);</div><div class='add'>+</div><div class='add'>+   save_color = This_Color;</div><div class='add'>+</div><div class='add'>+   while (s &lt; smax)</div><div class='add'>+     {</div><div class='add'>+	sh = *s++;</div><div class='add'>+</div><div class='add'>+	color = SLSMG_EXTRACT_COLOR(sh);</div><div class='add'>+</div><div class='add'>+#if REQUIRES_NON_BCE_SUPPORT</div><div class='add'>+	if (Bce_Color_Offset)</div><div class='add'>+	  {</div><div class='add'>+	     if (color &amp; 0x80)</div><div class='add'>+	       color = ((color &amp; 0x7F) + Bce_Color_Offset) | 0x80;</div><div class='add'>+	     else</div><div class='add'>+	       color = ((color &amp; 0x7F) + Bce_Color_Offset) &amp; 0x7F;</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+	if ((color != This_Color) || (b == bmax))</div><div class='add'>+	  {</div><div class='add'>+	     if (b != buf)</div><div class='add'>+	       {</div><div class='add'>+		  SLsmg_write_nchars (buf, (int) (b - buf));</div><div class='add'>+		  b = buf;</div><div class='add'>+	       }</div><div class='add'>+	     This_Color = color;</div><div class='add'>+	  }</div><div class='add'>+	*b++ = (char) SLSMG_EXTRACT_CHAR(sh);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (b != buf)</div><div class='add'>+     SLsmg_write_nchars (buf, (unsigned int) (b - buf));</div><div class='add'>+</div><div class='add'>+   This_Color = save_color;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int SLsmg_read_raw (SLsmg_Char_Type *buf, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   unsigned int r, c;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return 0;</div><div class='add'>+</div><div class='add'>+   if (0 == point_visible (1)) return 0;</div><div class='add'>+</div><div class='add'>+   r = (unsigned int) (This_Row - Start_Row);</div><div class='add'>+   c = (unsigned int) (This_Col - Start_Col);</div><div class='add'>+</div><div class='add'>+   if (c + len &gt; (unsigned int) Screen_Cols)</div><div class='add'>+     len = (unsigned int) Screen_Cols - c;</div><div class='add'>+</div><div class='add'>+   memcpy ((char *) buf, (char *) (SL_Screen[r].neew + c), len * sizeof (SLsmg_Char_Type));</div><div class='add'>+   return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int SLsmg_write_raw (SLsmg_Char_Type *buf, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   unsigned int r, c;</div><div class='add'>+   SLsmg_Char_Type *dest;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return 0;</div><div class='add'>+</div><div class='add'>+   if (0 == point_visible (1)) return 0;</div><div class='add'>+</div><div class='add'>+   r = (unsigned int) (This_Row - Start_Row);</div><div class='add'>+   c = (unsigned int) (This_Col - Start_Col);</div><div class='add'>+</div><div class='add'>+   if (c + len &gt; (unsigned int) Screen_Cols)</div><div class='add'>+     len = (unsigned int) Screen_Cols - c;</div><div class='add'>+</div><div class='add'>+   dest = SL_Screen[r].neew + c;</div><div class='add'>+</div><div class='add'>+   if (0 != memcmp ((char *) dest, (char *) buf, len * sizeof (SLsmg_Char_Type)))</div><div class='add'>+     {</div><div class='add'>+	memcpy ((char *) dest, (char *) buf, len * sizeof (SLsmg_Char_Type));</div><div class='add'>+	SL_Screen[r].flags |= TOUCHED;</div><div class='add'>+     }</div><div class='add'>+   return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void</div><div class='add'>+SLsmg_set_color_in_region (int color, int r, int c, unsigned int dr, unsigned int dc)</div><div class='add'>+{</div><div class='add'>+   int cmax, rmax;</div><div class='add'>+   SLsmg_Char_Type char_mask;</div><div class='add'>+</div><div class='add'>+   if (Smg_Inited == 0) return;</div><div class='add'>+</div><div class='add'>+   c -= Start_Col;</div><div class='add'>+   r -= Start_Row;</div><div class='add'>+</div><div class='add'>+   cmax = c + (int) dc;</div><div class='add'>+   rmax = r + (int) dr;</div><div class='add'>+</div><div class='add'>+   if (cmax &gt; Screen_Cols) cmax = Screen_Cols;</div><div class='add'>+   if (rmax &gt; Screen_Rows) rmax = Screen_Rows;</div><div class='add'>+</div><div class='add'>+   if (c &lt; 0) c = 0;</div><div class='add'>+   if (r &lt; 0) r = 0;</div><div class='add'>+</div><div class='add'>+#if REQUIRES_NON_BCE_SUPPORT</div><div class='add'>+   if (Bce_Color_Offset)</div><div class='add'>+     {</div><div class='add'>+	if (color &amp; 0x80)</div><div class='add'>+	  color = ((color &amp; 0x7F) + Bce_Color_Offset) | 0x80;</div><div class='add'>+	else</div><div class='add'>+	  color = ((color &amp; 0x7F) + Bce_Color_Offset) &amp; 0x7F;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   color = color &lt;&lt; 8;</div><div class='add'>+</div><div class='add'>+   char_mask = 0xFF;</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+   if ((tt_Use_Blink_For_ACS == NULL)</div><div class='add'>+       || (0 == *tt_Use_Blink_For_ACS))</div><div class='add'>+     char_mask = 0x80FF;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   while (r &lt; rmax)</div><div class='add'>+     {</div><div class='add'>+	SLsmg_Char_Type *s, *smax;</div><div class='add'>+</div><div class='add'>+	SL_Screen[r].flags |= TOUCHED;</div><div class='add'>+	s = SL_Screen[r].neew;</div><div class='add'>+	smax = s + cmax;</div><div class='add'>+	s += c;</div><div class='add'>+</div><div class='add'>+	while (s &lt; smax)</div><div class='add'>+	  {</div><div class='add'>+	     *s = (*s &amp; char_mask) | color;</div><div class='add'>+	     s++;</div><div class='add'>+	  }</div><div class='add'>+	r++;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLsmg_set_terminal_info (SLsmg_Term_Type *tt)</div><div class='add'>+{</div><div class='add'>+   if (tt == NULL)		       /* use default */</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if ((tt-&gt;tt_normal_video == NULL)</div><div class='add'>+       || (tt-&gt;tt_goto_rc == NULL)</div><div class='add'>+       || (tt-&gt;tt_cls == NULL)</div><div class='add'>+       || (tt-&gt;tt_del_eol == NULL)</div><div class='add'>+       || (tt-&gt;tt_smart_puts == NULL)</div><div class='add'>+       || (tt-&gt;tt_flush_output == NULL)</div><div class='add'>+       || (tt-&gt;tt_reset_video == NULL)</div><div class='add'>+       || (tt-&gt;tt_init_video == NULL)</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+       || (tt-&gt;tt_set_scroll_region == NULL)</div><div class='add'>+       || (tt-&gt;tt_reverse_index == NULL)</div><div class='add'>+       || (tt-&gt;tt_reset_scroll_region == NULL)</div><div class='add'>+       || (tt-&gt;tt_delete_nlines == NULL)</div><div class='add'>+       /* Variables */</div><div class='add'>+       || (tt-&gt;tt_term_cannot_scroll == NULL)</div><div class='add'>+       || (tt-&gt;tt_has_alt_charset == NULL)</div><div class='add'>+#if 0 /* These can be NULL */</div><div class='add'>+       || (tt-&gt;tt_use_blink_for_acs == NULL)</div><div class='add'>+       || (tt-&gt;tt_graphic_char_pairs == NULL)</div><div class='add'>+#endif</div><div class='add'>+       || (tt-&gt;tt_screen_cols == NULL)</div><div class='add'>+       || (tt-&gt;tt_screen_rows == NULL)</div><div class='add'>+#endif</div><div class='add'>+       )</div><div class='add'>+     SLang_exit_error ("Terminal not powerful enough for SLsmg");</div><div class='add'>+</div><div class='add'>+   tt_normal_video = tt-&gt;tt_normal_video;</div><div class='add'>+   tt_goto_rc = tt-&gt;tt_goto_rc;</div><div class='add'>+   tt_cls = tt-&gt;tt_cls;</div><div class='add'>+   tt_del_eol = tt-&gt;tt_del_eol;</div><div class='add'>+   tt_smart_puts = tt-&gt;tt_smart_puts;</div><div class='add'>+   tt_flush_output = tt-&gt;tt_flush_output;</div><div class='add'>+   tt_reset_video = tt-&gt;tt_reset_video;</div><div class='add'>+   tt_init_video = tt-&gt;tt_init_video;</div><div class='add'>+</div><div class='add'>+#ifndef IBMPC_SYSTEM</div><div class='add'>+   tt_set_scroll_region = tt-&gt;tt_set_scroll_region;</div><div class='add'>+   tt_reverse_index = tt-&gt;tt_reverse_index;</div><div class='add'>+   tt_reset_scroll_region = tt-&gt;tt_reset_scroll_region;</div><div class='add'>+   tt_delete_nlines = tt-&gt;tt_delete_nlines;</div><div class='add'>+</div><div class='add'>+   tt_Term_Cannot_Scroll = tt-&gt;tt_term_cannot_scroll;</div><div class='add'>+   tt_Has_Alt_Charset = tt-&gt;tt_has_alt_charset;</div><div class='add'>+   tt_Use_Blink_For_ACS = tt-&gt;tt_use_blink_for_acs;</div><div class='add'>+   tt_Graphics_Char_Pairs = tt-&gt;tt_graphic_char_pairs;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   tt_Screen_Cols = tt-&gt;tt_screen_cols;</div><div class='add'>+   tt_Screen_Rows = tt-&gt;tt_screen_rows;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slstd.c b/mdk-stage1/slang/slstd.c<br/>new file mode 100644<br/>index 000000000..b05dfcddb<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slstd.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstd.c</a></div><div class='hunk'>@@ -0,0 +1,724 @@</div><div class='add'>+/* -*- mode: C; mode: fold; -*- */</div><div class='add'>+/* Standard intrinsic functions for S-Lang.  Included here are string</div><div class='add'>+   and array operations */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+/*{{{ Include Files */</div><div class='add'>+</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef __QNX__</div><div class='add'>+# if defined(__GO32__) || defined(__WATCOMC__)</div><div class='add'>+#  include &lt;dos.h&gt;</div><div class='add'>+#  include &lt;bios.h&gt;</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+# include &lt;math.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* builtin stack manipulation functions */</div><div class='add'>+int SLdo_pop(void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   return SLdo_pop_n (1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int SLdo_pop_n (unsigned int n)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type x;</div><div class='add'>+</div><div class='add'>+   while (n--)</div><div class='add'>+     {</div><div class='add'>+	if (SLang_pop(&amp;x)) return -1;</div><div class='add'>+	SLang_free_object (&amp;x);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_dup(void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   (void) SLdup_n (1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int length_cmd (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   VOID_STAR p;</div><div class='add'>+   unsigned int length;</div><div class='add'>+   int len;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop (&amp;obj))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (obj.data_type);</div><div class='add'>+   p = _SLclass_get_ptr_to_value (cl, &amp;obj);</div><div class='add'>+</div><div class='add'>+   len = 1;</div><div class='add'>+   if (cl-&gt;cl_length != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (0 == (*cl-&gt;cl_length)(obj.data_type, p, &amp;length))</div><div class='add'>+	  len = (int) length;</div><div class='add'>+	else</div><div class='add'>+	  len = -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_free_object (&amp;obj);</div><div class='add'>+   return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* convert integer to a string of length 1 */</div><div class='add'>+static void char_cmd (int *x) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char ch, buf[2];</div><div class='add'>+</div><div class='add'>+   ch = (char) *x;</div><div class='add'>+   buf[0] = ch;</div><div class='add'>+   buf[1] = 0;</div><div class='add'>+   SLang_push_string (buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* format object into a string and returns slstring */</div><div class='add'>+char *_SLstringize_object (SLang_Object_Type *obj) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   unsigned char stype;</div><div class='add'>+   VOID_STAR p;</div><div class='add'>+   char *s, *s1;</div><div class='add'>+</div><div class='add'>+   stype = obj-&gt;data_type;</div><div class='add'>+   p = (VOID_STAR) &amp;obj-&gt;v.ptr_val;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (stype);</div><div class='add'>+</div><div class='add'>+   s = (*cl-&gt;cl_string) (stype, p);</div><div class='add'>+   if (s != NULL)</div><div class='add'>+     {</div><div class='add'>+	s1 = SLang_create_slstring (s);</div><div class='add'>+	SLfree (s);</div><div class='add'>+	s = s1;</div><div class='add'>+     }</div><div class='add'>+   return s;</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int SLang_run_hooks(char *hook, unsigned int num_args, ...)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+   va_list ap;</div><div class='add'>+</div><div class='add'>+   if (SLang_Error) return -1;</div><div class='add'>+</div><div class='add'>+   if (0 == SLang_is_defined (hook))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   (void) SLang_start_arg_list ();</div><div class='add'>+   va_start (ap, num_args);</div><div class='add'>+   for (i = 0; i &lt; num_args; i++)</div><div class='add'>+     {</div><div class='add'>+	char *arg;</div><div class='add'>+</div><div class='add'>+	arg = va_arg (ap, char *);</div><div class='add'>+	if (-1 == SLang_push_string (arg))</div><div class='add'>+	  break;</div><div class='add'>+     }</div><div class='add'>+   va_end (ap);</div><div class='add'>+   (void) SLang_end_arg_list ();</div><div class='add'>+</div><div class='add'>+   if (SLang_Error) return -1;</div><div class='add'>+   return SLang_execute_function (hook);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_getenv_cmd (char *s)</div><div class='add'>+{</div><div class='add'>+   SLang_push_string (getenv (s));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_PUTENV</div><div class='add'>+static void intrin_putenv (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+</div><div class='add'>+   /* Some putenv implementations required malloced strings. */</div><div class='add'>+   if (SLpop_string(&amp;s)) return;</div><div class='add'>+</div><div class='add'>+   if (putenv (s))</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_INTRINSIC_ERROR;</div><div class='add'>+	SLfree (s);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Note that s is NOT freed */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void lang_print_stack (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char buf[32];</div><div class='add'>+   unsigned int n;</div><div class='add'>+</div><div class='add'>+   n = (unsigned int) (_SLStack_Pointer - _SLRun_Stack);</div><div class='add'>+   while (n)</div><div class='add'>+     {</div><div class='add'>+	n--;</div><div class='add'>+	sprintf (buf, "(%u)", n);</div><div class='add'>+	_SLdump_objects (buf, _SLRun_Stack + n, 1, 1);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void byte_compile_file (char *f, int *m)</div><div class='add'>+{</div><div class='add'>+   SLang_byte_compile_file (f, *m);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_type_info1 (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   unsigned int type;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop (&amp;obj))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   type = obj.data_type;</div><div class='add'>+   if (type == SLANG_ARRAY_TYPE)</div><div class='add'>+     type = obj.v.array_val-&gt;data_type;</div><div class='add'>+</div><div class='add'>+   SLang_free_object (&amp;obj);</div><div class='add'>+</div><div class='add'>+   _SLang_push_datatype (type);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_type_info (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop (&amp;obj))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   _SLang_push_datatype (obj.data_type);</div><div class='add'>+   SLang_free_object (&amp;obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLstring_intrinsic (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type x;</div><div class='add'>+   char *s;</div><div class='add'>+</div><div class='add'>+   if (SLang_pop (&amp;x)) return;</div><div class='add'>+   if (NULL != (s = _SLstringize_object (&amp;x)))</div><div class='add'>+     _SLang_push_slstring (s);</div><div class='add'>+</div><div class='add'>+   SLang_free_object (&amp;x);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void intrin_typecast (void)</div><div class='add'>+{</div><div class='add'>+   unsigned char to_type;</div><div class='add'>+   if (0 == _SLang_pop_datatype (&amp;to_type))</div><div class='add'>+     (void) SLclass_typecast (to_type, 0, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+static void intrin_double (void)</div><div class='add'>+{</div><div class='add'>+   (void) SLclass_typecast (SLANG_DOUBLE_TYPE, 0, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void intrin_int (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   (void) SLclass_typecast (SLANG_INT_TYPE, 0, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static char *</div><div class='add'>+intrin_function_name (void)</div><div class='add'>+{</div><div class='add'>+   if (NULL == _SLang_Current_Function_Name)</div><div class='add'>+     return "";</div><div class='add'>+   return _SLang_Current_Function_Name;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_message (char *s)</div><div class='add'>+{</div><div class='add'>+   SLang_vmessage ("%s", s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_error (char *s)</div><div class='add'>+{</div><div class='add'>+   SLang_verror (SL_USER_ERROR, "%s", s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_pop_n (int *n)</div><div class='add'>+{</div><div class='add'>+   SLdo_pop_n ((unsigned int) *n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_reverse_stack (int *n)</div><div class='add'>+{</div><div class='add'>+   SLreverse_stack (*n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_roll_stack (int *n)</div><div class='add'>+{</div><div class='add'>+   SLroll_stack (*n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void usage (void)</div><div class='add'>+{</div><div class='add'>+   char *msg;</div><div class='add'>+</div><div class='add'>+   _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 1);   /* do not include format */</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_slstring (&amp;msg))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   SLang_verror (SL_USAGE_ERROR, "Usage: %s", msg);</div><div class='add'>+   SLang_free_slstring (msg);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Convert string to integer */</div><div class='add'>+static int intrin_integer (char *s)</div><div class='add'>+{</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   i = SLatoi ((unsigned char *) s);</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     SLang_verror (SL_TYPE_MISMATCH, "Unable to convert string to integer");</div><div class='add'>+   return i;</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void guess_type (char *s)</div><div class='add'>+{</div><div class='add'>+   _SLang_push_datatype (SLang_guess_type(s));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int load_file (char *s)</div><div class='add'>+{</div><div class='add'>+   if (-1 == SLang_load_file (s))</div><div class='add'>+     return 0;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void get_doc_string (char *file, char *topic)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+   char line[1024];</div><div class='add'>+   unsigned int topic_len, str_len;</div><div class='add'>+   char *str;</div><div class='add'>+   char ch;</div><div class='add'>+</div><div class='add'>+   if (NULL == (fp = fopen (file, "r")))</div><div class='add'>+     {</div><div class='add'>+	SLang_push_null ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   topic_len = strlen (topic);</div><div class='add'>+   ch = *topic;</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	if (NULL == fgets (line, sizeof(line), fp))</div><div class='add'>+	  {</div><div class='add'>+	     fclose (fp);</div><div class='add'>+	     (void) SLang_push_null ();</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if ((ch == *line)</div><div class='add'>+	    &amp;&amp; (0 == strncmp (line, topic, topic_len))</div><div class='add'>+	    &amp;&amp; ((line[topic_len] == '\n') || (line [topic_len] == 0)</div><div class='add'>+		|| (line[topic_len] == ' ') || (line[topic_len] == '\t')))</div><div class='add'>+	  break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (str = SLmake_string (line)))</div><div class='add'>+     {</div><div class='add'>+	fclose (fp);</div><div class='add'>+	(void) SLang_push_null ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   str_len = strlen (str);</div><div class='add'>+</div><div class='add'>+   while (NULL != fgets (line, sizeof (line), fp))</div><div class='add'>+     {</div><div class='add'>+	unsigned int len;</div><div class='add'>+	char *new_str;</div><div class='add'>+</div><div class='add'>+	ch = *line;</div><div class='add'>+	if (ch == '#') continue;</div><div class='add'>+	if (ch == '-') break;</div><div class='add'>+</div><div class='add'>+	len = strlen (line);</div><div class='add'>+	if (NULL == (new_str = SLrealloc (str, str_len + len + 1)))</div><div class='add'>+	  {</div><div class='add'>+	     SLfree (str);</div><div class='add'>+	     str = NULL;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	str = new_str;</div><div class='add'>+	strcpy (str + str_len, line);</div><div class='add'>+	str_len += len;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   fclose (fp);</div><div class='add'>+</div><div class='add'>+   (void) SLang_push_malloced_string (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_string_array_elements (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+   char **strs;</div><div class='add'>+   unsigned int num;</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   if (at == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   strs = (char **)at-&gt;data;</div><div class='add'>+   num = at-&gt;num_elements;</div><div class='add'>+   for (i = 0; i &lt; num; i++)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLang_push_string (strs[i]))</div><div class='add'>+	  {</div><div class='add'>+	     SLdo_pop_n (i);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   SLang_push_integer ((int) num);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+	</div><div class='add'>+static void intrin_apropos (void)</div><div class='add'>+{</div><div class='add'>+   int num_args;</div><div class='add'>+   char *pat;</div><div class='add'>+   char *namespace_name;</div><div class='add'>+   unsigned int flags;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   num_args = SLang_Num_Function_Args;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_uinteger (&amp;flags))</div><div class='add'>+     return;</div><div class='add'>+   if (-1 == SLang_pop_slstring (&amp;pat))</div><div class='add'>+     return;</div><div class='add'>+   </div><div class='add'>+   namespace_name = NULL;</div><div class='add'>+   at = NULL;</div><div class='add'>+   if (num_args == 3)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLang_pop_slstring (&amp;namespace_name))</div><div class='add'>+	  goto free_and_return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   at = _SLang_apropos (namespace_name, pat, flags);</div><div class='add'>+   if (num_args == 3)</div><div class='add'>+     {</div><div class='add'>+	(void) SLang_push_array (at, 0);</div><div class='add'>+	goto free_and_return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Maintain compatibility with old version of the function.  That version</div><div class='add'>+    * did not take three arguments and returned everything to the stack.</div><div class='add'>+    * Yuk.</div><div class='add'>+    */</div><div class='add'>+   (void) push_string_array_elements (at);</div><div class='add'>+</div><div class='add'>+   free_and_return:</div><div class='add'>+   /* NULLs ok */</div><div class='add'>+   SLang_free_slstring (namespace_name);</div><div class='add'>+   SLang_free_slstring (pat);</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int intrin_get_defines (void)</div><div class='add'>+{</div><div class='add'>+   int n = 0;</div><div class='add'>+   char **s = _SLdefines;</div><div class='add'>+</div><div class='add'>+   while (*s != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLang_push_string (*s))</div><div class='add'>+	  {</div><div class='add'>+	     SLdo_pop_n ((unsigned int) n);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	s++;</div><div class='add'>+	n++;</div><div class='add'>+     }</div><div class='add'>+   return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void intrin_get_reference (char *name)</div><div class='add'>+{</div><div class='add'>+   _SLang_push_ref (1, (VOID_STAR) _SLlocate_name (name));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_SYS_UTSNAME_H</div><div class='add'>+# include &lt;sys/utsname.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void uname_cmd (void)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_UNAME</div><div class='add'>+   struct utsname u;</div><div class='add'>+   char *field_names [6];</div><div class='add'>+   unsigned char field_types[6];</div><div class='add'>+   VOID_STAR field_values [6];</div><div class='add'>+   char *ptrs[6];</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   if (-1 == uname (&amp;u))</div><div class='add'>+     (void) SLang_push_null ();</div><div class='add'>+</div><div class='add'>+   field_names[0] = "sysname"; ptrs[0] = u.sysname;</div><div class='add'>+   field_names[1] = "nodename"; ptrs[1] = u.nodename;</div><div class='add'>+   field_names[2] = "release"; ptrs[2] = u.release;</div><div class='add'>+   field_names[3] = "version"; ptrs[3] = u.version;</div><div class='add'>+   field_names[4] = "machine"; ptrs[4] = u.machine;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; 5; i++)</div><div class='add'>+     {</div><div class='add'>+	field_types[i] = SLANG_STRING_TYPE;</div><div class='add'>+	field_values[i] = (VOID_STAR) &amp;ptrs[i];</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (0 == SLstruct_create_struct (5, field_names, field_types, field_values))</div><div class='add'>+     return;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   SLang_push_null ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void uninitialize_ref_intrin (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+   (void) _SLang_uninitialize_ref (ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type SLang_Basic_Table [] = /*{{{*/</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_1("__is_initialized", _SLang_is_ref_initialized, SLANG_INT_TYPE, SLANG_REF_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("__get_reference", intrin_get_reference, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_1("__uninitialize", uninitialize_ref_intrin, SLANG_VOID_TYPE, SLANG_REF_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SS("get_doc_string_from_file",  get_doc_string, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SS("autoload",  SLang_autoload, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("is_defined",  SLang_is_defined, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("string",  _SLstring_intrinsic, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("uname", uname_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("getenv",  intrin_getenv_cmd, SLANG_VOID_TYPE),</div><div class='add'>+#ifdef HAVE_PUTENV</div><div class='add'>+   MAKE_INTRINSIC_0("putenv",  intrin_putenv, SLANG_VOID_TYPE),</div><div class='add'>+#endif</div><div class='add'>+   MAKE_INTRINSIC_S("evalfile",  load_file, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_I("char",  char_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("eval",  SLang_load_string, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("dup",  do_dup, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("integer",  intrin_integer, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("system",  SLsystem, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("_apropos",  intrin_apropos, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("_trace_function",  _SLang_trace_fun, SLANG_VOID_TYPE),</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   MAKE_INTRINSIC_S("atof", _SLang_atof, SLANG_DOUBLE_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("double", intrin_double, SLANG_VOID_TYPE),</div><div class='add'>+#endif</div><div class='add'>+   MAKE_INTRINSIC_0("int",  intrin_int, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("typecast", intrin_typecast, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("_stkdepth", _SLstack_depth, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_I("_stk_reverse", intrin_reverse_stack, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("typeof", intrin_type_info, VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("_typeof", intrin_type_info1, VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_I("_pop_n", intrin_pop_n, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("_print_stack", lang_print_stack, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_I("_stk_roll", intrin_roll_stack, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SI("byte_compile_file", byte_compile_file, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("_clear_error", _SLang_clear_error, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("_function_name", intrin_function_name, SLANG_STRING_TYPE),</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   MAKE_INTRINSIC_S("set_float_format", _SLset_double_format, SLANG_VOID_TYPE),</div><div class='add'>+#endif</div><div class='add'>+   MAKE_INTRINSIC_S("_slang_guess_type", guess_type, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("error", intrin_error, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("message", intrin_message, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("__get_defined_symbols", intrin_get_defines, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_I("__pop_args", _SLstruct_pop_args, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_1("__push_args", _SLstruct_push_args, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("usage", usage, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("implements", _SLang_implements_intrinsic, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("use_namespace", _SLang_use_namespace_intrinsic, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("current_namespace", _SLang_cur_namespace_intrinsic, SLANG_STRING_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("length", length_cmd, SLANG_INT_TYPE),</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+#ifdef SLANG_DOC_DIR</div><div class='add'>+char *SLang_Doc_Dir = SLANG_DOC_DIR;</div><div class='add'>+#else</div><div class='add'>+char *SLang_Doc_Dir = "";</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Var_Type Intrin_Vars[] =</div><div class='add'>+{</div><div class='add'>+   MAKE_VARIABLE("_debug_info", &amp;_SLang_Compile_Line_Num_Info, SLANG_INT_TYPE, 0),</div><div class='add'>+   MAKE_VARIABLE("_auto_declare", &amp;_SLang_Auto_Declare_Globals, SLANG_INT_TYPE, 0),</div><div class='add'>+   MAKE_VARIABLE("_traceback", &amp;SLang_Traceback, SLANG_INT_TYPE, 0),</div><div class='add'>+   MAKE_VARIABLE("_slangtrace", &amp;_SLang_Trace, SLANG_INT_TYPE, 0),</div><div class='add'>+   MAKE_VARIABLE("_slang_version", &amp;SLang_Version, SLANG_INT_TYPE, 1),</div><div class='add'>+   MAKE_VARIABLE("_slang_version_string", &amp;SLang_Version_String, SLANG_STRING_TYPE, 1),</div><div class='add'>+   MAKE_VARIABLE("_NARGS", &amp;SLang_Num_Function_Args, SLANG_INT_TYPE, 1),</div><div class='add'>+   MAKE_VARIABLE("_slang_doc_dir", &amp;SLang_Doc_Dir, SLANG_STRING_TYPE, 1),</div><div class='add'>+   MAKE_VARIABLE("NULL", NULL, SLANG_NULL_TYPE, 1),</div><div class='add'>+   SLANG_END_INTRIN_VAR_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int SLang_init_slang (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char name[3];</div><div class='add'>+   unsigned int i;</div><div class='add'>+   char **s;</div><div class='add'>+   static char *sys_defines [] =</div><div class='add'>+     {</div><div class='add'>+#if defined(__os2__)</div><div class='add'>+	"OS2",</div><div class='add'>+#endif</div><div class='add'>+#if defined(__MSDOS__)</div><div class='add'>+	"MSDOS",</div><div class='add'>+#endif</div><div class='add'>+#if defined(__WIN16__)</div><div class='add'>+	"WIN16",</div><div class='add'>+#endif</div><div class='add'>+#if defined (__WIN32__)</div><div class='add'>+	"WIN32",</div><div class='add'>+#endif</div><div class='add'>+#if defined(__NT__)</div><div class='add'>+	"NT",</div><div class='add'>+#endif</div><div class='add'>+#if defined (VMS)</div><div class='add'>+	"VMS",</div><div class='add'>+#endif</div><div class='add'>+#ifdef REAL_UNIX_SYSTEM</div><div class='add'>+	"UNIX",</div><div class='add'>+#endif</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	"SLANG_DOUBLE_TYPE",</div><div class='add'>+#endif</div><div class='add'>+	NULL</div><div class='add'>+     };</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLregister_types ()) return -1;</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLadd_intrin_fun_table(SLang_Basic_Table, NULL))</div><div class='add'>+       || (-1 == SLadd_intrin_var_table (Intrin_Vars, NULL))</div><div class='add'>+       || (-1 == _SLang_init_slstrops ())</div><div class='add'>+       || (-1 == _SLang_init_sltime ())</div><div class='add'>+       || (-1 == _SLstruct_init ())</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+       || (-1 == _SLinit_slcomplex ())</div><div class='add'>+#endif</div><div class='add'>+#if SLANG_HAS_ASSOC_ARRAYS</div><div class='add'>+       || (-1 == SLang_init_slassoc ())</div><div class='add'>+#endif</div><div class='add'>+       )</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   SLadd_global_variable (SLANG_SYSTEM_NAME);</div><div class='add'>+</div><div class='add'>+   s = sys_defines;</div><div class='add'>+   while (*s != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLdefine_for_ifdef (*s)) return -1;</div><div class='add'>+	s++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* give temp global variables $0 --&gt; $9 */</div><div class='add'>+   name[2] = 0; name[0] = '$';</div><div class='add'>+   for (i = 0; i &lt; 10; i++)</div><div class='add'>+     {</div><div class='add'>+	name[1] = (char) (i + '0');</div><div class='add'>+	SLadd_global_variable (name);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_init_case_tables ();</div><div class='add'>+</div><div class='add'>+   /* Now add a couple of macros */</div><div class='add'>+   SLang_load_string (".(_NARGS 1 - Sprintf error)verror");</div><div class='add'>+   SLang_load_string (".(_NARGS 1 - Sprintf message)vmessage");</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int SLang_set_argc_argv (int argc, char **argv)</div><div class='add'>+{</div><div class='add'>+   static int this_argc;</div><div class='add'>+   static char **this_argv;</div><div class='add'>+   int i;</div><div class='add'>+</div><div class='add'>+   if (argc &lt; 0) argc = 0;</div><div class='add'>+   this_argc = argc;</div><div class='add'>+</div><div class='add'>+   if (NULL == (this_argv = (char **) SLmalloc ((argc + 1) * sizeof (char *))))</div><div class='add'>+     return -1;</div><div class='add'>+   memset ((char *) this_argv, 0, sizeof (char *) * (argc + 1));</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; argc; i++)</div><div class='add'>+     {</div><div class='add'>+	if (NULL == (this_argv[i] = SLang_create_slstring (argv[i])))</div><div class='add'>+	  goto return_error;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == SLadd_intrinsic_variable ("__argc", (VOID_STAR)&amp;this_argc,</div><div class='add'>+				       SLANG_INT_TYPE, 1))</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_add_intrinsic_array ("__argv", SLANG_STRING_TYPE, 1,</div><div class='add'>+					(VOID_STAR) this_argv, 1, argc))</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   for (i = 0; i &lt; argc; i++)</div><div class='add'>+     SLang_free_slstring (this_argv[i]);   /* NULL ok */</div><div class='add'>+   SLfree ((char *) this_argv);</div><div class='add'>+</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slstdio.c b/mdk-stage1/slang/slstdio.c<br/>new file mode 100644<br/>index 000000000..05db1af77<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slstdio.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstdio.c</a></div><div class='hunk'>@@ -0,0 +1,1050 @@</div><div class='add'>+/* file stdio intrinsics for S-Lang */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#if defined(__unix__) || (defined (__os2__) &amp;&amp; defined (__EMX__))</div><div class='add'>+# include &lt;sys/types.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_FCNTL_H</div><div class='add'>+# include &lt;fcntl.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#ifdef HAVE_SYS_FCNTL_H</div><div class='add'>+# include &lt;sys/fcntl.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __unix__</div><div class='add'>+# include &lt;sys/file.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include &lt;io.h&gt;</div><div class='add'>+# include &lt;dir.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__DECC) &amp;&amp; defined(VMS)</div><div class='add'>+# include &lt;unixio.h&gt;</div><div class='add'>+# include &lt;unixlib.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef VMS</div><div class='add'>+# include &lt;stat.h&gt;</div><div class='add'>+#else</div><div class='add'>+# include &lt;sys/stat.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#define SL_APP_WANTS_FOREACH</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   FILE *fp;			       /* kind of obvious */</div><div class='add'>+   char *file;			       /* file name associated with pointer */</div><div class='add'>+</div><div class='add'>+   unsigned int flags;		       /* modes, etc... */</div><div class='add'>+#define SL_READ		0x0001</div><div class='add'>+#define SL_WRITE	0x0002</div><div class='add'>+#define SL_BINARY	0x0004</div><div class='add'>+#define SL_FDOPEN	0x2000</div><div class='add'>+#define SL_PIPE		0x4000</div><div class='add'>+#define SL_INUSE	0x8000</div><div class='add'>+}</div><div class='add'>+SL_File_Table_Type;</div><div class='add'>+</div><div class='add'>+static SL_File_Table_Type *SL_File_Table;</div><div class='add'>+</div><div class='add'>+static SL_File_Table_Type *get_free_file_table_entry (void)</div><div class='add'>+{</div><div class='add'>+   SL_File_Table_Type *t = SL_File_Table, *tmax;</div><div class='add'>+</div><div class='add'>+   tmax = t + SL_MAX_FILES;</div><div class='add'>+   while (t &lt; tmax)</div><div class='add'>+     {</div><div class='add'>+	if (t-&gt;flags == 0)</div><div class='add'>+	  {</div><div class='add'>+	     memset ((char *) t, 0, sizeof (SL_File_Table_Type));</div><div class='add'>+	     return t;</div><div class='add'>+	  }</div><div class='add'>+	t++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned int file_process_flags (char *mode)</div><div class='add'>+{</div><div class='add'>+   char ch;</div><div class='add'>+   unsigned int flags = 0;</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	ch = *mode++;</div><div class='add'>+	switch (ch)</div><div class='add'>+	  {</div><div class='add'>+	   case 'r': flags |= SL_READ;</div><div class='add'>+	     break;</div><div class='add'>+	   case 'w':</div><div class='add'>+	   case 'a':</div><div class='add'>+	   case 'A':</div><div class='add'>+	     flags |= SL_WRITE;</div><div class='add'>+	     break;</div><div class='add'>+	   case '+': flags |= SL_WRITE | SL_READ;</div><div class='add'>+	     break;</div><div class='add'>+	   case 'b': flags |= SL_BINARY;</div><div class='add'>+	     break;</div><div class='add'>+	   case 0:</div><div class='add'>+	     return flags;</div><div class='add'>+</div><div class='add'>+	   default:</div><div class='add'>+	     SLang_verror (SL_INVALID_PARM, "File flag %c is not supported", ch);</div><div class='add'>+	     return 0;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int open_file_type (char *file, int fd, char *mode,</div><div class='add'>+			   FILE *(*open_fun)(char *, char *),</div><div class='add'>+			   int (*close_fun)(FILE *),</div><div class='add'>+			   unsigned int xflags)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+   SL_File_Table_Type *t;</div><div class='add'>+   unsigned int flags;</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+</div><div class='add'>+   fp = NULL;</div><div class='add'>+   t = NULL;</div><div class='add'>+   mmt = NULL;</div><div class='add'>+</div><div class='add'>+   if ((NULL == (t = get_free_file_table_entry ()))</div><div class='add'>+       || (0 == (flags = file_process_flags(mode))))</div><div class='add'>+     goto return_error;</div><div class='add'>+   </div><div class='add'>+   if (fd != -1)</div><div class='add'>+     fp = fdopen (fd, mode);</div><div class='add'>+   else</div><div class='add'>+     fp = open_fun (file, mode);</div><div class='add'>+</div><div class='add'>+   if (fp == NULL)</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	goto return_error;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (mmt = SLang_create_mmt (SLANG_FILE_PTR_TYPE, (VOID_STAR) t)))</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   t-&gt;fp = fp;</div><div class='add'>+   t-&gt;flags = flags | xflags;</div><div class='add'>+   fp = NULL;			       /* allow free_mmt to close fp */</div><div class='add'>+</div><div class='add'>+   if ((NULL != (t-&gt;file = SLang_create_slstring (file)))</div><div class='add'>+       &amp;&amp; (0 == SLang_push_mmt (mmt)))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   /* drop */</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   if (fp != NULL) (*close_fun) (fp);</div><div class='add'>+   if (mmt != NULL) SLang_free_mmt (mmt);</div><div class='add'>+   (void) SLang_push_null ();</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Since some compilers do not have popen/pclose prototyped and in scope,</div><div class='add'>+ * and pc compilers sometimes have silly prototypes involving PASCAL, etc.</div><div class='add'>+ * use wrappers around the function to avoid compilation errors.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static FILE *fopen_fun (char *f, char *m)</div><div class='add'>+{</div><div class='add'>+   return fopen (f, m);</div><div class='add'>+}</div><div class='add'>+static int fclose_fun (FILE *fp)</div><div class='add'>+{</div><div class='add'>+   return fclose (fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void stdio_fopen (char *file, char *mode)</div><div class='add'>+{</div><div class='add'>+   (void) open_file_type (file, -1, mode, fopen_fun, fclose_fun, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLstdio_fdopen (char *file, int fd, char *mode)</div><div class='add'>+{</div><div class='add'>+   if (fd == -1)</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = EBADF;</div><div class='add'>+	(void) SLang_push_null ();</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return open_file_type (file, fd, mode, NULL, fclose_fun, SL_FDOPEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_POPEN</div><div class='add'>+static int pclose_fun (FILE *fp)</div><div class='add'>+{</div><div class='add'>+   return pclose (fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static FILE *popen_fun (char *file, char *mode)</div><div class='add'>+{</div><div class='add'>+   return popen (file, mode);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void stdio_popen (char *file, char *mode)</div><div class='add'>+{</div><div class='add'>+   (void) open_file_type (file, -1, mode, popen_fun, pclose_fun, SL_PIPE);</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+/* returns pointer to file entry if it is open and consistent with</div><div class='add'>+   flags.  Returns NULL otherwise */</div><div class='add'>+static SLang_MMT_Type *pop_fp (unsigned int flags, FILE **fp_ptr)</div><div class='add'>+{</div><div class='add'>+   SL_File_Table_Type *t;</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+</div><div class='add'>+   *fp_ptr = NULL;</div><div class='add'>+</div><div class='add'>+   if (NULL == (mmt = SLang_pop_mmt (SLANG_FILE_PTR_TYPE)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   t = (SL_File_Table_Type *) SLang_object_from_mmt (mmt);</div><div class='add'>+   if ((t-&gt;flags &amp; flags)</div><div class='add'>+       &amp;&amp; (NULL != (*fp_ptr = t-&gt;fp)))</div><div class='add'>+     return mmt;</div><div class='add'>+</div><div class='add'>+   SLang_free_mmt (mmt);</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static FILE *check_fp (SL_File_Table_Type *t, unsigned flags)</div><div class='add'>+{</div><div class='add'>+   if ((t != NULL) &amp;&amp; (t-&gt;flags &amp; flags))</div><div class='add'>+     return t-&gt;fp;</div><div class='add'>+</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLang_get_name_from_fileptr (SLang_MMT_Type *mmt)</div><div class='add'>+{</div><div class='add'>+   SL_File_Table_Type *ft;</div><div class='add'>+</div><div class='add'>+   ft = (SL_File_Table_Type *) SLang_object_from_mmt (mmt);</div><div class='add'>+   if (ft == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+   return ft-&gt;file;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_fileptr (SLang_MMT_Type **mmt, FILE **fp)</div><div class='add'>+{</div><div class='add'>+   if (NULL == (*mmt = pop_fp (0xFFFF, fp)))</div><div class='add'>+     {</div><div class='add'>+#ifdef EBADF</div><div class='add'>+	_SLerrno_errno = EBADF;</div><div class='add'>+#endif</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int close_file_type (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+   int ret = 0;</div><div class='add'>+   FILE *fp;</div><div class='add'>+</div><div class='add'>+   if (t == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   fp = t-&gt;fp;</div><div class='add'>+</div><div class='add'>+   if (NULL == fp) ret = -1;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	if (0 == (t-&gt;flags &amp; SL_PIPE))</div><div class='add'>+	  {</div><div class='add'>+	     if (EOF == (ret = fclose (fp)))</div><div class='add'>+	       _SLerrno_errno = errno;</div><div class='add'>+	  }</div><div class='add'>+#ifdef HAVE_POPEN</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == (ret = pclose (fp)))</div><div class='add'>+	       _SLerrno_errno = errno;</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (t-&gt;file != NULL) SLang_free_slstring (t-&gt;file);</div><div class='add'>+   memset ((char *) t, 0, sizeof (SL_File_Table_Type));</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_fclose (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   if (NULL == check_fp (t, 0xFFFF))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   ret = close_file_type (t);</div><div class='add'>+</div><div class='add'>+   t-&gt;flags = SL_INUSE;</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int read_one_line (FILE *fp, char **strp, unsigned int *lenp)</div><div class='add'>+{</div><div class='add'>+   char buf[512];</div><div class='add'>+   char *str;</div><div class='add'>+   unsigned int len;</div><div class='add'>+</div><div class='add'>+   *strp = NULL;</div><div class='add'>+   len = 0;</div><div class='add'>+   str = NULL;</div><div class='add'>+</div><div class='add'>+   while (NULL != fgets (buf, sizeof (buf), fp))</div><div class='add'>+     {</div><div class='add'>+	unsigned int dlen;</div><div class='add'>+	char *new_str;</div><div class='add'>+	int done_flag;</div><div class='add'>+</div><div class='add'>+	dlen = strlen (buf);</div><div class='add'>+	/* Note: If the file contains embedded \0 characters, then this</div><div class='add'>+	 * fails to work properly since dlen will not be correct.</div><div class='add'>+	 */</div><div class='add'>+	done_flag = ((dlen + 1 &lt; sizeof (buf))</div><div class='add'>+		     || (buf[dlen - 1] == '\n'));</div><div class='add'>+</div><div class='add'>+	if (done_flag &amp;&amp; (str == NULL))</div><div class='add'>+	  {</div><div class='add'>+	     /* Avoid the malloc */</div><div class='add'>+	     str = buf;</div><div class='add'>+	     len = dlen;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (NULL == (new_str = SLrealloc (str, len + dlen + 1)))</div><div class='add'>+	  {</div><div class='add'>+	     SLfree (str);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	str = new_str;</div><div class='add'>+	strcpy (str + len, buf);</div><div class='add'>+	len += dlen;</div><div class='add'>+</div><div class='add'>+	if (done_flag) break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (str == NULL)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   *strp = SLang_create_nslstring (str, len);</div><div class='add'>+   if (str != buf) SLfree (str);</div><div class='add'>+</div><div class='add'>+   if (*strp == NULL) return -1;</div><div class='add'>+</div><div class='add'>+   *lenp = len;</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* returns number of characters read and pushes the string to the stack.</div><div class='add'>+   If it fails, it returns -1 */</div><div class='add'>+static int stdio_fgets (SLang_Ref_Type *ref, SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   FILE *fp;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   if (NULL == (fp = check_fp (t, SL_READ)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   status = read_one_line (fp, &amp;s, &amp;len);</div><div class='add'>+   if (status &lt;= 0)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   status = SLang_assign_to_ref (ref, SLANG_STRING_TYPE, (VOID_STAR)&amp;s);</div><div class='add'>+   SLang_free_slstring (s);</div><div class='add'>+</div><div class='add'>+   if (status == -1)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return (int) len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void stdio_fgetslines_internal (FILE *fp, unsigned int n)</div><div class='add'>+{</div><div class='add'>+   unsigned int num_lines, max_num_lines;</div><div class='add'>+   char **list;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   int inum_lines;</div><div class='add'>+</div><div class='add'>+   if (n &gt; 1024)</div><div class='add'>+     max_num_lines = 1024;</div><div class='add'>+   else </div><div class='add'>+     {</div><div class='add'>+	max_num_lines = n;</div><div class='add'>+	if (max_num_lines == 0)</div><div class='add'>+	  max_num_lines++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   list = (char **) SLmalloc (sizeof (char *) * max_num_lines);</div><div class='add'>+   if (list == NULL)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   num_lines = 0;</div><div class='add'>+   while (num_lines &lt; n)</div><div class='add'>+     {</div><div class='add'>+	int status;</div><div class='add'>+	char *line;</div><div class='add'>+	unsigned int len;</div><div class='add'>+</div><div class='add'>+	status = read_one_line (fp, &amp;line, &amp;len);</div><div class='add'>+	if (status == -1)</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	if (status == 0)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	if (max_num_lines == num_lines)</div><div class='add'>+	  {</div><div class='add'>+	     char **new_list;</div><div class='add'>+</div><div class='add'>+	     if (max_num_lines + 4096 &gt; n)</div><div class='add'>+	       max_num_lines = n;</div><div class='add'>+	     else</div><div class='add'>+	       max_num_lines += 4096;</div><div class='add'>+</div><div class='add'>+	     new_list = (char **) SLrealloc ((char *)list, sizeof (char *) * max_num_lines);</div><div class='add'>+	     if (new_list == NULL)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_free_slstring (line);</div><div class='add'>+		  goto return_error;</div><div class='add'>+	       }</div><div class='add'>+	     list = new_list;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	list[num_lines] = line;</div><div class='add'>+	num_lines++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (num_lines != max_num_lines)</div><div class='add'>+     {</div><div class='add'>+	char **new_list;</div><div class='add'>+</div><div class='add'>+	new_list = (char **)SLrealloc ((char *)list, sizeof (char *) * (num_lines + 1));</div><div class='add'>+	if (new_list == NULL)</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	list = new_list;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   inum_lines = (int) num_lines;</div><div class='add'>+   if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, (VOID_STAR) list, &amp;inum_lines, 1)))</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_push_array (at, 1))</div><div class='add'>+     SLang_push_null ();</div><div class='add'>+   return;</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   while (num_lines &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	num_lines--;</div><div class='add'>+	SLfree (list[num_lines]);</div><div class='add'>+     }</div><div class='add'>+   SLfree ((char *)list);</div><div class='add'>+   SLang_push_null ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void stdio_fgetslines (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int n;</div><div class='add'>+   FILE *fp;</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+</div><div class='add'>+   n = (unsigned int)-1;</div><div class='add'>+</div><div class='add'>+   if (SLang_Num_Function_Args == 2)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLang_pop_uinteger (&amp;n))</div><div class='add'>+	  return;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (NULL == (mmt = pop_fp (SL_READ, &amp;fp)))</div><div class='add'>+     {</div><div class='add'>+	SLang_push_null ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   stdio_fgetslines_internal (fp, n);</div><div class='add'>+   SLang_free_mmt (mmt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static int stdio_fputs (char *s, SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+</div><div class='add'>+   if (NULL == (fp = check_fp (t, SL_WRITE)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (EOF == fputs(s, fp)) return -1;</div><div class='add'>+   return (int) strlen (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_fflush (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+</div><div class='add'>+   if (NULL == (fp = check_fp (t, SL_WRITE)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (EOF == fflush (fp))</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Usage: n = fread (&amp;str, data-type, nelems, fp); */</div><div class='add'>+static void stdio_fread (SLang_Ref_Type *ref, int *data_typep, unsigned int *num_elemns, SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+   FILE *fp;</div><div class='add'>+   int ret;</div><div class='add'>+   unsigned int num_read, num_to_read;</div><div class='add'>+   unsigned int nbytes;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+   int data_type;</div><div class='add'>+</div><div class='add'>+   ret = -1;</div><div class='add'>+   s = NULL;</div><div class='add'>+   cl = NULL;</div><div class='add'>+</div><div class='add'>+   if (NULL == (fp = check_fp (t, SL_READ)))</div><div class='add'>+     goto the_return;</div><div class='add'>+</div><div class='add'>+   /* FIXME: priority = low : I should add some mechanism to support</div><div class='add'>+    * other types.</div><div class='add'>+    */</div><div class='add'>+   data_type = *data_typep;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class ((unsigned char) data_type);</div><div class='add'>+</div><div class='add'>+   if (cl-&gt;cl_fread == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "fread does not support %s objects",</div><div class='add'>+		      cl-&gt;cl_name);</div><div class='add'>+	goto the_return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   sizeof_type = cl-&gt;cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+   num_to_read = *num_elemns;</div><div class='add'>+   nbytes = (unsigned int) num_to_read * sizeof_type;</div><div class='add'>+</div><div class='add'>+   s = SLmalloc (nbytes + 1);</div><div class='add'>+   if (s == NULL)</div><div class='add'>+     goto the_return;</div><div class='add'>+</div><div class='add'>+   ret = cl-&gt;cl_fread (data_type, fp, (VOID_STAR)s, num_to_read, &amp;num_read);</div><div class='add'>+</div><div class='add'>+   if ((num_read == 0)</div><div class='add'>+       &amp;&amp; (num_read != num_to_read))</div><div class='add'>+     ret = -1;</div><div class='add'>+</div><div class='add'>+   if ((ret == -1) &amp;&amp; ferror (fp))</div><div class='add'>+     _SLerrno_errno = errno;</div><div class='add'>+</div><div class='add'>+   if ((ret == 0)</div><div class='add'>+       &amp;&amp; (num_read != num_to_read))</div><div class='add'>+     {</div><div class='add'>+	char *new_s;</div><div class='add'>+</div><div class='add'>+	nbytes = num_read * sizeof_type;</div><div class='add'>+	new_s = SLrealloc (s, nbytes + 1);</div><div class='add'>+	if (new_s == NULL)</div><div class='add'>+	  ret = -1;</div><div class='add'>+	else</div><div class='add'>+	  s = new_s;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (ret == 0)</div><div class='add'>+     {</div><div class='add'>+	if (num_read == 1)</div><div class='add'>+	  {</div><div class='add'>+	     ret = SLang_assign_to_ref (ref, data_type, (VOID_STAR)s);</div><div class='add'>+	     SLfree (s);</div><div class='add'>+	  }</div><div class='add'>+	else if ((data_type == SLANG_CHAR_TYPE)</div><div class='add'>+		 || (data_type == SLANG_UCHAR_TYPE))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_BString_Type *bs;</div><div class='add'>+</div><div class='add'>+	     bs = SLbstring_create_malloced ((unsigned char *)s, num_read, 1);</div><div class='add'>+	     ret = SLang_assign_to_ref (ref, SLANG_BSTRING_TYPE, (VOID_STAR)&amp;bs);</div><div class='add'>+	     SLbstring_free (bs);</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     SLang_Array_Type *at;</div><div class='add'>+	     int inum_read = (int) num_read;</div><div class='add'>+	     at = SLang_create_array (data_type, 0, (VOID_STAR)s, &amp;inum_read, 1);</div><div class='add'>+	     ret = SLang_assign_to_ref (ref, SLANG_ARRAY_TYPE, (VOID_STAR)&amp;at);</div><div class='add'>+	     SLang_free_array (at);</div><div class='add'>+	  }</div><div class='add'>+	s = NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   the_return:</div><div class='add'>+</div><div class='add'>+   if (s != NULL)</div><div class='add'>+     SLfree (s);</div><div class='add'>+   </div><div class='add'>+   if (ret == -1)</div><div class='add'>+     SLang_push_integer (ret);</div><div class='add'>+   else</div><div class='add'>+     SLang_push_uinteger (num_read);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Usage: n = fwrite (str, fp); */</div><div class='add'>+static void stdio_fwrite (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+   unsigned char *s;</div><div class='add'>+   unsigned int num_to_write, num_write;</div><div class='add'>+   int ret;</div><div class='add'>+   SLang_BString_Type *b;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   ret = -1;</div><div class='add'>+   b = NULL;</div><div class='add'>+   at = NULL;</div><div class='add'>+</div><div class='add'>+   switch (SLang_peek_at_stack ())</div><div class='add'>+     {</div><div class='add'>+      case SLANG_BSTRING_TYPE:</div><div class='add'>+      case SLANG_STRING_TYPE:</div><div class='add'>+	if (-1 == SLang_pop_bstring (&amp;b))</div><div class='add'>+	  goto the_return;</div><div class='add'>+</div><div class='add'>+	if (NULL == (s = SLbstring_get_pointer (b, &amp;num_to_write)))</div><div class='add'>+	  goto the_return;</div><div class='add'>+</div><div class='add'>+	cl = _SLclass_get_class (SLANG_UCHAR_TYPE);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	if (-1 == SLang_pop_array (&amp;at, 1))</div><div class='add'>+	  goto the_return;</div><div class='add'>+</div><div class='add'>+	cl = at-&gt;cl;</div><div class='add'>+	num_to_write = at-&gt;num_elements;</div><div class='add'>+	s = (unsigned char *) at-&gt;data;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (fp = check_fp (t, SL_WRITE)))</div><div class='add'>+     goto the_return;</div><div class='add'>+</div><div class='add'>+   if (cl-&gt;cl_fwrite == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "fwrite does not support %s objects", cl-&gt;cl_name);</div><div class='add'>+	goto the_return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   ret = cl-&gt;cl_fwrite (cl-&gt;cl_data_type, fp, s, num_to_write, &amp;num_write);</div><div class='add'>+</div><div class='add'>+   if ((ret == -1) &amp;&amp; ferror (fp))</div><div class='add'>+     _SLerrno_errno = errno;</div><div class='add'>+</div><div class='add'>+   /* drop */</div><div class='add'>+   the_return:</div><div class='add'>+   if (b != NULL)</div><div class='add'>+     SLbstring_free (b);</div><div class='add'>+   if (at != NULL)</div><div class='add'>+     SLang_free_array (at);</div><div class='add'>+</div><div class='add'>+   if (ret == -1)</div><div class='add'>+     SLang_push_integer (ret);</div><div class='add'>+   else</div><div class='add'>+     SLang_push_uinteger (num_write);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_fseek (SL_File_Table_Type *t, int *ofs, int *whence)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+</div><div class='add'>+   if (NULL == (fp = check_fp (t, 0xFFFF)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1  == fseek (fp, (long) *ofs, *whence))</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_ftell (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+   long ofs;</div><div class='add'>+</div><div class='add'>+   if (NULL == (fp = check_fp (t, 0xFFFF)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1L == (ofs = ftell (fp)))</div><div class='add'>+     {</div><div class='add'>+	_SLerrno_errno = errno;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return (int) ofs;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_feof (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+</div><div class='add'>+   if (NULL == (fp = check_fp (t, 0xFFFF)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return feof (fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_ferror (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+</div><div class='add'>+   if (NULL == (fp = check_fp (t, 0xFFFF)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return ferror (fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void stdio_clearerr (SL_File_Table_Type *t)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+</div><div class='add'>+   if (NULL != (fp = check_fp (t, 0xFFFF)))</div><div class='add'>+     clearerr (fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* () = fprintf (fp, "FORMAT", arg...); */</div><div class='add'>+static int stdio_fprintf (void)</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+   FILE *fp;</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 2))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   if (-1 == SLang_pop_slstring (&amp;s))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   if (NULL == (mmt = pop_fp (SL_WRITE, &amp;fp)))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (s);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (EOF == fputs(s, fp))</div><div class='add'>+     status = -1;</div><div class='add'>+   else</div><div class='add'>+     status = (int) strlen (s);</div><div class='add'>+</div><div class='add'>+   SLang_free_mmt (mmt);</div><div class='add'>+   SLang_free_slstring (s);</div><div class='add'>+   return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int stdio_printf (void)</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 1))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_slstring (&amp;s))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   if (EOF == fputs(s, stdout))</div><div class='add'>+     status = -1;</div><div class='add'>+   else</div><div class='add'>+     status = (int) strlen (s);</div><div class='add'>+</div><div class='add'>+   SLang_free_slstring (s);</div><div class='add'>+   return status;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+   </div><div class='add'>+#define F SLANG_FILE_PTR_TYPE</div><div class='add'>+#define R SLANG_REF_TYPE</div><div class='add'>+#define I SLANG_INT_TYPE</div><div class='add'>+#define V SLANG_VOID_TYPE</div><div class='add'>+#define S SLANG_STRING_TYPE</div><div class='add'>+#define B SLANG_BSTRING_TYPE</div><div class='add'>+#define U SLANG_UINT_TYPE</div><div class='add'>+#define D SLANG_DATATYPE_TYPE</div><div class='add'>+static SLang_Intrin_Fun_Type Stdio_Name_Table[] =</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_0("fgetslines", stdio_fgetslines, V),</div><div class='add'>+   MAKE_INTRINSIC_SS("fopen", stdio_fopen, V),</div><div class='add'>+   MAKE_INTRINSIC_1("feof", stdio_feof, I, F),</div><div class='add'>+   MAKE_INTRINSIC_1("ferror", stdio_ferror, I, F),</div><div class='add'>+   MAKE_INTRINSIC_1("fclose", stdio_fclose, I, F),</div><div class='add'>+   MAKE_INTRINSIC_2("fgets", stdio_fgets, I, R, F),</div><div class='add'>+   MAKE_INTRINSIC_1("fflush", stdio_fflush, I, F),</div><div class='add'>+   MAKE_INTRINSIC_2("fputs", stdio_fputs, I, S, F),</div><div class='add'>+   MAKE_INTRINSIC_0("fprintf", stdio_fprintf, I),</div><div class='add'>+   MAKE_INTRINSIC_0("printf", stdio_printf, I),</div><div class='add'>+   MAKE_INTRINSIC_3("fseek", stdio_fseek, I, F, I, I),</div><div class='add'>+   MAKE_INTRINSIC_1("ftell", stdio_ftell, I, F),</div><div class='add'>+   MAKE_INTRINSIC_1("clearerr", stdio_clearerr, V, F),</div><div class='add'>+   MAKE_INTRINSIC_4("fread", stdio_fread, V, R, D, U, F),</div><div class='add'>+   MAKE_INTRINSIC_1("fwrite", stdio_fwrite, V, F),</div><div class='add'>+#ifdef HAVE_POPEN</div><div class='add'>+   MAKE_INTRINSIC_SS("popen", stdio_popen, V),</div><div class='add'>+   MAKE_INTRINSIC_1("pclose", stdio_fclose, I, F),</div><div class='add'>+#endif</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+#undef F</div><div class='add'>+#undef I</div><div class='add'>+#undef R</div><div class='add'>+#undef V</div><div class='add'>+#undef S</div><div class='add'>+#undef B</div><div class='add'>+#undef U</div><div class='add'>+#undef D</div><div class='add'>+</div><div class='add'>+#ifndef SEEK_SET</div><div class='add'>+# define SEEK_SET 0</div><div class='add'>+#endif</div><div class='add'>+#ifndef SEEK_CUR</div><div class='add'>+# define SEEK_CUR 1</div><div class='add'>+#endif</div><div class='add'>+#ifndef SEEK_END</div><div class='add'>+# define SEEK_END 2</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static SLang_IConstant_Type Stdio_Consts [] =</div><div class='add'>+{</div><div class='add'>+   MAKE_ICONSTANT("SEEK_SET", SEEK_SET),</div><div class='add'>+   MAKE_ICONSTANT("SEEK_END", SEEK_END),</div><div class='add'>+   MAKE_ICONSTANT("SEEK_CUR", SEEK_CUR),</div><div class='add'>+   SLANG_END_ICONST_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void destroy_file_type (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   (void) close_file_type ((SL_File_Table_Type *) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+struct _SLang_Foreach_Context_Type</div><div class='add'>+{</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+   FILE *fp;</div><div class='add'>+#define CTX_USE_LINE 1</div><div class='add'>+#define CTX_USE_CHAR 2</div><div class='add'>+   unsigned char type;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static SLang_Foreach_Context_Type *</div><div class='add'>+cl_foreach_open (unsigned char type, unsigned int num)</div><div class='add'>+{</div><div class='add'>+   SLang_Foreach_Context_Type *c;</div><div class='add'>+   SLang_MMT_Type *mmt;</div><div class='add'>+   FILE *fp;</div><div class='add'>+</div><div class='add'>+   if (NULL == (mmt = pop_fp (SL_READ, &amp;fp)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   type = CTX_USE_LINE;</div><div class='add'>+</div><div class='add'>+   switch (num)</div><div class='add'>+     {</div><div class='add'>+	char *s;</div><div class='add'>+</div><div class='add'>+      case 0:</div><div class='add'>+	type = CTX_USE_LINE;</div><div class='add'>+	break;</div><div class='add'>+	</div><div class='add'>+      case 1:</div><div class='add'>+	if (-1 == SLang_pop_slstring (&amp;s))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_mmt (mmt);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+	if (0 == strcmp (s, "char"))</div><div class='add'>+	  type = CTX_USE_CHAR;</div><div class='add'>+	else if (0 == strcmp (s, "line"))</div><div class='add'>+	  type = CTX_USE_LINE;</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+			   "using '%s' not supported by File_Type",</div><div class='add'>+			   s);</div><div class='add'>+	     SLang_free_slstring (s);</div><div class='add'>+	     SLang_free_mmt (mmt);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+	SLang_free_slstring (s);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	SLdo_pop_n (num);</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED, </div><div class='add'>+		      "Usage: foreach (File_Type) using ([line|char])");</div><div class='add'>+	SLang_free_mmt (mmt);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (c = (SLang_Foreach_Context_Type *) SLmalloc (sizeof (SLang_Foreach_Context_Type))))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_mmt (mmt);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+</div><div class='add'>+   c-&gt;type = type;</div><div class='add'>+   c-&gt;mmt = mmt;</div><div class='add'>+   c-&gt;fp = fp;</div><div class='add'>+</div><div class='add'>+   return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void cl_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   if (c == NULL) return;</div><div class='add'>+   SLang_free_mmt (c-&gt;mmt);</div><div class='add'>+   SLfree ((char *) c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int cl_foreach (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+   int status;</div><div class='add'>+   int ch;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   char *s;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   if (c == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   switch (c-&gt;type)</div><div class='add'>+     {</div><div class='add'>+      case CTX_USE_CHAR:</div><div class='add'>+	if (EOF == (ch = getc (c-&gt;fp)))</div><div class='add'>+	  return 0;</div><div class='add'>+	if (-1 == SLang_push_uchar ((unsigned char) ch))</div><div class='add'>+	  return -1;</div><div class='add'>+	return 1;</div><div class='add'>+</div><div class='add'>+      case CTX_USE_LINE:</div><div class='add'>+	status = read_one_line (c-&gt;fp, &amp;s, &amp;len);</div><div class='add'>+	if (status &lt;= 0)</div><div class='add'>+	  return status;</div><div class='add'>+	if (0 == _SLang_push_slstring (s))</div><div class='add'>+	  return 1;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int Stdio_Initialized;</div><div class='add'>+static SLang_MMT_Type *Stdio_Mmts[3];</div><div class='add'>+</div><div class='add'>+int SLang_init_stdio (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int i;</div><div class='add'>+   SL_File_Table_Type *s;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   char *names[3];</div><div class='add'>+</div><div class='add'>+   if (Stdio_Initialized)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   SL_File_Table = (SL_File_Table_Type *)SLcalloc(sizeof (SL_File_Table_Type), SL_MAX_FILES);</div><div class='add'>+   if (SL_File_Table == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("File_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+   cl-&gt;cl_destroy = destroy_file_type;</div><div class='add'>+   cl-&gt;cl_foreach_open = cl_foreach_open;</div><div class='add'>+   cl-&gt;cl_foreach_close = cl_foreach_close;</div><div class='add'>+   cl-&gt;cl_foreach = cl_foreach;</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_FILE_PTR_TYPE, sizeof (SL_File_Table_Type), SLANG_CLASS_TYPE_MMT))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLadd_intrin_fun_table(Stdio_Name_Table, "__STDIO__"))</div><div class='add'>+       || (-1 == SLadd_iconstant_table (Stdio_Consts, NULL))</div><div class='add'>+       || (-1 == _SLerrno_init ()))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   names[0] = "stdin";</div><div class='add'>+   names[1] = "stdout";</div><div class='add'>+   names[2] = "stderr";</div><div class='add'>+</div><div class='add'>+   s = SL_File_Table;</div><div class='add'>+   s-&gt;fp = stdin;  s-&gt;flags = SL_READ;</div><div class='add'>+</div><div class='add'>+   s++;</div><div class='add'>+   s-&gt;fp = stdout;  s-&gt;flags = SL_WRITE;</div><div class='add'>+</div><div class='add'>+   s++;</div><div class='add'>+   s-&gt;fp = stderr;  s-&gt;flags = SL_WRITE|SL_READ;</div><div class='add'>+</div><div class='add'>+   s = SL_File_Table;</div><div class='add'>+   for (i = 0; i &lt; 3; i++)</div><div class='add'>+     {</div><div class='add'>+	if (NULL == (s-&gt;file = SLang_create_slstring (names[i])))</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	if (NULL == (Stdio_Mmts[i] = SLang_create_mmt (SLANG_FILE_PTR_TYPE, (VOID_STAR) s)))</div><div class='add'>+	  return -1;</div><div class='add'>+	SLang_inc_mmt (Stdio_Mmts[i]);</div><div class='add'>+</div><div class='add'>+	if (-1 == SLadd_intrinsic_variable (s-&gt;file, (VOID_STAR)&amp;Stdio_Mmts[i], SLANG_FILE_PTR_TYPE, 1))</div><div class='add'>+	  return -1;</div><div class='add'>+	s++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Stdio_Initialized = 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slstring.c b/mdk-stage1/slang/slstring.c<br/>new file mode 100644<br/>index 000000000..529c41827<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slstring.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstring.c</a></div><div class='hunk'>@@ -0,0 +1,546 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+typedef struct _SLstring_Type</div><div class='add'>+{</div><div class='add'>+   struct _SLstring_Type *next;</div><div class='add'>+   unsigned int ref_count;</div><div class='add'>+   char bytes [1];</div><div class='add'>+}</div><div class='add'>+SLstring_Type;</div><div class='add'>+</div><div class='add'>+static SLstring_Type *String_Hash_Table [SLSTRING_HASH_TABLE_SIZE];</div><div class='add'>+static char Single_Char_Strings [256 * 2];</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+#define MAX_FREE_STORE_LEN 32</div><div class='add'>+static SLstring_Type *SLS_Free_Store [MAX_FREE_STORE_LEN];</div><div class='add'>+</div><div class='add'>+# define NUM_CACHED_STRINGS 601</div><div class='add'>+typedef struct </div><div class='add'>+{</div><div class='add'>+   unsigned long hash;</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+   unsigned int len;</div><div class='add'>+}</div><div class='add'>+Cached_String_Type;</div><div class='add'>+static Cached_String_Type Cached_Strings [NUM_CACHED_STRINGS];</div><div class='add'>+</div><div class='add'>+#define GET_CACHED_STRING(s) \</div><div class='add'>+   (Cached_Strings + (unsigned int)(((unsigned long) (s)) % NUM_CACHED_STRINGS))</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static void cache_string (SLstring_Type *sls, unsigned int len, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   Cached_String_Type *cs;</div><div class='add'>+   </div><div class='add'>+   cs = GET_CACHED_STRING(sls-&gt;bytes);</div><div class='add'>+   cs-&gt;sls = sls;</div><div class='add'>+   cs-&gt;hash = hash;</div><div class='add'>+   cs-&gt;len = len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static void uncache_string (char *s)</div><div class='add'>+{</div><div class='add'>+   Cached_String_Type *cs;</div><div class='add'>+   </div><div class='add'>+   cs = GET_CACHED_STRING(s);</div><div class='add'>+   if ((cs-&gt;sls != NULL)</div><div class='add'>+       &amp;&amp; (cs-&gt;sls-&gt;bytes == s))</div><div class='add'>+     cs-&gt;sls = NULL;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+unsigned long _SLstring_hash (unsigned char *s, unsigned char *smax)</div><div class='add'>+{</div><div class='add'>+   register unsigned long h = 0;</div><div class='add'>+   register unsigned long sum = 0;</div><div class='add'>+   unsigned char *smax4;</div><div class='add'>+</div><div class='add'>+   smax4 = smax - 4;</div><div class='add'>+</div><div class='add'>+   while (s &lt; smax4)</div><div class='add'>+     {</div><div class='add'>+	sum += s[0];</div><div class='add'>+	h = sum + (h &lt;&lt; 1);</div><div class='add'>+	sum += s[1];</div><div class='add'>+	h = sum + (h &lt;&lt; 1);</div><div class='add'>+	sum += s[2];</div><div class='add'>+	h = sum + (h &lt;&lt; 1);</div><div class='add'>+	sum += s[3];</div><div class='add'>+	h = sum + (h &lt;&lt; 1);</div><div class='add'>+	</div><div class='add'>+	s += 4;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (s &lt; smax)</div><div class='add'>+     {</div><div class='add'>+	sum += *s++;</div><div class='add'>+	h ^= sum + (h &lt;&lt; 3);	       /* slightly different */</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return h;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned long _SLcompute_string_hash (char *s)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   Cached_String_Type *cs;</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+   cs = GET_CACHED_STRING(s);</div><div class='add'>+   if (((sls = cs-&gt;sls) != NULL)</div><div class='add'>+       &amp;&amp; (sls-&gt;bytes == s))</div><div class='add'>+     return cs-&gt;hash;</div><div class='add'>+#endif</div><div class='add'>+   return _SLstring_hash ((unsigned char *) s, (unsigned char *) s + strlen (s));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+/* This routine works with any (long) string */</div><div class='add'>+static SLstring_Type *find_string (char *s, unsigned int len, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+   char ch;</div><div class='add'>+</div><div class='add'>+   sls = String_Hash_Table [(unsigned int)(hash % SLSTRING_HASH_TABLE_SIZE)];</div><div class='add'>+</div><div class='add'>+   if (sls == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   ch = s[0];</div><div class='add'>+   do</div><div class='add'>+     {</div><div class='add'>+	char *bytes = sls-&gt;bytes;</div><div class='add'>+</div><div class='add'>+	/* Note that we need to actually make sure that bytes[len] == 0. </div><div class='add'>+	 * In this case, it is not enough to just compare pointers.  In fact,</div><div class='add'>+	 * this is called from create_nstring, etc...  It is unlikely that the</div><div class='add'>+	 * pointer is a slstring</div><div class='add'>+	 */</div><div class='add'>+	if ((/* (s == bytes) || */ ((ch == bytes[0])</div><div class='add'>+		 &amp;&amp; (0 == strncmp (s, bytes, len))))</div><div class='add'>+	    &amp;&amp; (bytes [len] == 0))</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	sls = sls-&gt;next;</div><div class='add'>+     }</div><div class='add'>+   while (sls != NULL);</div><div class='add'>+</div><div class='add'>+   return sls;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static SLstring_Type *find_slstring (char *s, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+   sls = String_Hash_Table [(unsigned int)(hash % SLSTRING_HASH_TABLE_SIZE)];</div><div class='add'>+   while (sls != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (s == sls-&gt;bytes)</div><div class='add'>+	  return sls;</div><div class='add'>+</div><div class='add'>+	sls = sls-&gt;next;</div><div class='add'>+     }</div><div class='add'>+   return sls;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static SLstring_Type *allocate_sls (unsigned int len)</div><div class='add'>+{</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+   </div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if ((len &lt; MAX_FREE_STORE_LEN)</div><div class='add'>+       &amp;&amp; (NULL != (sls = SLS_Free_Store [len])))</div><div class='add'>+     {</div><div class='add'>+	SLS_Free_Store[len] = NULL;</div><div class='add'>+	return sls;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   /* FIXME: use structure padding */</div><div class='add'>+   return (SLstring_Type *) SLmalloc (len + sizeof (SLstring_Type));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static void free_sls (SLstring_Type *sls, unsigned int len)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if ((len &lt; MAX_FREE_STORE_LEN)</div><div class='add'>+       &amp;&amp; (SLS_Free_Store[len] == NULL))</div><div class='add'>+     {</div><div class='add'>+	SLS_Free_Store [len] = sls;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+#else</div><div class='add'>+   (void) len;</div><div class='add'>+#endif</div><div class='add'>+   SLfree ((char *)sls);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static char *create_long_string (char *s, unsigned int len, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+   sls = find_string (s, len, hash);</div><div class='add'>+</div><div class='add'>+   if (sls != NULL)</div><div class='add'>+     {</div><div class='add'>+	sls-&gt;ref_count++;</div><div class='add'>+	s = sls-&gt;bytes;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	cache_string (sls, len, hash); </div><div class='add'>+#endif</div><div class='add'>+	return s;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   sls = allocate_sls (len);</div><div class='add'>+   if (sls == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   strncpy (sls-&gt;bytes, s, len);</div><div class='add'>+   sls-&gt;bytes[len] = 0;</div><div class='add'>+   sls-&gt;ref_count = 1;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   cache_string (sls, len, hash);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   hash = hash % SLSTRING_HASH_TABLE_SIZE;</div><div class='add'>+   sls-&gt;next = String_Hash_Table [(unsigned int)hash];</div><div class='add'>+   String_Hash_Table [(unsigned int)hash] = sls;</div><div class='add'>+</div><div class='add'>+   return sls-&gt;bytes;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static char *create_short_string (char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   char ch;</div><div class='add'>+</div><div class='add'>+   /* Note: if len is 0, then it does not matter what *s is.  This is</div><div class='add'>+    * important for SLang_create_nslstring.</div><div class='add'>+    */</div><div class='add'>+   if (len) ch = *s; else ch = 0;</div><div class='add'>+</div><div class='add'>+   len = 2 * (unsigned int) ((unsigned char) ch);</div><div class='add'>+   Single_Char_Strings [len] = ch;</div><div class='add'>+   Single_Char_Strings [len + 1] = 0;</div><div class='add'>+   return Single_Char_Strings + len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* s cannot be NULL */</div><div class='add'>+_INLINE_</div><div class='add'>+static char *create_nstring (char *s, unsigned int len, unsigned long *hash_ptr)</div><div class='add'>+{</div><div class='add'>+   unsigned long hash;</div><div class='add'>+</div><div class='add'>+   if (len &lt; 2)</div><div class='add'>+     return create_short_string (s, len);</div><div class='add'>+</div><div class='add'>+   hash = _SLstring_hash ((unsigned char *) s, (unsigned char *) (s + len));</div><div class='add'>+   *hash_ptr = hash;</div><div class='add'>+</div><div class='add'>+   return create_long_string (s, len, hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLang_create_nslstring (char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   unsigned long hash;</div><div class='add'>+   return create_nstring (s, len, &amp;hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *_SLstring_make_hashed_string (char *s, unsigned int len, unsigned long *hashptr)</div><div class='add'>+{</div><div class='add'>+   unsigned long hash;</div><div class='add'>+</div><div class='add'>+   if (s == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+   hash = _SLstring_hash ((unsigned char *) s, (unsigned char *) s + len);</div><div class='add'>+   *hashptr = hash;</div><div class='add'>+</div><div class='add'>+   if (len &lt; 2)</div><div class='add'>+     return create_short_string (s, len);</div><div class='add'>+</div><div class='add'>+   return create_long_string (s, len, hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *_SLstring_dup_hashed_string (char *s, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   unsigned int len;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   Cached_String_Type *cs;</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+   </div><div class='add'>+   if (s == NULL) return NULL;</div><div class='add'>+   if (s[0] == 0)</div><div class='add'>+     return create_short_string (s, 0);</div><div class='add'>+   if (s[1] == 0)</div><div class='add'>+     return create_short_string (s, 1);</div><div class='add'>+     </div><div class='add'>+   cs = GET_CACHED_STRING(s);</div><div class='add'>+   if (((sls = cs-&gt;sls) != NULL)</div><div class='add'>+       &amp;&amp; (sls-&gt;bytes == s))</div><div class='add'>+     {</div><div class='add'>+	sls-&gt;ref_count += 1;</div><div class='add'>+	return s;</div><div class='add'>+     }</div><div class='add'>+#else</div><div class='add'>+   if (s == NULL) return NULL;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   len = strlen (s);</div><div class='add'>+#if !_SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   if (len &lt; 2) return create_short_string (s, len);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   return create_long_string (s, len, hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *_SLstring_dup_slstring (char *s)</div><div class='add'>+{</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   unsigned long hash;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   Cached_String_Type *cs;</div><div class='add'>+   </div><div class='add'>+   cs = GET_CACHED_STRING(s);</div><div class='add'>+   if (((sls = cs-&gt;sls) != NULL)</div><div class='add'>+       &amp;&amp; (sls-&gt;bytes == s))</div><div class='add'>+     {</div><div class='add'>+	sls-&gt;ref_count += 1;</div><div class='add'>+	return s;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+   </div><div class='add'>+   if ((s == NULL) || ((len = strlen (s)) &lt; 2))</div><div class='add'>+     return s;</div><div class='add'>+</div><div class='add'>+   hash = _SLstring_hash ((unsigned char *)s, (unsigned char *)(s + len));</div><div class='add'>+</div><div class='add'>+   sls = find_slstring (s, hash);</div><div class='add'>+   if (sls == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_INTERNAL_ERROR;</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   sls-&gt;ref_count++;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   cache_string (sls, len, hash);</div><div class='add'>+#endif</div><div class='add'>+   return s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_sls_string (SLstring_Type *sls, char *s, unsigned int len, </div><div class='add'>+			     unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   SLstring_Type *sls1, *prev;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   uncache_string (s);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   hash = hash % SLSTRING_HASH_TABLE_SIZE;</div><div class='add'>+</div><div class='add'>+   sls1 = String_Hash_Table [(unsigned int) hash];</div><div class='add'>+</div><div class='add'>+   prev = NULL;</div><div class='add'>+</div><div class='add'>+   /* This should not fail. */</div><div class='add'>+   while (sls1 != sls)</div><div class='add'>+     {</div><div class='add'>+	prev = sls1;</div><div class='add'>+	sls1 = sls1-&gt;next;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (prev != NULL)</div><div class='add'>+     prev-&gt;next = sls-&gt;next;</div><div class='add'>+   else</div><div class='add'>+     String_Hash_Table [(unsigned int) hash] = sls-&gt;next;</div><div class='add'>+</div><div class='add'>+   free_sls (sls, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static void free_long_string (char *s, unsigned int len, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+   if (NULL == (sls = find_slstring (s, hash)))</div><div class='add'>+     {</div><div class='add'>+	SLang_doerror ("Application internal error: invalid attempt to free string");</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   sls-&gt;ref_count--;</div><div class='add'>+   if (sls-&gt;ref_count != 0)</div><div class='add'>+     {</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	/* cache_string (sls, len, hash); */</div><div class='add'>+#endif</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+</div><div class='add'>+   free_sls_string (sls, s, len, hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This routine may be passed NULL-- it is not an error. */</div><div class='add'>+void SLang_free_slstring (char *s)</div><div class='add'>+{</div><div class='add'>+   unsigned long hash;</div><div class='add'>+   unsigned int len;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   Cached_String_Type *cs;</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+   cs = GET_CACHED_STRING(s);</div><div class='add'>+   if (((sls = cs-&gt;sls) != NULL)</div><div class='add'>+       &amp;&amp; (sls-&gt;bytes == s))</div><div class='add'>+     {</div><div class='add'>+	if (sls-&gt;ref_count &lt;= 1)</div><div class='add'>+	  free_sls_string (sls, s, cs-&gt;len, cs-&gt;hash);</div><div class='add'>+	else</div><div class='add'>+	  sls-&gt;ref_count -= 1;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (s == NULL) return;</div><div class='add'>+</div><div class='add'>+   if ((len = strlen (s)) &lt; 2)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   hash = _SLstring_hash ((unsigned char *)s, (unsigned char *) s + len);</div><div class='add'>+   free_long_string (s, len, hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLang_create_slstring (char *s)</div><div class='add'>+{</div><div class='add'>+   unsigned long hash;</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   Cached_String_Type *cs;</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+   cs = GET_CACHED_STRING(s);</div><div class='add'>+   if (((sls = cs-&gt;sls) != NULL)</div><div class='add'>+       &amp;&amp; (sls-&gt;bytes == s))</div><div class='add'>+     {</div><div class='add'>+	sls-&gt;ref_count += 1;</div><div class='add'>+	return s;</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (s == NULL) return NULL;</div><div class='add'>+   return create_nstring (s, strlen (s), &amp;hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLfree_hashed_string (char *s, unsigned int len, unsigned long hash)</div><div class='add'>+{</div><div class='add'>+   if ((s == NULL) || (len &lt; 2)) return;</div><div class='add'>+   free_long_string (s, len, hash);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+char *_SLallocate_slstring (unsigned int len)</div><div class='add'>+{</div><div class='add'>+   SLstring_Type *sls = allocate_sls (len);</div><div class='add'>+   if (sls == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   return sls-&gt;bytes;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLunallocate_slstring (char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+   </div><div class='add'>+   if (s == NULL)</div><div class='add'>+     return;</div><div class='add'>+   </div><div class='add'>+   sls = (SLstring_Type *) (s - offsetof(SLstring_Type,bytes[0]));</div><div class='add'>+   free_sls (sls, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *_SLcreate_via_alloced_slstring (char *s, unsigned int len)</div><div class='add'>+{   </div><div class='add'>+   unsigned long hash;</div><div class='add'>+   SLstring_Type *sls;</div><div class='add'>+</div><div class='add'>+   if (s == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+   </div><div class='add'>+   if (len &lt; 2)</div><div class='add'>+     {</div><div class='add'>+	char *s1 = create_short_string (s, len);</div><div class='add'>+	_SLunallocate_slstring (s, len);</div><div class='add'>+	return s1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* s is not going to be in the cache because when it was malloced, its</div><div class='add'>+    * value was unknown.  This simplifies the coding.</div><div class='add'>+    */</div><div class='add'>+   hash = _SLstring_hash ((unsigned char *)s, (unsigned char *)s + len);</div><div class='add'>+   sls = find_string (s, len, hash);</div><div class='add'>+   if (sls != NULL)</div><div class='add'>+     {</div><div class='add'>+	sls-&gt;ref_count++;</div><div class='add'>+	_SLunallocate_slstring (s, len);</div><div class='add'>+	s = sls-&gt;bytes;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+	cache_string (sls, len, hash); </div><div class='add'>+#endif</div><div class='add'>+	return s;</div><div class='add'>+     }</div><div class='add'>+	</div><div class='add'>+   sls = (SLstring_Type *) (s - offsetof(SLstring_Type,bytes[0]));</div><div class='add'>+   sls-&gt;ref_count = 1;</div><div class='add'>+</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED</div><div class='add'>+   cache_string (sls, len, hash);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   hash = hash % SLSTRING_HASH_TABLE_SIZE;</div><div class='add'>+   sls-&gt;next = String_Hash_Table [(unsigned int)hash];</div><div class='add'>+   String_Hash_Table [(unsigned int)hash] = sls;</div><div class='add'>+</div><div class='add'>+   return s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note, a and b may be ordinary strings.  The result is an slstring */</div><div class='add'>+char *SLang_concat_slstrings (char *a, char *b)</div><div class='add'>+{</div><div class='add'>+   unsigned int lena, len;</div><div class='add'>+   char *c;</div><div class='add'>+</div><div class='add'>+   lena = strlen (a);</div><div class='add'>+   len = lena + strlen (b);</div><div class='add'>+</div><div class='add'>+   c = _SLallocate_slstring (len);</div><div class='add'>+   if (c == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   strcpy (c, a);</div><div class='add'>+   strcpy (c + lena, b);</div><div class='add'>+</div><div class='add'>+   return _SLcreate_via_alloced_slstring (c, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slstrops.c b/mdk-stage1/slang/slstrops.c<br/>new file mode 100644<br/>index 000000000..a57ef6389<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slstrops.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstrops.c</a></div><div class='hunk'>@@ -0,0 +1,1686 @@</div><div class='add'>+/* -*- mode: C; mode: fold; -*- */</div><div class='add'>+/* string manipulation functions for S-Lang. */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+/*{{{ Include Files */</div><div class='add'>+</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef __QNX__</div><div class='add'>+# if defined(__GO32__) || defined(__WATCOMC__)</div><div class='add'>+#  include &lt;dos.h&gt;</div><div class='add'>+#  include &lt;bios.h&gt;</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+#include &lt;math.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;string.h&gt;</div><div class='add'>+#include &lt;stdarg.h&gt;</div><div class='add'>+#include &lt;ctype.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef isdigit</div><div class='add'>+# define isdigit(x) (((x) &gt;= '0') &amp;&amp; ((x) &lt;= '9'))</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+#define USE_ALLOC_STSTRING 1</div><div class='add'>+</div><div class='add'>+/*{{{ Utility Functions */</div><div class='add'>+</div><div class='add'>+static char Utility_Char_Table [256];</div><div class='add'>+static unsigned char WhiteSpace_Lut[256];</div><div class='add'>+</div><div class='add'>+static void set_utility_char_table (char *pos) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   register char *t = Utility_Char_Table, *tmax;</div><div class='add'>+   register unsigned char ch;</div><div class='add'>+</div><div class='add'>+   tmax = t + 256;</div><div class='add'>+   while (t &lt; tmax) *t++ = 0;</div><div class='add'>+</div><div class='add'>+   t = Utility_Char_Table;</div><div class='add'>+   while ((ch = (unsigned char) *pos++) != 0) t[ch] = 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+_INLINE_</div><div class='add'>+static unsigned char *make_whitespace_lut (void)</div><div class='add'>+{</div><div class='add'>+   if (WhiteSpace_Lut[' '] != 1)</div><div class='add'>+     {</div><div class='add'>+	WhiteSpace_Lut[' '] = WhiteSpace_Lut['\r'] </div><div class='add'>+	  = WhiteSpace_Lut ['\n'] = WhiteSpace_Lut['\t']</div><div class='add'>+	  = WhiteSpace_Lut ['\f'] = 1;</div><div class='add'>+     }</div><div class='add'>+   return WhiteSpace_Lut;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char *make_lut (unsigned char *s, unsigned char *lut)</div><div class='add'>+{</div><div class='add'>+   int reverse = 0;</div><div class='add'>+   </div><div class='add'>+   if (*s == '^')</div><div class='add'>+     {</div><div class='add'>+	reverse = 1;</div><div class='add'>+	s++;</div><div class='add'>+     }</div><div class='add'>+   SLmake_lut (lut, s, reverse);</div><div class='add'>+   return lut;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned int do_trim (char **beg, int do_beg, </div><div class='add'>+			     char **end, int do_end, </div><div class='add'>+			     char *white) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   unsigned int len;</div><div class='add'>+   char *a, *b;</div><div class='add'>+</div><div class='add'>+   set_utility_char_table (white);</div><div class='add'>+</div><div class='add'>+   a = *beg;</div><div class='add'>+   len = strlen (a);</div><div class='add'>+   b = a + len;</div><div class='add'>+</div><div class='add'>+   if (do_beg)</div><div class='add'>+     while (Utility_Char_Table[(unsigned char) *a]) a++;</div><div class='add'>+</div><div class='add'>+   if (do_end)</div><div class='add'>+     {</div><div class='add'>+	b--;</div><div class='add'>+	while ((b &gt;= a) &amp;&amp; (Utility_Char_Table[(unsigned char) *b])) b--;</div><div class='add'>+	b++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   len = (unsigned int) (b - a);</div><div class='add'>+   *beg = a;</div><div class='add'>+   *end = b;</div><div class='add'>+   return len;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int pop_3_strings (char **a, char **b, char **c)</div><div class='add'>+{</div><div class='add'>+   *a = *b = *c = NULL;</div><div class='add'>+   if (-1 == SLpop_string (c))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   if (-1 == SLpop_string (b))</div><div class='add'>+     {</div><div class='add'>+	SLfree (*c);</div><div class='add'>+	*c = NULL;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == SLpop_string (a))</div><div class='add'>+     {</div><div class='add'>+	SLfree (*b);</div><div class='add'>+	SLfree (*c);</div><div class='add'>+	*b = *c = NULL;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void free_3_strings (char *a, char *b, char *c)</div><div class='add'>+{</div><div class='add'>+   SLfree (a);</div><div class='add'>+   SLfree (b);</div><div class='add'>+   SLfree (c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strcat_cmd (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char *c, *c1;</div><div class='add'>+   int nargs;</div><div class='add'>+   int i;</div><div class='add'>+   char **ptrs;</div><div class='add'>+   unsigned int len;</div><div class='add'>+#if !USE_ALLOC_STSTRING</div><div class='add'>+   char buf[256];</div><div class='add'>+#endif</div><div class='add'>+   nargs = SLang_Num_Function_Args;</div><div class='add'>+   if (nargs &lt;= 0) nargs = 2;</div><div class='add'>+</div><div class='add'>+   if (NULL == (ptrs = (char **)SLmalloc (nargs * sizeof (char *))))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   memset ((char *) ptrs, 0, sizeof (char *) * nargs);</div><div class='add'>+</div><div class='add'>+   c = NULL;</div><div class='add'>+   i = nargs;</div><div class='add'>+   len = 0;</div><div class='add'>+   while (i != 0)</div><div class='add'>+     {</div><div class='add'>+	char *s;</div><div class='add'>+</div><div class='add'>+	i--;</div><div class='add'>+	if (-1 == SLang_pop_slstring (&amp;s))</div><div class='add'>+	  goto free_and_return;</div><div class='add'>+	ptrs[i] = s;</div><div class='add'>+	len += strlen (s);</div><div class='add'>+     }</div><div class='add'>+#if USE_ALLOC_STSTRING</div><div class='add'>+   if (NULL == (c = _SLallocate_slstring (len)))</div><div class='add'>+     goto free_and_return;</div><div class='add'>+#else</div><div class='add'>+   len++;			       /* \0 char */</div><div class='add'>+   if (len &lt;= sizeof (buf))</div><div class='add'>+     c = buf;</div><div class='add'>+   else if (NULL == (c = SLmalloc (len)))</div><div class='add'>+     goto free_and_return;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   c1 = c;</div><div class='add'>+   for (i = 0; i &lt; nargs; i++)</div><div class='add'>+     {</div><div class='add'>+	strcpy (c1, ptrs[i]);</div><div class='add'>+	c1 += strlen (c1);</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   free_and_return:</div><div class='add'>+   for (i = 0; i &lt; nargs; i++)</div><div class='add'>+     SLang_free_slstring (ptrs[i]);</div><div class='add'>+   SLfree ((char *) ptrs);</div><div class='add'>+</div><div class='add'>+#if USE_ALLOC_STSTRING</div><div class='add'>+   (void) _SLpush_alloced_slstring (c, len);</div><div class='add'>+#else</div><div class='add'>+   if (c != buf)</div><div class='add'>+     (void) SLang_push_malloced_string (c);   /* NULL ok */</div><div class='add'>+   else</div><div class='add'>+     (void) SLang_push_string (c);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int _SLang_push_nstring (char *a, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   a = SLang_create_nslstring (a, len);</div><div class='add'>+   if (a == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   return _SLang_push_slstring (a);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static void strtrim_cmd_internal (char *str, int do_beg, int do_end)</div><div class='add'>+{</div><div class='add'>+   char *beg, *end, *white;</div><div class='add'>+   int free_str;</div><div class='add'>+   unsigned int len;</div><div class='add'>+</div><div class='add'>+   /* Go through SLpop_string to get a private copy since it will be</div><div class='add'>+    * modified.</div><div class='add'>+    */</div><div class='add'>+   </div><div class='add'>+   free_str = 0;</div><div class='add'>+   if (SLang_Num_Function_Args == 2)</div><div class='add'>+     {</div><div class='add'>+	white = str;</div><div class='add'>+	if (-1 == SLang_pop_slstring (&amp;str))</div><div class='add'>+	  return;</div><div class='add'>+	free_str = 1;</div><div class='add'>+     }</div><div class='add'>+   else white = " \t\f\r\n";</div><div class='add'>+</div><div class='add'>+   beg = str;</div><div class='add'>+   len = do_trim (&amp;beg, do_beg, &amp;end, do_end, white);</div><div class='add'>+   </div><div class='add'>+   (void) _SLang_push_nstring (beg, len);</div><div class='add'>+   if (free_str)</div><div class='add'>+     SLang_free_slstring (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+   </div><div class='add'>+static void strtrim_cmd (char *str)</div><div class='add'>+{</div><div class='add'>+   strtrim_cmd_internal (str, 1, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strtrim_beg_cmd (char *str)</div><div class='add'>+{</div><div class='add'>+   strtrim_cmd_internal (str, 1, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strtrim_end_cmd (char *str)</div><div class='add'>+{</div><div class='add'>+   strtrim_cmd_internal (str, 0, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static void strcompress_cmd (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char *str, *white, *c;</div><div class='add'>+   unsigned char *s, *beg, *end;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   char pref_char;</div><div class='add'>+</div><div class='add'>+   if (SLpop_string (&amp;white)) return;</div><div class='add'>+   if (SLpop_string (&amp;str))</div><div class='add'>+     {</div><div class='add'>+	SLfree (white);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* The first character of white is the preferred whitespace character */</div><div class='add'>+   pref_char = *white;</div><div class='add'>+</div><div class='add'>+   beg = (unsigned char *) str;</div><div class='add'>+   (void) do_trim ((char **) &amp;beg, 1, (char **) &amp;end, 1, white);</div><div class='add'>+   SLfree (white);</div><div class='add'>+</div><div class='add'>+   /* Determine the effective length */</div><div class='add'>+   len = 0;</div><div class='add'>+   s = (unsigned char *) beg;</div><div class='add'>+   while (s &lt; end)</div><div class='add'>+     {</div><div class='add'>+	len++;</div><div class='add'>+	if (Utility_Char_Table[*s++])</div><div class='add'>+	  {</div><div class='add'>+	     while ((s &lt; end) &amp;&amp; Utility_Char_Table[*s]) s++;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#if USE_ALLOC_STSTRING</div><div class='add'>+   c = _SLallocate_slstring (len);</div><div class='add'>+#else</div><div class='add'>+   c = SLmalloc (len + 1);</div><div class='add'>+#endif</div><div class='add'>+   if (c == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLfree (str);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   s = (unsigned char *) c;</div><div class='add'>+</div><div class='add'>+   while (beg &lt; end)</div><div class='add'>+     {</div><div class='add'>+	unsigned char ch = *beg++;</div><div class='add'>+	</div><div class='add'>+	if (0 == Utility_Char_Table[ch])</div><div class='add'>+	  {</div><div class='add'>+	     *s++ = ch;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+	</div><div class='add'>+	*s++ = (unsigned char) pref_char;</div><div class='add'>+	</div><div class='add'>+	while ((beg &lt; end) &amp;&amp; Utility_Char_Table[*beg]) </div><div class='add'>+	  beg++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *s = 0;</div><div class='add'>+   </div><div class='add'>+#if USE_ALLOC_STSTRING</div><div class='add'>+   (void) _SLpush_alloced_slstring (c, len);</div><div class='add'>+#else</div><div class='add'>+   SLang_push_malloced_string(c);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   SLfree(str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int str_replace_cmd_1 (char *orig, char *match, char *rep, unsigned int max_num_replaces,</div><div class='add'>+			      char **new_strp) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char *s, *t, *new_str;</div><div class='add'>+   unsigned int rep_len, match_len, new_len;</div><div class='add'>+   unsigned int num_replaces;</div><div class='add'>+</div><div class='add'>+   *new_strp = NULL;</div><div class='add'>+</div><div class='add'>+   match_len = strlen (match);</div><div class='add'>+</div><div class='add'>+   if (match_len == 0)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   num_replaces = 0;</div><div class='add'>+   s = orig;</div><div class='add'>+   while (num_replaces &lt; max_num_replaces)</div><div class='add'>+     {</div><div class='add'>+	s = strstr (s, match);</div><div class='add'>+	if (s == NULL)</div><div class='add'>+	  break;</div><div class='add'>+	s += match_len;</div><div class='add'>+	num_replaces++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (num_replaces == 0)</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   max_num_replaces = num_replaces;</div><div class='add'>+</div><div class='add'>+   rep_len = strlen (rep);</div><div class='add'>+</div><div class='add'>+   new_len = (strlen (orig) - num_replaces * match_len) + num_replaces * rep_len;</div><div class='add'>+   new_str = SLmalloc (new_len + 1);</div><div class='add'>+   if (new_str == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   s = orig;</div><div class='add'>+   t = new_str;</div><div class='add'>+   </div><div class='add'>+   for (num_replaces = 0; num_replaces &lt; max_num_replaces; num_replaces++)</div><div class='add'>+     {</div><div class='add'>+	char *next_s;</div><div class='add'>+	unsigned int len;</div><div class='add'>+</div><div class='add'>+	next_s = strstr (s, match);    /* cannot be NULL */</div><div class='add'>+	len = (unsigned int) (next_s - s);</div><div class='add'>+	strncpy (t, s, len);</div><div class='add'>+	t += len;</div><div class='add'>+	strcpy (t, rep);</div><div class='add'>+	t += rep_len;</div><div class='add'>+	</div><div class='add'>+	s = next_s + match_len;</div><div class='add'>+     }</div><div class='add'>+   strcpy (t, s);</div><div class='add'>+   *new_strp = new_str;</div><div class='add'>+</div><div class='add'>+   return (int) num_replaces;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void reverse_string (char *a)</div><div class='add'>+{</div><div class='add'>+   char *b;</div><div class='add'>+   </div><div class='add'>+   b = a + strlen (a);</div><div class='add'>+   while (b &gt; a)</div><div class='add'>+     {</div><div class='add'>+	char ch;</div><div class='add'>+</div><div class='add'>+	b--;</div><div class='add'>+	ch = *a;</div><div class='add'>+	*a++ = *b;</div><div class='add'>+	*b = ch;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int strreplace_cmd (int *np)</div><div class='add'>+{   </div><div class='add'>+   char *orig, *match, *rep;</div><div class='add'>+   char *new_str;</div><div class='add'>+   int max_num_replaces;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   max_num_replaces = *np;</div><div class='add'>+</div><div class='add'>+   if (-1 == pop_3_strings (&amp;orig, &amp;match, &amp;rep))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (max_num_replaces &lt; 0)</div><div class='add'>+     {</div><div class='add'>+	reverse_string (orig);</div><div class='add'>+	reverse_string (match);</div><div class='add'>+	reverse_string (rep);</div><div class='add'>+	ret = str_replace_cmd_1 (orig, match, rep, -max_num_replaces, &amp;new_str);</div><div class='add'>+	if (ret &gt; 0) reverse_string (new_str);</div><div class='add'>+	else if (ret == 0)</div><div class='add'>+	  reverse_string (orig);</div><div class='add'>+     }</div><div class='add'>+   else ret = str_replace_cmd_1 (orig, match, rep, max_num_replaces, &amp;new_str);</div><div class='add'>+   </div><div class='add'>+   if (ret == 0)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLang_push_malloced_string (orig))</div><div class='add'>+	  ret = -1;</div><div class='add'>+	orig = NULL;</div><div class='add'>+     }</div><div class='add'>+   else if (ret &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	if (-1 == SLang_push_malloced_string (new_str))</div><div class='add'>+	  ret = -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   free_3_strings (orig, match, rep);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int str_replace_cmd (char *orig, char *match, char *rep)</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   ret = str_replace_cmd_1 (orig, match, rep, 1, &amp;s);</div><div class='add'>+   if (ret == 1)</div><div class='add'>+     (void) SLang_push_malloced_string (s);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+	</div><div class='add'>+     </div><div class='add'>+static void strtok_cmd (char *str)</div><div class='add'>+{</div><div class='add'>+   _SLString_List_Type sl;</div><div class='add'>+   unsigned char white_buf[256];</div><div class='add'>+   char *s;</div><div class='add'>+   unsigned char *white;</div><div class='add'>+   </div><div class='add'>+   if (SLang_Num_Function_Args == 1)</div><div class='add'>+     white = make_whitespace_lut ();</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	white = white_buf;</div><div class='add'>+	make_lut ((unsigned char *)str, white);</div><div class='add'>+	if (-1 == SLang_pop_slstring (&amp;str))</div><div class='add'>+	  return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLstring_list_init (&amp;sl, 256, 1024))</div><div class='add'>+     goto the_return;</div><div class='add'>+</div><div class='add'>+   s = str;</div><div class='add'>+   while (*s != 0)</div><div class='add'>+     {</div><div class='add'>+	char *s0;</div><div class='add'>+</div><div class='add'>+	s0 = s;</div><div class='add'>+	/* Skip whitespace */</div><div class='add'>+	while ((*s0 != 0) &amp;&amp; (0 != white[(unsigned char)*s0]))</div><div class='add'>+	  s0++;</div><div class='add'>+</div><div class='add'>+	if (*s0 == 0)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	s = s0;</div><div class='add'>+	while ((*s != 0) &amp;&amp; (0 == white[(unsigned char) *s]))</div><div class='add'>+	  s++;</div><div class='add'>+</div><div class='add'>+	/* sl deleted upon failure */</div><div class='add'>+	if (-1 == _SLstring_list_append (&amp;sl, SLang_create_nslstring (s0, (unsigned int) (s - s0))))</div><div class='add'>+	  goto the_return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* Deletes sl */</div><div class='add'>+   (void) _SLstring_list_push (&amp;sl);</div><div class='add'>+</div><div class='add'>+   the_return:</div><div class='add'>+   if (white == white_buf)</div><div class='add'>+     SLang_free_slstring (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This routine returns the string with text removed between single character</div><div class='add'>+   comment delimiters from the set b and e. */</div><div class='add'>+</div><div class='add'>+static void str_uncomment_string_cmd (char *str, char *b, char *e) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   unsigned char chb, che;</div><div class='add'>+   unsigned char *s, *cbeg, *mark;</div><div class='add'>+</div><div class='add'>+   if (strlen(b) != strlen(e))</div><div class='add'>+     {</div><div class='add'>+	SLang_doerror ("Comment delimiter length mismatch.");</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   set_utility_char_table (b);</div><div class='add'>+</div><div class='add'>+   if (NULL == (str = (char *) SLmake_string(str))) return;</div><div class='add'>+</div><div class='add'>+   s = (unsigned char *) str;</div><div class='add'>+</div><div class='add'>+   while ((chb = *s++) != 0)</div><div class='add'>+     {</div><div class='add'>+	if (Utility_Char_Table [chb] == 0) continue;</div><div class='add'>+</div><div class='add'>+	mark = s - 1;</div><div class='add'>+</div><div class='add'>+	cbeg = (unsigned char *) b;</div><div class='add'>+	while (*cbeg != chb) cbeg++;</div><div class='add'>+</div><div class='add'>+	che = (unsigned char) *(e + (int) (cbeg - (unsigned char *) b));</div><div class='add'>+</div><div class='add'>+	while (((chb = *s++) != 0) &amp;&amp; (chb != che));</div><div class='add'>+</div><div class='add'>+	if (chb == 0)</div><div class='add'>+	  {</div><div class='add'>+	     /* end of string and end not found.  Just truncate it a return; */</div><div class='add'>+	     *mark = 0;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	strcpy ((char *) mark, (char *)s);</div><div class='add'>+	s = mark;</div><div class='add'>+     }</div><div class='add'>+   SLang_push_malloced_string (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void str_quote_string_cmd (char *str, char *quotes, int *slash_ptr) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char *q;</div><div class='add'>+   int slash;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   register char *t, *s, *q1;</div><div class='add'>+   register unsigned char ch;</div><div class='add'>+</div><div class='add'>+   slash = *slash_ptr;</div><div class='add'>+</div><div class='add'>+   if ((slash &gt; 255) || (slash &lt; 0))</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_INVALID_PARM;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* setup the utility table to have 1s at quote char postitions. */</div><div class='add'>+   set_utility_char_table (quotes);</div><div class='add'>+</div><div class='add'>+   t = Utility_Char_Table;</div><div class='add'>+   t[(unsigned int) slash] = 1;</div><div class='add'>+</div><div class='add'>+   /* calculate length */</div><div class='add'>+   s = str;</div><div class='add'>+   len = 0;</div><div class='add'>+   while ((ch = (unsigned char) *s++) != 0) if (t[ch]) len++;</div><div class='add'>+   len += (unsigned int) (s - str);</div><div class='add'>+</div><div class='add'>+   if (NULL != (q = SLmalloc(len)))</div><div class='add'>+     {</div><div class='add'>+	s = str; q1 = q;</div><div class='add'>+	while ((ch = (unsigned char) *s++) != 0)</div><div class='add'>+	  {</div><div class='add'>+	     if (t[ch]) *q1++ = slash;</div><div class='add'>+	     *q1++ = (char) ch;</div><div class='add'>+	  }</div><div class='add'>+	*q1 = 0;</div><div class='add'>+	SLang_push_malloced_string(q);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* returns the position of substrin in a string or null */</div><div class='add'>+static int issubstr_cmd (char *a, char *b) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char *c;</div><div class='add'>+</div><div class='add'>+   if (NULL == (c = (char *) strstr(a, b)))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   return 1 + (int) (c - a);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* returns to stack string at pos n to n + m of a */</div><div class='add'>+static void substr_cmd (char *a, int *n_ptr, int *m_ptr) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   int n, m;</div><div class='add'>+   int lena;</div><div class='add'>+</div><div class='add'>+   n = *n_ptr;</div><div class='add'>+   m = *m_ptr;</div><div class='add'>+</div><div class='add'>+   lena = strlen (a);</div><div class='add'>+   if (n &gt; lena) n = lena + 1;</div><div class='add'>+   if (n &lt; 1)</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_INVALID_PARM;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   n--;</div><div class='add'>+   if (m &lt; 0) m = lena;</div><div class='add'>+   if (n + m &gt; lena) m = lena - n;</div><div class='add'>+   </div><div class='add'>+   (void) _SLang_push_nstring (a + n, (unsigned int) m);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* substitute char m at positin string n in string*/</div><div class='add'>+static void strsub_cmd (int *nptr, int *mptr) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char *a;</div><div class='add'>+   int n, m;</div><div class='add'>+   unsigned int lena;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLpop_string (&amp;a))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   n = *nptr;</div><div class='add'>+   m = *mptr;</div><div class='add'>+</div><div class='add'>+   lena = strlen (a);</div><div class='add'>+</div><div class='add'>+   if ((n &lt;= 0) || (lena &lt; (unsigned int) n))</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_INVALID_PARM;</div><div class='add'>+	SLfree(a);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   a[n - 1] = (char) m;</div><div class='add'>+</div><div class='add'>+   SLang_push_malloced_string (a);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void strup_cmd(void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   unsigned char c, *a;</div><div class='add'>+   char *str;</div><div class='add'>+</div><div class='add'>+   if (SLpop_string (&amp;str))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   a = (unsigned char *) str;</div><div class='add'>+   while ((c = *a) != 0)</div><div class='add'>+     {</div><div class='add'>+	/* if ((*a &gt;= 'a') &amp;&amp; (*a &lt;= 'z')) *a -= 32; */</div><div class='add'>+	*a = UPPER_CASE(c);</div><div class='add'>+	a++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_push_malloced_string (str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int isdigit_cmd (char *what) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   return isdigit((unsigned char)*what);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+static int toupper_cmd (int *ch) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   return UPPER_CASE(*ch);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int tolower_cmd (int *ch) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   return LOWER_CASE(*ch);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void strlow_cmd (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   unsigned char c, *a;</div><div class='add'>+   char *str;</div><div class='add'>+</div><div class='add'>+   if (SLpop_string(&amp;str)) return;</div><div class='add'>+   a = (unsigned char *) str;</div><div class='add'>+   while ((c = *a) != 0)</div><div class='add'>+     {</div><div class='add'>+	/* if ((*a &gt;= 'a') &amp;&amp; (*a &lt;= 'z')) *a -= 32; */</div><div class='add'>+	*a = LOWER_CASE(c);</div><div class='add'>+	a++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_push_malloced_string ((char *) str);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static SLang_Array_Type *do_strchop (char *str, int delim, int quote)</div><div class='add'>+{</div><div class='add'>+   int count;</div><div class='add'>+   char *s0, *elm;</div><div class='add'>+   register char *s1;</div><div class='add'>+   register unsigned char ch;</div><div class='add'>+   int quoted;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   char **data;</div><div class='add'>+</div><div class='add'>+   if ((quote &lt; 0) || (quote &gt; 255)</div><div class='add'>+       || (delim &lt;= 0) || (delim &gt; 255))</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_INVALID_PARM;</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   s1 = s0 = str;</div><div class='add'>+</div><div class='add'>+   quoted = 0;</div><div class='add'>+   count = 1;			       /* at least 1 */</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	ch = (unsigned char) *s1++;</div><div class='add'>+	if ((ch == quote) &amp;&amp; quote)</div><div class='add'>+	  {</div><div class='add'>+	     if (*s1 == 0)</div><div class='add'>+	       break;</div><div class='add'>+</div><div class='add'>+	     s1++;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (ch == delim)</div><div class='add'>+	  {</div><div class='add'>+	     count++;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (ch == 0)</div><div class='add'>+	  break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &amp;count, 1)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   data = (char **)at-&gt;data;</div><div class='add'>+</div><div class='add'>+   count = 0;</div><div class='add'>+   s1 = s0;</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	ch = (unsigned char) *s1;</div><div class='add'>+</div><div class='add'>+	if ((ch == quote) &amp;&amp; quote)</div><div class='add'>+	  {</div><div class='add'>+	     s1++;</div><div class='add'>+	     if (*s1 != 0) s1++;</div><div class='add'>+	     quoted = 1;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if ((ch == delim) || (ch == 0))</div><div class='add'>+	  {</div><div class='add'>+	     if (quoted == 0)</div><div class='add'>+	       elm = SLang_create_nslstring (s0, (unsigned int) (s1 - s0));</div><div class='add'>+	     else</div><div class='add'>+	       {</div><div class='add'>+		  register char ch1, *p, *p1;</div><div class='add'>+		  char *tmp;</div><div class='add'>+</div><div class='add'>+		  tmp = SLmake_nstring (s0, (unsigned int)(s1 - s0));</div><div class='add'>+		  if (tmp == NULL)</div><div class='add'>+		    break;</div><div class='add'>+</div><div class='add'>+		  /* Now unquote it */</div><div class='add'>+		  p = p1 = tmp;</div><div class='add'>+		  do</div><div class='add'>+		    {</div><div class='add'>+		       ch1 = *p1++;</div><div class='add'>+		       if (ch1 == '\\') ch1 = *p1++;</div><div class='add'>+		       *p++ = ch1;</div><div class='add'>+		    }</div><div class='add'>+		  while (ch1 != 0);</div><div class='add'>+		  quoted = 0;</div><div class='add'>+</div><div class='add'>+		  elm = SLang_create_slstring (tmp);</div><div class='add'>+		  SLfree (tmp);</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     if (elm == NULL)</div><div class='add'>+	       break;</div><div class='add'>+</div><div class='add'>+	     data[count] = elm;</div><div class='add'>+	     count++;</div><div class='add'>+</div><div class='add'>+	     if (ch == 0)</div><div class='add'>+	       return at;</div><div class='add'>+</div><div class='add'>+	     s1++;		       /* skip past delim */</div><div class='add'>+	     s0 = s1;		       /* and reset */</div><div class='add'>+	  }</div><div class='add'>+	else s1++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strchop_cmd (char *str, int *q, int *d)</div><div class='add'>+{</div><div class='add'>+   (void) SLang_push_array (do_strchop (str, *q, *d), 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strchopr_cmd (char *str, int *q, int *d)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+</div><div class='add'>+   if (NULL != (at = do_strchop (str, *q, *d)))</div><div class='add'>+     {</div><div class='add'>+	char **d0, **d1;</div><div class='add'>+</div><div class='add'>+	d0 = (char **) at-&gt;data;</div><div class='add'>+	d1 = d0 + (at-&gt;num_elements - 1);</div><div class='add'>+</div><div class='add'>+	while (d0 &lt; d1)</div><div class='add'>+	  {</div><div class='add'>+	     char *tmp;</div><div class='add'>+</div><div class='add'>+	     tmp = *d0;</div><div class='add'>+	     *d0 = *d1;</div><div class='add'>+	     *d1 = tmp;</div><div class='add'>+	     d0++;</div><div class='add'>+	     d1--;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int strcmp_cmd (char *a, char *b) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   return strcmp(a, b);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int strncmp_cmd (char *a, char *b, int *n) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   return strncmp(a, b, (unsigned int) *n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int strlen_cmd (char *s) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   return (int) strlen (s);</div><div class='add'>+}</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void extract_element_cmd (char *list, int *nth_ptr, int *delim_ptr)</div><div class='add'>+{</div><div class='add'>+   char buf[1024], *b;</div><div class='add'>+</div><div class='add'>+   b = buf;</div><div class='add'>+   if (-1 == SLextract_list_element (list, *nth_ptr, *delim_ptr, buf, sizeof(buf)))</div><div class='add'>+     b = NULL;</div><div class='add'>+</div><div class='add'>+   SLang_push_string (b);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* sprintf functionality for S-Lang */</div><div class='add'>+</div><div class='add'>+static char *SLdo_sprintf (char *fmt) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   register char *p = fmt, ch;</div><div class='add'>+   char *out = NULL, *outp = NULL;</div><div class='add'>+   char dfmt[1024];	       /* used to hold part of format */</div><div class='add'>+   char *f;</div><div class='add'>+   VOID_STAR varp;</div><div class='add'>+   int want_width, width, precis, use_varp, int_var;</div><div class='add'>+   long long_var;</div><div class='add'>+   unsigned int len = 0, malloc_len = 0, dlen;</div><div class='add'>+   int do_free, guess_size;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   int tmp1, tmp2, use_double;</div><div class='add'>+   double x;</div><div class='add'>+#endif</div><div class='add'>+   int use_long = 0;</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	while ((ch = *p) != 0)</div><div class='add'>+	  {</div><div class='add'>+	     if (ch == '%')</div><div class='add'>+	       break;</div><div class='add'>+	     p++;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* p points at '%' or 0 */</div><div class='add'>+</div><div class='add'>+	dlen = (unsigned int) (p - fmt);</div><div class='add'>+</div><div class='add'>+	if (len + dlen &gt;= malloc_len)</div><div class='add'>+	  {</div><div class='add'>+	     malloc_len = len + dlen;</div><div class='add'>+	     if (out == NULL) outp = SLmalloc(malloc_len + 1);</div><div class='add'>+	     else outp = SLrealloc(out, malloc_len + 1);</div><div class='add'>+	     if (NULL == outp)</div><div class='add'>+	       return out;</div><div class='add'>+	     out = outp;</div><div class='add'>+	     outp = out + len;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	strncpy(outp, fmt, dlen);</div><div class='add'>+	len += dlen;</div><div class='add'>+	outp = out + len;</div><div class='add'>+	*outp = 0;</div><div class='add'>+	if (ch == 0) break;</div><div class='add'>+</div><div class='add'>+	/* bump it beyond '%' */</div><div class='add'>+	++p;</div><div class='add'>+	fmt = p;</div><div class='add'>+</div><div class='add'>+	f = dfmt;</div><div class='add'>+	*f++ = ch;</div><div class='add'>+	/* handle flag char */</div><div class='add'>+	ch = *p++;</div><div class='add'>+</div><div class='add'>+	/* Make sure cases such as "% #g" can be handled. */</div><div class='add'>+	if ((ch == '-') || (ch == '+') || (ch == ' ') || (ch == '#'))</div><div class='add'>+	  {</div><div class='add'>+	     *f++ = ch;</div><div class='add'>+	     ch = *p++;</div><div class='add'>+	     if ((ch == '-') || (ch == '+') || (ch == ' ') || (ch == '#'))</div><div class='add'>+	       {</div><div class='add'>+		  *f++ = ch;</div><div class='add'>+		  ch = *p++;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+	/* width */</div><div class='add'>+	/* I have got to parse it myself so that I can see how big it needs</div><div class='add'>+	 * to be.</div><div class='add'>+	 */</div><div class='add'>+	want_width = width = 0;</div><div class='add'>+	if (ch == '*')</div><div class='add'>+	  {</div><div class='add'>+	     if (SLang_pop_integer(&amp;width)) return (out);</div><div class='add'>+	     want_width = 1;</div><div class='add'>+	     ch = *p++;</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     if (ch == '0')</div><div class='add'>+	       {</div><div class='add'>+		  *f++ = '0';</div><div class='add'>+		  ch = *p++;</div><div class='add'>+	       }</div><div class='add'>+</div><div class='add'>+	     while ((ch &lt;= '9') &amp;&amp; (ch &gt;= '0'))</div><div class='add'>+	       {</div><div class='add'>+		  width = width * 10 + (ch - '0');</div><div class='add'>+		  ch = *p++;</div><div class='add'>+		  want_width = 1;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (want_width)</div><div class='add'>+	  {</div><div class='add'>+	     sprintf(f, "%d", width);</div><div class='add'>+	     f += strlen (f);</div><div class='add'>+	  }</div><div class='add'>+	precis = 0;</div><div class='add'>+	/* precision -- also indicates max number of chars from string */</div><div class='add'>+	if (ch == '.')</div><div class='add'>+	  {</div><div class='add'>+	     *f++ = ch;</div><div class='add'>+	     ch = *p++;</div><div class='add'>+	     want_width = 0;</div><div class='add'>+	     if (ch == '*')</div><div class='add'>+	       {</div><div class='add'>+		  if (SLang_pop_integer(&amp;precis)) return (out);</div><div class='add'>+		  ch = *p++;</div><div class='add'>+		  want_width = 1;</div><div class='add'>+	       }</div><div class='add'>+	     else while ((ch &lt;= '9') &amp;&amp; (ch &gt;= '0'))</div><div class='add'>+	       {</div><div class='add'>+		  precis = precis * 10 + (ch - '0');</div><div class='add'>+		  ch = *p++;</div><div class='add'>+		  want_width = 1;</div><div class='add'>+	       }</div><div class='add'>+	     if (want_width)</div><div class='add'>+	       {</div><div class='add'>+		  sprintf(f, "%d", precis);</div><div class='add'>+		  f += strlen (f);</div><div class='add'>+	       }</div><div class='add'>+	     else precis = 0;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	long_var = 0;</div><div class='add'>+	int_var = 0;</div><div class='add'>+	varp = NULL;</div><div class='add'>+	guess_size = 32;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	use_double = 0;</div><div class='add'>+#endif</div><div class='add'>+	use_long = 0;</div><div class='add'>+	use_varp = 0;</div><div class='add'>+	do_free = 0;</div><div class='add'>+</div><div class='add'>+	if (ch == 'l')</div><div class='add'>+	  {</div><div class='add'>+	     use_long = 1;</div><div class='add'>+	     ch = *p++;</div><div class='add'>+	  }</div><div class='add'>+	else if (ch == 'h') ch = *p++; /* not supported */</div><div class='add'>+</div><div class='add'>+	/* Now the actual format specifier */</div><div class='add'>+	switch (ch)</div><div class='add'>+	  {</div><div class='add'>+	   case 'S':</div><div class='add'>+	     _SLstring_intrinsic ();</div><div class='add'>+	     ch = 's';</div><div class='add'>+	     /* drop */</div><div class='add'>+	   case 's':</div><div class='add'>+	     if (SLang_pop_slstring((char **) &amp;varp)) return (out);</div><div class='add'>+	     do_free = 1;</div><div class='add'>+	     guess_size = strlen((char *) varp);</div><div class='add'>+	     use_varp = 1;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '%':</div><div class='add'>+	     guess_size = 1;</div><div class='add'>+	     do_free = 0;</div><div class='add'>+	     use_varp = 1;</div><div class='add'>+	     varp = (VOID_STAR) "%";</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 'c': guess_size = 1;</div><div class='add'>+	     use_long = 0;</div><div class='add'>+	     /* drop */</div><div class='add'>+	   case 'd':</div><div class='add'>+	   case 'i':</div><div class='add'>+	   case 'o':</div><div class='add'>+	   case 'u':</div><div class='add'>+	   case 'X':</div><div class='add'>+	   case 'x':</div><div class='add'>+	     if (SLang_pop_long (&amp;long_var)) return(out);</div><div class='add'>+	     if (use_long == 0)</div><div class='add'>+	       int_var = (int) long_var;</div><div class='add'>+	     else</div><div class='add'>+	       *f++ = 'l';</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 'f':</div><div class='add'>+	   case 'e':</div><div class='add'>+	   case 'g':</div><div class='add'>+	   case 'E':</div><div class='add'>+	   case 'G':</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	     if (SLang_pop_double(&amp;x, &amp;tmp1, &amp;tmp2)) return (out);</div><div class='add'>+	     use_double = 1;</div><div class='add'>+	     guess_size = 256;</div><div class='add'>+	     (void) tmp1; (void) tmp2;</div><div class='add'>+	     use_long = 0;</div><div class='add'>+	     break;</div><div class='add'>+#endif</div><div class='add'>+	   case 'p':</div><div class='add'>+	     guess_size = 32;</div><div class='add'>+	     /* Pointer type?? Why?? */</div><div class='add'>+	     if (-1 == SLdo_pop ())</div><div class='add'>+	       return out;</div><div class='add'>+	     varp = (VOID_STAR) _SLStack_Pointer;</div><div class='add'>+	     use_varp = 1;</div><div class='add'>+	     use_long = 0;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   default:</div><div class='add'>+	     SLang_doerror("Invalid Format.");</div><div class='add'>+	     return(out);</div><div class='add'>+	  }</div><div class='add'>+	*f++ = ch; *f = 0;</div><div class='add'>+</div><div class='add'>+	width = width + precis;</div><div class='add'>+	if (width &gt; guess_size) guess_size = width;</div><div class='add'>+</div><div class='add'>+	if (len + guess_size &gt; malloc_len)</div><div class='add'>+	  {</div><div class='add'>+	     outp = (char *) SLrealloc(out, len + guess_size + 1);</div><div class='add'>+	     if (outp == NULL)</div><div class='add'>+	       {</div><div class='add'>+		  SLang_Error = SL_MALLOC_ERROR;</div><div class='add'>+		  return (out);</div><div class='add'>+	       }</div><div class='add'>+	     out = outp;</div><div class='add'>+	     outp = out + len;</div><div class='add'>+	     malloc_len = len + guess_size;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (use_varp)</div><div class='add'>+	  {</div><div class='add'>+	     sprintf(outp, dfmt, varp);</div><div class='add'>+	     if (do_free) SLang_free_slstring ((char *)varp);</div><div class='add'>+	  }</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+	else if (use_double) sprintf(outp, dfmt, x);</div><div class='add'>+#endif</div><div class='add'>+	else if (use_long) sprintf (outp, dfmt, long_var);</div><div class='add'>+	else sprintf(outp, dfmt, int_var);</div><div class='add'>+</div><div class='add'>+	len += strlen(outp);</div><div class='add'>+	outp = out + len;</div><div class='add'>+	fmt = p;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (out != NULL)</div><div class='add'>+     {</div><div class='add'>+	outp = SLrealloc (out, (unsigned int) (outp - out) + 1);</div><div class='add'>+	if (outp != NULL) out = outp;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return (out);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int _SLstrops_do_sprintf_n (int n) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char *p;</div><div class='add'>+   char *fmt;</div><div class='add'>+   SLang_Object_Type *ptr;</div><div class='add'>+   int ofs;</div><div class='add'>+</div><div class='add'>+   if (-1 == (ofs = SLreverse_stack (n + 1)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   ptr = _SLRun_Stack + ofs;</div><div class='add'>+</div><div class='add'>+   if (SLang_pop_slstring(&amp;fmt))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   p = SLdo_sprintf (fmt);</div><div class='add'>+   SLang_free_slstring (fmt);</div><div class='add'>+</div><div class='add'>+   while (_SLStack_Pointer &gt; ptr)</div><div class='add'>+     SLdo_pop ();</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     {</div><div class='add'>+	SLfree (p);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   return SLang_push_malloced_string (p);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static void sprintf_n_cmd (int *n)</div><div class='add'>+{</div><div class='add'>+   _SLstrops_do_sprintf_n (*n);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sprintf_cmd (void)</div><div class='add'>+{</div><div class='add'>+   _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 1);    /* do not include format */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* converts string s to a form that can be used in an eval */</div><div class='add'>+static void make_printable_string(char *s) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   unsigned int len;</div><div class='add'>+   register char *s1 = s, ch, *ss1;</div><div class='add'>+   char *ss;</div><div class='add'>+</div><div class='add'>+   /* compute length */</div><div class='add'>+   len = 3;</div><div class='add'>+   while ((ch = *s1++) != 0)</div><div class='add'>+     {</div><div class='add'>+	if ((ch == '\n') || (ch == '\\') || (ch == '"')) len++;</div><div class='add'>+	len++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (ss = SLmalloc(len)))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   s1 = s;</div><div class='add'>+   ss1 = ss;</div><div class='add'>+   *ss1++ = '"';</div><div class='add'>+   while ((ch = *s1++) != 0)</div><div class='add'>+     {</div><div class='add'>+	if (ch == '\n')</div><div class='add'>+	  {</div><div class='add'>+	     ch = 'n';</div><div class='add'>+	     *ss1++ = '\\';</div><div class='add'>+	  }</div><div class='add'>+	else if ((ch == '\\') || (ch == '"'))</div><div class='add'>+	  {</div><div class='add'>+	     *ss1++ = '\\';</div><div class='add'>+	  }</div><div class='add'>+	*ss1++ = ch;</div><div class='add'>+     }</div><div class='add'>+   *ss1++ = '"';</div><div class='add'>+   *ss1 = 0;</div><div class='add'>+   if (-1 == SLang_push_string (ss))</div><div class='add'>+     SLfree (ss);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int is_list_element_cmd (char *list, char *elem, int *d_ptr)</div><div class='add'>+{</div><div class='add'>+   char ch;</div><div class='add'>+   int d, n;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   char *lbeg, *lend;</div><div class='add'>+</div><div class='add'>+   d = *d_ptr;</div><div class='add'>+</div><div class='add'>+   len = strlen (elem);</div><div class='add'>+</div><div class='add'>+   n = 1;</div><div class='add'>+   lend = list;</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	lbeg = lend;</div><div class='add'>+	while ((0 != (ch = *lend)) &amp;&amp; (ch != (char) d)) lend++;</div><div class='add'>+</div><div class='add'>+	if ((lbeg + len == lend)</div><div class='add'>+	    &amp;&amp; (0 == strncmp (elem, lbeg, len)))</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	if (ch == 0)</div><div class='add'>+	  {</div><div class='add'>+	     n = 0;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	lend++;			       /* skip delim */</div><div class='add'>+	n++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return n;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* Regular expression routines for strings */</div><div class='add'>+static SLRegexp_Type regexp_reg;</div><div class='add'>+</div><div class='add'>+static int string_match_cmd (char *str, char *pat, int *nptr) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   int n;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   unsigned char rbuf[512], *match;</div><div class='add'>+</div><div class='add'>+   n = *nptr;</div><div class='add'>+</div><div class='add'>+   regexp_reg.case_sensitive = 1;</div><div class='add'>+   regexp_reg.buf = rbuf;</div><div class='add'>+   regexp_reg.pat = (unsigned char *) pat;</div><div class='add'>+   regexp_reg.buf_len = sizeof (rbuf);</div><div class='add'>+</div><div class='add'>+   if (SLang_regexp_compile (&amp;regexp_reg))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Unable to compile pattern");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   n--;</div><div class='add'>+   len = strlen(str);</div><div class='add'>+   if ((n &lt; 0) || ((unsigned int) n &gt;= len))</div><div class='add'>+     {</div><div class='add'>+	/* SLang_Error = SL_INVALID_PARM; */</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   str += n;</div><div class='add'>+   len -= n;</div><div class='add'>+</div><div class='add'>+   if (NULL == (match = SLang_regexp_match((unsigned char *) str, len, &amp;regexp_reg)))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   /* adjust offsets */</div><div class='add'>+   regexp_reg.offset = n;</div><div class='add'>+</div><div class='add'>+   return (1 + (int) ((char *) match - str));</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int string_match_nth_cmd (int *nptr) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   int n, beg;</div><div class='add'>+</div><div class='add'>+   n = *nptr;</div><div class='add'>+</div><div class='add'>+   if ((n &lt; 0) || (n &gt; 9) || (regexp_reg.pat == NULL)</div><div class='add'>+       || ((beg = regexp_reg.beg_matches[n]) == -1))</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_INVALID_PARM;</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   SLang_push_integer(beg + regexp_reg.offset);</div><div class='add'>+   return regexp_reg.end_matches[n];</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static char *create_delimited_string (char **list, unsigned int n, </div><div class='add'>+				      char *delim)</div><div class='add'>+{</div><div class='add'>+   unsigned int len, dlen;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   unsigned int num;</div><div class='add'>+   char *str, *s;</div><div class='add'>+</div><div class='add'>+   len = 1;			       /* allow room for \0 char */</div><div class='add'>+   num = 0;</div><div class='add'>+   for (i = 0; i &lt; n; i++)</div><div class='add'>+     {</div><div class='add'>+	if (list[i] == NULL) continue;</div><div class='add'>+	len += strlen (list[i]);</div><div class='add'>+	num++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   dlen = strlen (delim);</div><div class='add'>+   if (num &gt; 1)</div><div class='add'>+     len += (num - 1) * dlen;</div><div class='add'>+</div><div class='add'>+   if (NULL == (str = SLmalloc (len)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   *str = 0;</div><div class='add'>+   s = str;</div><div class='add'>+   i = 0;</div><div class='add'>+	</div><div class='add'>+   while (num &gt; 1)</div><div class='add'>+     {</div><div class='add'>+	while (list[i] == NULL)</div><div class='add'>+	  i++;</div><div class='add'>+	</div><div class='add'>+	strcpy (s, list[i]);</div><div class='add'>+	s += strlen (list[i]);</div><div class='add'>+	strcpy (s, delim);</div><div class='add'>+	s += dlen;</div><div class='add'>+	i++;</div><div class='add'>+	num--;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   if (num)</div><div class='add'>+     {</div><div class='add'>+	while (list[i] == NULL)</div><div class='add'>+	  i++;</div><div class='add'>+	</div><div class='add'>+	strcpy (s, list[i]);</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   return str;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void create_delimited_string_cmd (int *nptr)</div><div class='add'>+{</div><div class='add'>+   unsigned int n, i;</div><div class='add'>+   char **strings;</div><div class='add'>+   char *str;</div><div class='add'>+</div><div class='add'>+   str = NULL;</div><div class='add'>+</div><div class='add'>+   n = 1 + (unsigned int) *nptr;       /* n includes delimiter */</div><div class='add'>+</div><div class='add'>+   if (NULL == (strings = (char **)SLmalloc (n * sizeof (char *))))</div><div class='add'>+     {</div><div class='add'>+	SLdo_pop_n (n);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+   memset((char *)strings, 0, n * sizeof (char *));</div><div class='add'>+</div><div class='add'>+   i = n;</div><div class='add'>+   while (i != 0)</div><div class='add'>+     {</div><div class='add'>+	i--;</div><div class='add'>+	if (-1 == SLang_pop_slstring (strings + i))</div><div class='add'>+	  goto return_error;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   str = create_delimited_string (strings + 1, (n - 1), strings[0]);</div><div class='add'>+   /* drop */</div><div class='add'>+   return_error:</div><div class='add'>+   for (i = 0; i &lt; n; i++) SLang_free_slstring (strings[i]);</div><div class='add'>+   SLfree ((char *)strings);</div><div class='add'>+</div><div class='add'>+   (void) SLang_push_malloced_string (str);   /* NULL Ok */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strjoin_cmd (char *delim)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   char *str;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_array_of_type (&amp;at, SLANG_STRING_TYPE))</div><div class='add'>+     return;</div><div class='add'>+   </div><div class='add'>+   str = create_delimited_string ((char **)at-&gt;data, at-&gt;num_elements, delim);</div><div class='add'>+   SLang_free_array (at);</div><div class='add'>+   (void) SLang_push_malloced_string (str);   /* NULL Ok */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void str_delete_chars_cmd (char *s, char *d)</div><div class='add'>+{</div><div class='add'>+   unsigned char lut[256];</div><div class='add'>+   unsigned char *s1, *s2;</div><div class='add'>+   unsigned char ch;</div><div class='add'>+</div><div class='add'>+   make_lut ((unsigned char *)d, lut);</div><div class='add'>+   if (NULL == (s = SLmake_string (s)))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   s1 = s2 = (unsigned char *) s;</div><div class='add'>+   while ((ch = *s2++) != 0)</div><div class='add'>+     {</div><div class='add'>+	if (0 == lut[ch])</div><div class='add'>+	  *s1++ = ch;</div><div class='add'>+     }</div><div class='add'>+   *s1 = 0;</div><div class='add'>+   </div><div class='add'>+   (void) SLang_push_malloced_string (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char *make_lut_string (unsigned char *s)</div><div class='add'>+{</div><div class='add'>+   unsigned char lut[256];</div><div class='add'>+   unsigned char *l;</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   /* Complement-- a natural order is imposed */</div><div class='add'>+   make_lut (s, lut);</div><div class='add'>+   l = lut;</div><div class='add'>+   for (i = 1; i &lt; 256; i++)</div><div class='add'>+     {</div><div class='add'>+	if (lut[i])</div><div class='add'>+	  *l++ = (unsigned char) i;</div><div class='add'>+     }</div><div class='add'>+   *l = 0;</div><div class='add'>+   return (unsigned char *) SLmake_string ((char *)lut);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char *make_str_range (unsigned char *s)</div><div class='add'>+{</div><div class='add'>+   unsigned char *s1, *range;</div><div class='add'>+   unsigned int num;</div><div class='add'>+   unsigned char ch;</div><div class='add'>+   int len;</div><div class='add'>+</div><div class='add'>+   if (*s == '^')</div><div class='add'>+     return make_lut_string (s);</div><div class='add'>+</div><div class='add'>+   num = 0;</div><div class='add'>+   s1 = s;</div><div class='add'>+   while ((ch = *s1++) != 0)</div><div class='add'>+     {</div><div class='add'>+	unsigned char ch1;</div><div class='add'>+</div><div class='add'>+	ch1 = *s1;</div><div class='add'>+	if (ch1 == '-')</div><div class='add'>+	  {</div><div class='add'>+	     s1++;</div><div class='add'>+	     ch1 = *s1;</div><div class='add'>+	     len = (int)ch1 - (int)ch;</div><div class='add'>+	     if (len &lt; 0)</div><div class='add'>+	       len = -len;</div><div class='add'>+	     </div><div class='add'>+	     num += (unsigned int) len;</div><div class='add'>+	     if (ch1 != 0)</div><div class='add'>+	       s1++;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	num++;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   range = (unsigned char *)SLmalloc (num + 1);</div><div class='add'>+   if (range == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+   </div><div class='add'>+   s1 = s;</div><div class='add'>+   s = range;</div><div class='add'>+   while ((ch = *s1++) != 0)</div><div class='add'>+     {</div><div class='add'>+	unsigned char ch1;</div><div class='add'>+	unsigned int i;</div><div class='add'>+</div><div class='add'>+	ch1 = *s1;</div><div class='add'>+	if (ch1 != '-')</div><div class='add'>+	  {</div><div class='add'>+	     *s++ = ch;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	s1++;</div><div class='add'>+	ch1 = *s1;</div><div class='add'>+	</div><div class='add'>+	if (ch &gt; ch1)</div><div class='add'>+	  {</div><div class='add'>+	     if (ch1 == 0)</div><div class='add'>+	       ch1 = 1;</div><div class='add'>+</div><div class='add'>+	     for (i = (unsigned int) ch; i &gt;= (unsigned int) ch1; i--)</div><div class='add'>+	       *s++ = (unsigned char) i;</div><div class='add'>+	     </div><div class='add'>+	     if (*s1 == 0)</div><div class='add'>+	       break;</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     for (i = (unsigned int) ch; i &lt;= (unsigned int) ch1; i++)</div><div class='add'>+	       *s++ = (unsigned char) i;</div><div class='add'>+	  }</div><div class='add'>+	s1++;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+#if 0</div><div class='add'>+   if (range + num != s)</div><div class='add'>+     SLang_verror (SL_INTERNAL_ERROR, "make_str_range: num wrong");</div><div class='add'>+#endif</div><div class='add'>+   *s = 0;</div><div class='add'>+</div><div class='add'>+   return range;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void strtrans_cmd (char *s, unsigned char *from, unsigned char *to)</div><div class='add'>+{</div><div class='add'>+   unsigned char map[256];</div><div class='add'>+   char *s1;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   unsigned char ch;</div><div class='add'>+   unsigned char last_to;</div><div class='add'>+   unsigned char *from_range, *to_range;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; 256; i++) map[i] = (unsigned char) i;</div><div class='add'>+</div><div class='add'>+   if (*to == 0)</div><div class='add'>+     {</div><div class='add'>+	str_delete_chars_cmd (s, (char *)from);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   from_range = make_str_range (from);</div><div class='add'>+   if (from_range == NULL)</div><div class='add'>+     return;</div><div class='add'>+   to_range = make_str_range (to);</div><div class='add'>+   if (to_range == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *)from_range);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   from = from_range;</div><div class='add'>+   to = to_range;</div><div class='add'>+</div><div class='add'>+   last_to = 0;</div><div class='add'>+   while ((ch = *from++) != 0)</div><div class='add'>+     {</div><div class='add'>+	unsigned char to_ch;</div><div class='add'>+</div><div class='add'>+	if (0 == (to_ch = *to++))</div><div class='add'>+	  {</div><div class='add'>+	     do</div><div class='add'>+	       {</div><div class='add'>+		  map[ch] = last_to;</div><div class='add'>+	       }</div><div class='add'>+	     while (0 != (ch = *from++));</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	</div><div class='add'>+	last_to = map[ch] = to_ch;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLfree ((char *)from_range);</div><div class='add'>+   SLfree ((char *)to_range);</div><div class='add'>+</div><div class='add'>+   s = SLmake_string (s);</div><div class='add'>+   if (s == NULL)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   s1 = s;</div><div class='add'>+   while ((ch = (unsigned char) *s1) != 0)</div><div class='add'>+     *s1++ = (char) map[ch];</div><div class='add'>+   </div><div class='add'>+   (void) SLang_push_malloced_string (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Strops_Table [] = /*{{{*/</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_I("create_delimited_string",  create_delimited_string_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SS("strcmp",  strcmp_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SSI("strncmp",  strncmp_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("strcat",  strcat_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("strlen",  strlen_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SII("strchop", strchop_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SII("strchopr", strchopr_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_I("strreplace", strreplace_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SSS("str_replace", str_replace_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SII("substr",  substr_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SS("is_substr",  issubstr_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_II("strsub",  strsub_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SII("extract_element", extract_element_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SSI("is_list_element", is_list_element_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SSI("string_match", string_match_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_I("string_match_nth", string_match_nth_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("strlow", strlow_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_I("tolower", tolower_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_I("toupper", toupper_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("strup", strup_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("isdigit",  isdigit_cmd, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("strtrim", strtrim_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("strtrim_end", strtrim_end_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("strtrim_beg", strtrim_beg_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("strcompress", strcompress_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_I("Sprintf", sprintf_n_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("sprintf", sprintf_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("sscanf", _SLang_sscanf, SLANG_INT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("make_printable_string", make_printable_string, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SSI("str_quote_string", str_quote_string_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SSS("str_uncomment_string", str_uncomment_string_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_II("define_case", SLang_define_case, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("strtok", strtok_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_S("strjoin", strjoin_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SSS("strtrans", strtrans_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_SS("str_delete_chars", str_delete_chars_cmd, SLANG_VOID_TYPE),</div><div class='add'>+</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int _SLang_init_slstrops (void)</div><div class='add'>+{</div><div class='add'>+   return SLadd_intrin_fun_table (Strops_Table, NULL);</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/slstruct.c b/mdk-stage1/slang/slstruct.c<br/>new file mode 100644<br/>index 000000000..33d182373<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slstruct.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slstruct.c</a></div><div class='hunk'>@@ -0,0 +1,932 @@</div><div class='add'>+/* Structure type implementation */</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#define SL_APP_WANTS_FOREACH</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+void _SLstruct_delete_struct (_SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+   _SLstruct_Field_Type *field, *field_max;</div><div class='add'>+</div><div class='add'>+   if (s == NULL) return;</div><div class='add'>+</div><div class='add'>+   if (s-&gt;num_refs &gt; 1)</div><div class='add'>+     {</div><div class='add'>+	s-&gt;num_refs -= 1;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   field = s-&gt;fields;</div><div class='add'>+   if (field != NULL)</div><div class='add'>+     {</div><div class='add'>+	field_max = field + s-&gt;nfields;</div><div class='add'>+</div><div class='add'>+	while (field &lt; field_max)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_object (&amp;field-&gt;obj);</div><div class='add'>+	     SLang_free_slstring (field-&gt;name);   /* could be NULL */</div><div class='add'>+	     field++;</div><div class='add'>+	  }</div><div class='add'>+	SLfree ((char *) s-&gt;fields);</div><div class='add'>+     }</div><div class='add'>+   SLfree ((char *) s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static _SLang_Struct_Type *allocate_struct (unsigned int nfields)</div><div class='add'>+{</div><div class='add'>+   _SLang_Struct_Type *s;</div><div class='add'>+   _SLstruct_Field_Type *f;</div><div class='add'>+   unsigned int i, size;</div><div class='add'>+</div><div class='add'>+   s = (_SLang_Struct_Type *) SLmalloc (sizeof (_SLang_Struct_Type));</div><div class='add'>+   if (s == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+   SLMEMSET((char *) s, 0, sizeof (_SLang_Struct_Type));</div><div class='add'>+</div><div class='add'>+   size = nfields * sizeof(_SLstruct_Field_Type);</div><div class='add'>+   if (NULL == (f = (_SLstruct_Field_Type *) SLmalloc (size)))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) s);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   SLMEMSET ((char *) f, 0, size);</div><div class='add'>+   s-&gt;nfields = nfields;</div><div class='add'>+   s-&gt;fields = f;</div><div class='add'>+</div><div class='add'>+   /* By default, all structs will be created with elements set to NULL.  I</div><div class='add'>+    * do not know whether or not it is better to use SLANG_UNDEFINED_TYPE.</div><div class='add'>+    */</div><div class='add'>+   for (i = 0; i &lt; nfields; i++)</div><div class='add'>+     f[i].obj.data_type = SLANG_NULL_TYPE;</div><div class='add'>+</div><div class='add'>+   return s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_struct_of_type (unsigned char type, _SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+   obj.data_type = type;</div><div class='add'>+   obj.v.struct_val = s;</div><div class='add'>+   s-&gt;num_refs += 1;</div><div class='add'>+</div><div class='add'>+   if (0 == SLang_push (&amp;obj))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   s-&gt;num_refs -= 1;</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_push_struct (_SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+   return push_struct_of_type (SLANG_STRUCT_TYPE, s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLang_pop_struct (_SLang_Struct_Type **sp)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   unsigned char type;</div><div class='add'>+</div><div class='add'>+   if (0 != SLang_pop (&amp;obj))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   type = obj.data_type;</div><div class='add'>+   if (type != SLANG_STRUCT_TYPE)</div><div class='add'>+     {</div><div class='add'>+	cl = _SLclass_get_class (type);</div><div class='add'>+	if (cl-&gt;cl_struct_def == NULL)</div><div class='add'>+	  {</div><div class='add'>+	     *sp = NULL;</div><div class='add'>+	     SLang_free_object (&amp;obj);</div><div class='add'>+	     SLang_verror (SL_TYPE_MISMATCH,</div><div class='add'>+			   "Expecting struct type object.  Found %s",</div><div class='add'>+			   cl-&gt;cl_name);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   *sp = obj.v.struct_val;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void struct_destroy (unsigned char type, VOID_STAR vs)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   _SLstruct_delete_struct (*(_SLang_Struct_Type **) vs);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int struct_push (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   return push_struct_of_type (type, *(_SLang_Struct_Type **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static _SLstruct_Field_Type *find_field (_SLang_Struct_Type *s, char *name)</div><div class='add'>+{</div><div class='add'>+   _SLstruct_Field_Type *f, *fmax;</div><div class='add'>+</div><div class='add'>+   f = s-&gt;fields;</div><div class='add'>+   fmax = f + s-&gt;nfields;</div><div class='add'>+</div><div class='add'>+   while (f &lt; fmax)</div><div class='add'>+     {</div><div class='add'>+	/* Since both these are slstrings, only compare pointer */</div><div class='add'>+	if (name == f-&gt;name)</div><div class='add'>+	  return f;</div><div class='add'>+</div><div class='add'>+	f++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static _SLstruct_Field_Type *pop_field (_SLang_Struct_Type *s, char *name)</div><div class='add'>+{</div><div class='add'>+   _SLstruct_Field_Type *f;</div><div class='add'>+</div><div class='add'>+   f = find_field (s, name);</div><div class='add'>+   if (f == NULL)</div><div class='add'>+     SLang_verror (SL_SYNTAX_ERROR, "struct has no field named %s", name);</div><div class='add'>+   return f;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLstruct_create_struct (unsigned int nfields,</div><div class='add'>+			    char **field_names,</div><div class='add'>+			    unsigned char *field_types,</div><div class='add'>+			    VOID_STAR *field_values)</div><div class='add'>+{</div><div class='add'>+   _SLang_Struct_Type *s;</div><div class='add'>+   _SLstruct_Field_Type *f;</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   if (NULL == (s = allocate_struct (nfields)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   f = s-&gt;fields;</div><div class='add'>+   for (i = 0; i &lt; nfields; i++)</div><div class='add'>+     {</div><div class='add'>+	unsigned char type;</div><div class='add'>+	SLang_Class_Type *cl;</div><div class='add'>+	VOID_STAR value;</div><div class='add'>+	char *name = field_names [i];</div><div class='add'>+</div><div class='add'>+	if (name == NULL)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_INVALID_PARM, "A struct field name cannot be NULL");</div><div class='add'>+	     goto return_error;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (NULL == (f-&gt;name = SLang_create_slstring (name)))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	if ((field_values == NULL)</div><div class='add'>+	    || (NULL == (value = field_values [i])))</div><div class='add'>+	  {</div><div class='add'>+	     f++;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	type = field_types[i];</div><div class='add'>+	cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+	if ((-1 == (cl-&gt;cl_push (type, value)))</div><div class='add'>+	    || (-1 == SLang_pop (&amp;f-&gt;obj)))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	f++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (0 == _SLang_push_struct (s))</div><div class='add'>+     return 0;</div><div class='add'>+   /* drop */</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   _SLstruct_delete_struct (s);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Interpreter interface */</div><div class='add'>+</div><div class='add'>+int _SLstruct_define_struct (void)</div><div class='add'>+{</div><div class='add'>+   int nfields;</div><div class='add'>+   _SLang_Struct_Type *s;</div><div class='add'>+   _SLstruct_Field_Type *f;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_integer (&amp;nfields))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (nfields &lt;= 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Number of struct fields must be &gt; 0");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (s = allocate_struct (nfields)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   f = s-&gt;fields;</div><div class='add'>+   while (nfields)</div><div class='add'>+     {</div><div class='add'>+	char *name;</div><div class='add'>+</div><div class='add'>+	nfields--;</div><div class='add'>+	if (-1 == SLang_pop_slstring (&amp;name))</div><div class='add'>+	  {</div><div class='add'>+	     _SLstruct_delete_struct (s);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	f[nfields].name = name;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_push_struct (s))</div><div class='add'>+     {</div><div class='add'>+	_SLstruct_delete_struct (s);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Simply make a struct that contains the same fields as struct s.  Do not</div><div class='add'>+ * duplicate the field values.</div><div class='add'>+ */</div><div class='add'>+static _SLang_Struct_Type *make_struct_shell (_SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+   _SLang_Struct_Type *new_s;</div><div class='add'>+   _SLstruct_Field_Type *new_f, *old_f;</div><div class='add'>+   unsigned int i, nfields;</div><div class='add'>+</div><div class='add'>+   nfields = s-&gt;nfields;</div><div class='add'>+   if (NULL == (new_s = allocate_struct (nfields)))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   new_f = new_s-&gt;fields;</div><div class='add'>+   old_f = s-&gt;fields;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; nfields; i++)</div><div class='add'>+     {</div><div class='add'>+	if (NULL == (new_f[i].name = SLang_create_slstring (old_f[i].name)))</div><div class='add'>+	  {</div><div class='add'>+	     _SLstruct_delete_struct (new_s);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   return new_s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int struct_init_array_object (unsigned char type, VOID_STAR addr)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   _SLang_Struct_Type *s;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   if (NULL == (s = make_struct_shell (cl-&gt;cl_struct_def)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   s-&gt;num_refs = 1;</div><div class='add'>+   *(_SLang_Struct_Type **) addr = s;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+typedefed_struct_datatype_deref (unsigned char type)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   _SLang_Struct_Type *s;</div><div class='add'>+</div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+   if (NULL == (s = make_struct_shell (cl-&gt;cl_struct_def)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == push_struct_of_type (type, s))</div><div class='add'>+     {</div><div class='add'>+	_SLstruct_delete_struct (s);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static _SLang_Struct_Type *duplicate_struct (_SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+   _SLang_Struct_Type *new_s;</div><div class='add'>+   _SLstruct_Field_Type *new_f, *f, *fmax;</div><div class='add'>+</div><div class='add'>+   new_s = make_struct_shell (s);</div><div class='add'>+</div><div class='add'>+   if (new_s == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   f = s-&gt;fields;</div><div class='add'>+   fmax = f + s-&gt;nfields;</div><div class='add'>+   new_f = new_s-&gt;fields;</div><div class='add'>+</div><div class='add'>+   while (f &lt; fmax)</div><div class='add'>+     {</div><div class='add'>+	SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+	obj = &amp;f-&gt;obj;</div><div class='add'>+	if (obj-&gt;data_type != SLANG_UNDEFINED_TYPE)</div><div class='add'>+	  {</div><div class='add'>+	     if ((-1 == _SLpush_slang_obj (obj))</div><div class='add'>+		 || (-1 == SLang_pop (&amp;new_f-&gt;obj)))</div><div class='add'>+	       {</div><div class='add'>+		  _SLstruct_delete_struct (new_s);</div><div class='add'>+		  return NULL;</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	new_f++;</div><div class='add'>+	f++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return new_s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int struct_dereference (unsigned char type, VOID_STAR addr)</div><div class='add'>+{</div><div class='add'>+   _SLang_Struct_Type *s;</div><div class='add'>+</div><div class='add'>+   if (NULL == (s = duplicate_struct (*(_SLang_Struct_Type **) addr)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == push_struct_of_type (type, s))</div><div class='add'>+     {</div><div class='add'>+	_SLstruct_delete_struct (s);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*{{{ foreach */</div><div class='add'>+</div><div class='add'>+struct _SLang_Foreach_Context_Type</div><div class='add'>+{</div><div class='add'>+   _SLang_Struct_Type *s;</div><div class='add'>+   char *next_field_name;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static SLang_Foreach_Context_Type *</div><div class='add'>+struct_foreach_open (unsigned char type, unsigned int num)</div><div class='add'>+{</div><div class='add'>+   SLang_Foreach_Context_Type *c;</div><div class='add'>+   _SLang_Struct_Type *s;</div><div class='add'>+   char *next_name;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_struct (&amp;s))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   switch (num)</div><div class='add'>+     {</div><div class='add'>+      case 0:</div><div class='add'>+	next_name = SLang_create_slstring ("next");</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case 1:</div><div class='add'>+	if (-1 == SLang_pop_slstring (&amp;next_name))</div><div class='add'>+	  next_name = NULL;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	next_name = NULL;</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "'foreach (Struct_Type) using' requires single control value");</div><div class='add'>+	SLdo_pop_n (num);</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (next_name == NULL)</div><div class='add'>+     {</div><div class='add'>+	_SLstruct_delete_struct (s);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   c = (SLang_Foreach_Context_Type *)SLmalloc (sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+   if (c == NULL)</div><div class='add'>+     {</div><div class='add'>+	_SLstruct_delete_struct (s);</div><div class='add'>+	SLang_free_slstring (next_name);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+</div><div class='add'>+   c-&gt;next_field_name = next_name;</div><div class='add'>+   c-&gt;s = s;</div><div class='add'>+</div><div class='add'>+   return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void struct_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   if (c == NULL) return;</div><div class='add'>+</div><div class='add'>+   SLang_free_slstring (c-&gt;next_field_name);</div><div class='add'>+   if (c-&gt;s != NULL) _SLstruct_delete_struct (c-&gt;s);</div><div class='add'>+   SLfree ((char *) c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int struct_foreach (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+   _SLstruct_Field_Type *f;</div><div class='add'>+   _SLang_Struct_Type *next_s;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   if (c == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (c-&gt;s == NULL)</div><div class='add'>+     return 0;			       /* done */</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_push_struct (c-&gt;s))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* Now get the next one ready for the next foreach loop */</div><div class='add'>+</div><div class='add'>+   next_s = NULL;</div><div class='add'>+   if (NULL != (f = find_field (c-&gt;s, c-&gt;next_field_name)))</div><div class='add'>+     {</div><div class='add'>+	SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+	cl = _SLclass_get_class (f-&gt;obj.data_type);</div><div class='add'>+	/* Note that I cannot simply look for SLANG_STRUCT_TYPE since the</div><div class='add'>+	 * user may have typedefed another struct type.  So, look at the</div><div class='add'>+	 * class methods.</div><div class='add'>+	 */</div><div class='add'>+	if (cl-&gt;cl_foreach_open == struct_foreach_open)</div><div class='add'>+	  {</div><div class='add'>+	     next_s = f-&gt;obj.v.struct_val;</div><div class='add'>+	     next_s-&gt;num_refs += 1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   _SLstruct_delete_struct (c-&gt;s);</div><div class='add'>+   c-&gt;s = next_s;</div><div class='add'>+</div><div class='add'>+   /* keep going */</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int struct_sput (unsigned char type, char *name)</div><div class='add'>+{</div><div class='add'>+   _SLang_Struct_Type *s;</div><div class='add'>+   _SLstruct_Field_Type *f;</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_struct (&amp;s))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((NULL == (f = pop_field (s, name)))</div><div class='add'>+       || (-1 == SLang_pop (&amp;obj)))</div><div class='add'>+     {</div><div class='add'>+	_SLstruct_delete_struct (s);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_free_object (&amp;f-&gt;obj);</div><div class='add'>+   f-&gt;obj = obj;</div><div class='add'>+   _SLstruct_delete_struct (s);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int struct_sget (unsigned char type, char *name)</div><div class='add'>+{</div><div class='add'>+   _SLang_Struct_Type *s;</div><div class='add'>+   _SLstruct_Field_Type *f;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_struct (&amp;s))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (NULL == (f = pop_field (s, name)))</div><div class='add'>+     {</div><div class='add'>+	_SLstruct_delete_struct (s);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   ret = _SLpush_slang_obj (&amp;f-&gt;obj);</div><div class='add'>+   _SLstruct_delete_struct (s);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int struct_typecast</div><div class='add'>+  (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+   unsigned char b_type, VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   _SLang_Struct_Type **a, **b;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   </div><div class='add'>+   (void) a_type;</div><div class='add'>+   (void) b_type;</div><div class='add'>+</div><div class='add'>+   a = (_SLang_Struct_Type **) ap;</div><div class='add'>+   b = (_SLang_Struct_Type **) bp;</div><div class='add'>+   for (i = 0; i &lt; na; i++)</div><div class='add'>+     {</div><div class='add'>+	b[i] = a[i];</div><div class='add'>+	if (a[i] != NULL)</div><div class='add'>+	  a[i]-&gt;num_refs += 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLstruct_define_typedef (void)</div><div class='add'>+{</div><div class='add'>+   char *type_name;</div><div class='add'>+   _SLang_Struct_Type *s, *s1;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_slstring (&amp;type_name))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_struct (&amp;s))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (type_name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (s1 = make_struct_shell (s)))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (type_name);</div><div class='add'>+	_SLstruct_delete_struct (s);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   _SLstruct_delete_struct (s);</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class (type_name)))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (type_name);</div><div class='add'>+	_SLstruct_delete_struct (s1);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   SLang_free_slstring (type_name);</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_struct_def = s1;</div><div class='add'>+   cl-&gt;cl_init_array_object = struct_init_array_object;</div><div class='add'>+   cl-&gt;cl_datatype_deref = typedefed_struct_datatype_deref;</div><div class='add'>+   cl-&gt;cl_destroy = struct_destroy;</div><div class='add'>+   cl-&gt;cl_push = struct_push;</div><div class='add'>+   cl-&gt;cl_dereference = struct_dereference;</div><div class='add'>+   cl-&gt;cl_foreach_open = struct_foreach_open;</div><div class='add'>+   cl-&gt;cl_foreach_close = struct_foreach_close;</div><div class='add'>+   cl-&gt;cl_foreach = struct_foreach;</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_sget = struct_sget;</div><div class='add'>+   cl-&gt;cl_sput = struct_sput;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_register_class (cl,</div><div class='add'>+				     SLANG_VOID_TYPE,   /* any open slot */</div><div class='add'>+				     sizeof (_SLang_Struct_Type),</div><div class='add'>+				     SLANG_CLASS_TYPE_PTR))</div><div class='add'>+     {</div><div class='add'>+	/* FIXME: Priority=low */</div><div class='add'>+	/* There is a memory leak here if this fails... */</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   /* Note: typecast from a user type struct type allowed but not the other</div><div class='add'>+    * way.</div><div class='add'>+    */</div><div class='add'>+   if (-1 == SLclass_add_typecast (cl-&gt;cl_data_type, SLANG_STRUCT_TYPE, struct_typecast, 1))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+struct_datatype_deref (unsigned char stype)</div><div class='add'>+{</div><div class='add'>+   (void) stype;</div><div class='add'>+   </div><div class='add'>+   if (SLang_peek_at_stack () == SLANG_ARRAY_TYPE)</div><div class='add'>+     {</div><div class='add'>+	SLang_Array_Type *at;</div><div class='add'>+	int status;</div><div class='add'>+</div><div class='add'>+	if (-1 == SLang_pop_array_of_type (&amp;at, SLANG_STRING_TYPE))</div><div class='add'>+	  return -1;</div><div class='add'>+	</div><div class='add'>+	status = SLstruct_create_struct (at-&gt;num_elements,</div><div class='add'>+					 (char **) at-&gt;data, NULL, NULL);</div><div class='add'>+</div><div class='add'>+	SLang_free_array (at);</div><div class='add'>+	return status;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_push_integer (SLang_Num_Function_Args);</div><div class='add'>+   return _SLstruct_define_struct ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int register_struct (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("Struct_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   (void) SLclass_set_destroy_function (cl, struct_destroy);</div><div class='add'>+   (void) SLclass_set_push_function (cl, struct_push);</div><div class='add'>+   cl-&gt;cl_dereference = struct_dereference;</div><div class='add'>+   cl-&gt;cl_datatype_deref = struct_datatype_deref;</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_foreach_open = struct_foreach_open;</div><div class='add'>+   cl-&gt;cl_foreach_close = struct_foreach_close;</div><div class='add'>+   cl-&gt;cl_foreach = struct_foreach;</div><div class='add'>+</div><div class='add'>+   cl-&gt;cl_sget = struct_sget;</div><div class='add'>+   cl-&gt;cl_sput = struct_sput;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_STRUCT_TYPE, sizeof (_SLang_Struct_Type),</div><div class='add'>+				     SLANG_CLASS_TYPE_PTR))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void get_struct_field_names (_SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *a;</div><div class='add'>+   char **data;</div><div class='add'>+   int i, nfields;</div><div class='add'>+   _SLstruct_Field_Type *f;</div><div class='add'>+</div><div class='add'>+   nfields = (int) s-&gt;nfields;</div><div class='add'>+</div><div class='add'>+   if (NULL == (a = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &amp;nfields, 1)))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   f = s-&gt;fields;</div><div class='add'>+   data = (char **) a-&gt;data;</div><div class='add'>+   for (i = 0; i &lt; nfields; i++)</div><div class='add'>+     {</div><div class='add'>+	/* Since we are dealing with hashed strings, the next call should not</div><div class='add'>+	 * fail.  If it does, the interpreter will handle it at some other</div><div class='add'>+	 * level.</div><div class='add'>+	 */</div><div class='add'>+	data [i] = SLang_create_slstring (f[i].name);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_push_array (a, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int push_struct_fields (_SLang_Struct_Type *s)</div><div class='add'>+{</div><div class='add'>+   _SLstruct_Field_Type *f, *fmax;</div><div class='add'>+   int num;</div><div class='add'>+</div><div class='add'>+   f = s-&gt;fields;</div><div class='add'>+   fmax = f + s-&gt;nfields;</div><div class='add'>+</div><div class='add'>+   num = 0;</div><div class='add'>+   while (fmax &gt; f)</div><div class='add'>+     {</div><div class='add'>+	fmax--;</div><div class='add'>+	if (-1 == _SLpush_slang_obj (&amp;fmax-&gt;obj))</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	num++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return num;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Syntax: set_struct_field (s, name, value); */</div><div class='add'>+static void struct_set_field (void)</div><div class='add'>+{</div><div class='add'>+   _SLang_Struct_Type *s;</div><div class='add'>+   _SLstruct_Field_Type *f;</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   char *name;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop (&amp;obj))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_slstring (&amp;name))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_object (&amp;obj);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_pop_struct (&amp;s))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (name);</div><div class='add'>+	SLang_free_object (&amp;obj);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (f = pop_field (s, name)))</div><div class='add'>+     {</div><div class='add'>+	_SLstruct_delete_struct (s);</div><div class='add'>+	SLang_free_slstring (name);</div><div class='add'>+	SLang_free_object (&amp;obj);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_free_object (&amp;f-&gt;obj);</div><div class='add'>+   f-&gt;obj = obj;</div><div class='add'>+</div><div class='add'>+   _SLstruct_delete_struct (s);</div><div class='add'>+   SLang_free_slstring (name);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Syntax: set_struct_fields (s, values....); */</div><div class='add'>+static void set_struct_fields (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int n;</div><div class='add'>+   _SLang_Struct_Type *s;</div><div class='add'>+   _SLstruct_Field_Type *f;</div><div class='add'>+</div><div class='add'>+   n = (unsigned int) SLang_Num_Function_Args;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLreverse_stack (n))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   n--;</div><div class='add'>+   if (-1 == _SLang_pop_struct (&amp;s))</div><div class='add'>+     {</div><div class='add'>+	SLdo_pop_n (n);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (n &gt; s-&gt;nfields)</div><div class='add'>+     {</div><div class='add'>+	SLdo_pop_n (n);</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Too many values for structure");</div><div class='add'>+	_SLstruct_delete_struct (s);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   f = s-&gt;fields;</div><div class='add'>+   while (n &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_Object_Type obj;</div><div class='add'>+</div><div class='add'>+	if (-1 == SLang_pop (&amp;obj))</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	SLang_free_object (&amp;f-&gt;obj);</div><div class='add'>+	f-&gt;obj = obj;</div><div class='add'>+</div><div class='add'>+	f++;</div><div class='add'>+	n--;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   _SLstruct_delete_struct (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void get_struct_field (char *name)</div><div class='add'>+{</div><div class='add'>+   (void) struct_sget (0, name);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int is_struct_type (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   unsigned char type;</div><div class='add'>+   int status;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop (&amp;obj))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   type = obj.data_type;</div><div class='add'>+   if (type == SLANG_STRUCT_TYPE)</div><div class='add'>+     status = 1;</div><div class='add'>+   else</div><div class='add'>+     status = (NULL != _SLclass_get_class (type)-&gt;cl_struct_def);</div><div class='add'>+   SLang_free_object (&amp;obj);</div><div class='add'>+   return status;</div><div class='add'>+}	</div><div class='add'>+   </div><div class='add'>+     </div><div class='add'>+static SLang_Intrin_Fun_Type Struct_Table [] =</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_1("get_struct_field_names", get_struct_field_names, SLANG_VOID_TYPE, SLANG_STRUCT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_1("get_struct_field", get_struct_field, SLANG_VOID_TYPE, SLANG_STRING_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_1("_push_struct_field_values", push_struct_fields, SLANG_INT_TYPE, SLANG_STRUCT_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("set_struct_field", struct_set_field, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("set_struct_fields", set_struct_fields, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("is_struct_type", is_struct_type, SLANG_INT_TYPE),</div><div class='add'>+   /* MAKE_INTRINSIC_I("_create_struct", create_struct, SLANG_VOID_TYPE), */</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLstruct_init (void)</div><div class='add'>+{</div><div class='add'>+   if ((-1 == SLadd_intrin_fun_table (Struct_Table, NULL))</div><div class='add'>+       || (-1 == register_struct ()))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLstruct_pop_args (int *np)</div><div class='add'>+{</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   int i, n;</div><div class='add'>+   _SLang_Struct_Type **data;</div><div class='add'>+</div><div class='add'>+   n = *np;</div><div class='add'>+</div><div class='add'>+   if (n &lt; 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_INVALID_PARM;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   data = (_SLang_Struct_Type **) SLmalloc ((n + 1) * sizeof (_SLang_Struct_Type *));</div><div class='add'>+   if (data == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLdo_pop_n (n);</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   memset ((char *)data, 0, n * sizeof (_SLang_Struct_Type *));</div><div class='add'>+</div><div class='add'>+   i = n;</div><div class='add'>+   while (i &gt; 0)</div><div class='add'>+     {</div><div class='add'>+	_SLang_Struct_Type *s;</div><div class='add'>+	_SLstruct_Field_Type *f;</div><div class='add'>+</div><div class='add'>+	i--;</div><div class='add'>+</div><div class='add'>+	if (NULL == (s = allocate_struct (1)))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	data[i] = s;</div><div class='add'>+	s-&gt;num_refs += 1;	       /* keeping a copy */</div><div class='add'>+</div><div class='add'>+	f = s-&gt;fields;</div><div class='add'>+	if (NULL == (f-&gt;name = SLang_create_slstring ("value")))</div><div class='add'>+	  goto return_error;</div><div class='add'>+</div><div class='add'>+	if (-1 == SLang_pop (&amp;f-&gt;obj))</div><div class='add'>+	  goto return_error;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (NULL == (at = SLang_create_array (SLANG_STRUCT_TYPE, 0,</div><div class='add'>+					 (VOID_STAR) data, &amp;n, 1)))</div><div class='add'>+     goto return_error;</div><div class='add'>+</div><div class='add'>+   (void) SLang_push_array (at, 1);</div><div class='add'>+   return;</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   for (i = 0; i &lt; n; i++)</div><div class='add'>+     {</div><div class='add'>+	_SLang_Struct_Type *s;</div><div class='add'>+</div><div class='add'>+	s = data[i];</div><div class='add'>+	if (s != NULL)</div><div class='add'>+	  _SLstruct_delete_struct (s);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLfree ((char *) data);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLstruct_push_args (SLang_Array_Type *at)</div><div class='add'>+{</div><div class='add'>+   _SLang_Struct_Type **sp;</div><div class='add'>+   unsigned int num;</div><div class='add'>+</div><div class='add'>+   if (at-&gt;data_type != SLANG_STRUCT_TYPE)</div><div class='add'>+     {</div><div class='add'>+	SLang_Error = SL_TYPE_MISMATCH;</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   sp = (_SLang_Struct_Type **) at-&gt;data;</div><div class='add'>+   num = at-&gt;num_elements;</div><div class='add'>+</div><div class='add'>+   while ((SLang_Error == 0) &amp;&amp; (num &gt; 0))</div><div class='add'>+     {</div><div class='add'>+	_SLang_Struct_Type *s;</div><div class='add'>+</div><div class='add'>+	num--;</div><div class='add'>+	if (NULL == (s = *sp++))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_push_null ();</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* I should check to see if the value field is present, but... */</div><div class='add'>+	(void) _SLpush_slang_obj (&amp;s-&gt;fields-&gt;obj);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/sltermin.c b/mdk-stage1/slang/sltermin.c<br/>new file mode 100644<br/>index 000000000..f9c64f0b2<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sltermin.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltermin.c</a></div><div class='hunk'>@@ -0,0 +1,1155 @@</div><div class='add'>+/* This file contains enough terminfo reading capabilities sufficient for</div><div class='add'>+ * the slang SLtt interface.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * The majority of the comments found in the file were taken from the</div><div class='add'>+ * term(4) man page on an SGI.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* Short integers are stored in two 8-bit bytes.  The first byte contains</div><div class='add'>+ * the least significant 8 bits of the value, and the second byte contains</div><div class='add'>+ * the most significant 8 bits.  (Thus, the value represented is</div><div class='add'>+ * 256*second+first.)  The value -1 is represented by 0377,0377, and the</div><div class='add'>+ * value -2 is represented by 0376,0377; other negative values are illegal.</div><div class='add'>+ * The -1 generally means that a capability is missing from this terminal.</div><div class='add'>+ * The -2 means that the capability has been cancelled in the terminfo</div><div class='add'>+ * source and also is to be considered missing.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static int make_integer (unsigned char *buf)</div><div class='add'>+{</div><div class='add'>+   register int lo, hi;</div><div class='add'>+   lo = (int) *buf++; hi = (int) *buf;</div><div class='add'>+   if (hi == 0377)</div><div class='add'>+     {</div><div class='add'>+	if (lo == 0377) return -1;</div><div class='add'>+	if (lo == 0376) return -2;</div><div class='add'>+     }</div><div class='add'>+   return lo + 256 * hi;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * The compiled file is created from the source file descriptions of the</div><div class='add'>+ * terminals (see the -I option of infocmp) by using the terminfo compiler,</div><div class='add'>+ * tic, and read by the routine setupterm [see curses(3X).]  The file is</div><div class='add'>+ * divided into six parts in the following order:  the header, terminal</div><div class='add'>+ * names, boolean flags, numbers, strings, and string table.</div><div class='add'>+ *</div><div class='add'>+ * The header section begins the file.  This section contains six short</div><div class='add'>+ * integers in the format described below.  These integers are (1) the magic</div><div class='add'>+ * number (octal 0432); (2) the size, in bytes, of the names section; (3)</div><div class='add'>+ * the number of bytes in the boolean section; (4) the number of short</div><div class='add'>+ * integers in the numbers section; (5) the number of offsets (short</div><div class='add'>+ * integers) in the strings section; (6) the size, in bytes, of the string</div><div class='add'>+ * table.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define MAGIC 0432</div><div class='add'>+</div><div class='add'>+/* In this structure, all char * fields are malloced EXCEPT if the</div><div class='add'>+ * structure is SLTERMCAP.  In that case, only terminal_names is malloced</div><div class='add'>+ * and the other fields are pointers into it.</div><div class='add'>+ */</div><div class='add'>+struct _SLterminfo_Type</div><div class='add'>+{</div><div class='add'>+#define SLTERMINFO 1</div><div class='add'>+#define SLTERMCAP  2</div><div class='add'>+   unsigned int flags;</div><div class='add'>+</div><div class='add'>+   unsigned int name_section_size;</div><div class='add'>+   char *terminal_names;</div><div class='add'>+</div><div class='add'>+   unsigned int boolean_section_size;</div><div class='add'>+   unsigned char *boolean_flags;</div><div class='add'>+</div><div class='add'>+   unsigned int num_numbers;</div><div class='add'>+   unsigned char *numbers;</div><div class='add'>+</div><div class='add'>+   unsigned int num_string_offsets;</div><div class='add'>+   unsigned char *string_offsets;</div><div class='add'>+</div><div class='add'>+   unsigned int string_table_size;</div><div class='add'>+   char *string_table;</div><div class='add'>+</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static char *tcap_getstr (char *, SLterminfo_Type *);</div><div class='add'>+static int tcap_getnum (char *, SLterminfo_Type *);</div><div class='add'>+static int tcap_getflag (char *, SLterminfo_Type *);</div><div class='add'>+static int tcap_getent (char *, SLterminfo_Type *);</div><div class='add'>+</div><div class='add'>+static FILE *open_terminfo (char *file, SLterminfo_Type *h)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+   unsigned char buf[12];</div><div class='add'>+</div><div class='add'>+   /* Alan Cox reported a security problem here if the application using the</div><div class='add'>+    * library is setuid.  So, I need to make sure open the file as a normal</div><div class='add'>+    * user.  Unfortunately, there does not appear to be a portable way of</div><div class='add'>+    * doing this, so I am going to use 'setfsgid' and 'setfsuid', which</div><div class='add'>+    * are not portable.</div><div class='add'>+    *</div><div class='add'>+    * I will also look into the use of setreuid, seteuid and setregid, setegid.</div><div class='add'>+    * FIXME: Priority=medium</div><div class='add'>+    */</div><div class='add'>+   fp = fopen (file, "rb");</div><div class='add'>+   if (fp == NULL) return NULL;</div><div class='add'>+</div><div class='add'>+   if ((12 == fread ((char *) buf, 1, 12, fp) &amp;&amp; (MAGIC == make_integer (buf))))</div><div class='add'>+     {</div><div class='add'>+	h-&gt;name_section_size = make_integer (buf + 2);</div><div class='add'>+	h-&gt;boolean_section_size = make_integer (buf + 4);</div><div class='add'>+	h-&gt;num_numbers = make_integer (buf + 6);</div><div class='add'>+	h-&gt;num_string_offsets = make_integer (buf + 8);</div><div class='add'>+	h-&gt;string_table_size = make_integer (buf + 10);</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	fclose (fp);</div><div class='add'>+	fp = NULL;</div><div class='add'>+     }</div><div class='add'>+   return fp;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * The terminal names section comes next.  It contains the first line of the</div><div class='add'>+ * terminfo description, listing the various names for the terminal,</div><div class='add'>+ * separated by the bar ( | ) character (see term(5)).  The section is</div><div class='add'>+ * terminated with an ASCII NUL character.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* returns pointer to malloced space */</div><div class='add'>+static unsigned char *read_terminfo_section (FILE *fp, unsigned int size)</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+</div><div class='add'>+   if (NULL == (s = (char *) SLmalloc (size))) return NULL;</div><div class='add'>+   if (size != fread (s, 1, size, fp))</div><div class='add'>+     {</div><div class='add'>+	SLfree (s);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   return (unsigned char *) s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *read_terminal_names (FILE *fp, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+   return t-&gt;terminal_names = (char *) read_terminfo_section (fp, t-&gt;name_section_size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * The boolean flags have one byte for each flag.  This byte is either 0 or</div><div class='add'>+ * 1 as the flag is present or absent.  The value of 2 means that the flag</div><div class='add'>+ * has been cancelled.  The capabilities are in the same order as the file</div><div class='add'>+ * &lt;term.h&gt;.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static unsigned char *read_boolean_flags (FILE *fp, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+   /* Between the boolean section and the number section, a null byte is</div><div class='add'>+    * inserted, if necessary, to ensure that the number section begins on an</div><div class='add'>+    * even byte offset. All short integers are aligned on a short word</div><div class='add'>+    * boundary.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   unsigned int size = (t-&gt;name_section_size + t-&gt;boolean_section_size) % 2;</div><div class='add'>+   size += t-&gt;boolean_section_size;</div><div class='add'>+</div><div class='add'>+   return t-&gt;boolean_flags = read_terminfo_section (fp, size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * The numbers section is similar to the boolean flags section.  Each</div><div class='add'>+ * capability takes up two bytes, and is stored as a short integer.  If the</div><div class='add'>+ * value represented is -1 or -2, the capability is taken to be missing.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static unsigned char *read_numbers (FILE *fp, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+   return t-&gt;numbers = read_terminfo_section (fp, 2 * t-&gt;num_numbers);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* The strings section is also similar.  Each capability is stored as a</div><div class='add'>+ * short integer, in the format above.  A value of -1 or -2 means the</div><div class='add'>+ * capability is missing.  Otherwise, the value is taken as an offset from</div><div class='add'>+ * the beginning of the string table.  Special characters in ^X or \c</div><div class='add'>+ * notation are stored in their interpreted form, not the printing</div><div class='add'>+ * representation.  Padding information ($&lt;nn&gt;) and parameter information</div><div class='add'>+ * (%x) are stored intact in uninterpreted form.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static unsigned char *read_string_offsets (FILE *fp, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+   return t-&gt;string_offsets = (unsigned char *) read_terminfo_section (fp, 2 * t-&gt;num_string_offsets);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* The final section is the string table.  It contains all the values of</div><div class='add'>+ * string capabilities referenced in the string section.  Each string is</div><div class='add'>+ * null terminated.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static char *read_string_table (FILE *fp, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+   return t-&gt;string_table = (char *) read_terminfo_section (fp, t-&gt;string_table_size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*</div><div class='add'>+ * Compiled terminfo(4) descriptions are placed under the directory</div><div class='add'>+ * /usr/share/lib/terminfo.  In order to avoid a linear search of a huge</div><div class='add'>+ * UNIX system directory, a two-level scheme is used:</div><div class='add'>+ * /usr/share/lib/terminfo/c/name where name is the name of the terminal,</div><div class='add'>+ * and c is the first character of name.  Thus, att4425 can be found in the</div><div class='add'>+ * file /usr/share/lib/terminfo/a/att4425.  Synonyms for the same terminal</div><div class='add'>+ * are implemented by multiple links to the same compiled file.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#define MAX_TI_DIRS 7</div><div class='add'>+static char *Terminfo_Dirs [MAX_TI_DIRS] =</div><div class='add'>+{</div><div class='add'>+   NULL, /* $HOME/.terminfo */</div><div class='add'>+   NULL, /* $TERMINFO */</div><div class='add'>+   "/usr/share/terminfo",</div><div class='add'>+   "/usr/lib/terminfo",</div><div class='add'>+   "/usr/share/lib/terminfo",</div><div class='add'>+   "/etc/terminfo",</div><div class='add'>+   "/usr/local/lib/terminfo"</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+SLterminfo_Type *_SLtt_tigetent (char *term)</div><div class='add'>+{</div><div class='add'>+   char *tidir;</div><div class='add'>+   int i;</div><div class='add'>+   FILE *fp = NULL;</div><div class='add'>+   char file[1024];</div><div class='add'>+   static char home_ti [1024];</div><div class='add'>+   char *home;</div><div class='add'>+   SLterminfo_Type *ti;</div><div class='add'>+</div><div class='add'>+   if (</div><div class='add'>+       (term == NULL)</div><div class='add'>+#ifdef SLANG_UNTIC</div><div class='add'>+       &amp;&amp; (SLang_Untic_Terminfo_File == NULL)</div><div class='add'>+#endif</div><div class='add'>+       )</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   if (NULL == (ti = (SLterminfo_Type *) SLmalloc (sizeof (SLterminfo_Type))))</div><div class='add'>+     {</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#ifdef SLANG_UNTIC</div><div class='add'>+   if (SLang_Untic_Terminfo_File != NULL)</div><div class='add'>+     {</div><div class='add'>+	fp = open_terminfo (SLang_Untic_Terminfo_File, ti);</div><div class='add'>+	goto fp_open_label;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+#endif</div><div class='add'>+   /* If we are on a termcap based system, use termcap */</div><div class='add'>+   if (0 == tcap_getent (term, ti)) return ti;</div><div class='add'>+</div><div class='add'>+   if (NULL != (home = getenv ("HOME")))</div><div class='add'>+     {</div><div class='add'>+	strncpy (home_ti, home, sizeof (home_ti) - 11);</div><div class='add'>+	home_ti [sizeof(home_ti) - 11] = 0;</div><div class='add'>+	strcat (home_ti, "/.terminfo");</div><div class='add'>+	Terminfo_Dirs [0] = home_ti;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Terminfo_Dirs[1] = getenv ("TERMINFO");</div><div class='add'>+   i = 0;</div><div class='add'>+   while (i &lt; MAX_TI_DIRS)</div><div class='add'>+     {</div><div class='add'>+	tidir = Terminfo_Dirs[i];</div><div class='add'>+	if ((tidir != NULL)</div><div class='add'>+	    &amp;&amp; (sizeof (file) &gt; strlen (tidir) + 2 + strlen (term)))</div><div class='add'>+	  {</div><div class='add'>+	     sprintf (file, "%s/%c/%s", tidir, *term, term);</div><div class='add'>+	     if (NULL != (fp = open_terminfo (file, ti)))</div><div class='add'>+	       break;</div><div class='add'>+	  }</div><div class='add'>+	i++;</div><div class='add'>+     }</div><div class='add'>+#ifdef SLANG_UNTIC</div><div class='add'>+   fp_open_label:</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (fp != NULL)</div><div class='add'>+     {</div><div class='add'>+	if (NULL != read_terminal_names (fp, ti))</div><div class='add'>+	  {</div><div class='add'>+	     if (NULL != read_boolean_flags (fp, ti))</div><div class='add'>+	       {</div><div class='add'>+		  if (NULL != read_numbers (fp, ti))</div><div class='add'>+		    {</div><div class='add'>+		       if (NULL != read_string_offsets (fp, ti))</div><div class='add'>+			 {</div><div class='add'>+			    if (NULL != read_string_table (fp, ti))</div><div class='add'>+			      {</div><div class='add'>+				 /* success */</div><div class='add'>+				 fclose (fp);</div><div class='add'>+				 ti-&gt;flags = SLTERMINFO;</div><div class='add'>+				 return ti;</div><div class='add'>+			      }</div><div class='add'>+			    SLfree ((char *)ti-&gt;string_offsets);</div><div class='add'>+			 }</div><div class='add'>+		       SLfree ((char *)ti-&gt;numbers);</div><div class='add'>+		    }</div><div class='add'>+		  SLfree ((char *)ti-&gt;boolean_flags);</div><div class='add'>+	       }</div><div class='add'>+	     SLfree ((char *)ti-&gt;terminal_names);</div><div class='add'>+	  }</div><div class='add'>+	fclose (fp);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLfree ((char *)ti);</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef SLANG_UNTIC</div><div class='add'>+# define UNTIC_COMMENT(x) ,x</div><div class='add'>+#else</div><div class='add'>+# define UNTIC_COMMENT(x)</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char name[3];</div><div class='add'>+   int offset;</div><div class='add'>+#ifdef SLANG_UNTIC</div><div class='add'>+   char *comment;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+Tgetstr_Map_Type;</div><div class='add'>+</div><div class='add'>+/* I need to add: K1-5, %0-5(not important), @8, &amp;8... */</div><div class='add'>+static Tgetstr_Map_Type Tgetstr_Map [] =</div><div class='add'>+{</div><div class='add'>+   {"!1", 212		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"!2", 213		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"!3", 214		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"#1", 198		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"#2", 199		UNTIC_COMMENT("Key S-Home")},</div><div class='add'>+   {"#3", 200		UNTIC_COMMENT("Key S-Insert")},</div><div class='add'>+   {"#4", 201		UNTIC_COMMENT("Key S-Left")},</div><div class='add'>+   {"%0", 177		UNTIC_COMMENT("redo key")},</div><div class='add'>+   {"%1", 168		UNTIC_COMMENT("help key")},</div><div class='add'>+   {"%2", 169		UNTIC_COMMENT("mark key")},</div><div class='add'>+   {"%3", 170		UNTIC_COMMENT("message key")},</div><div class='add'>+   {"%4", 171		UNTIC_COMMENT("move key")},</div><div class='add'>+   {"%5", 172		UNTIC_COMMENT("next key")},</div><div class='add'>+   {"%6", 173		UNTIC_COMMENT("open key")},</div><div class='add'>+   {"%7", 174		UNTIC_COMMENT("options key")},</div><div class='add'>+   {"%8", 175		UNTIC_COMMENT("previous key")},</div><div class='add'>+   {"%9", 176		UNTIC_COMMENT("print key")},</div><div class='add'>+   {"%a", 202		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"%b", 203		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"%c", 204		UNTIC_COMMENT("Key S-Next")},</div><div class='add'>+   {"%d", 205		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"%e", 206		UNTIC_COMMENT("Key S-Previous")},</div><div class='add'>+   {"%f", 207		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"%g", 208		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"%h", 209		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"%i", 210		UNTIC_COMMENT("Key S-Right")},</div><div class='add'>+   {"%j", 211		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"&amp;0", 187		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"&amp;1", 178		UNTIC_COMMENT("reference key")},</div><div class='add'>+   {"&amp;2", 179		UNTIC_COMMENT("refresh key")},</div><div class='add'>+   {"&amp;3", 180		UNTIC_COMMENT("replace key")},</div><div class='add'>+   {"&amp;4", 181		UNTIC_COMMENT("restart key")},</div><div class='add'>+   {"&amp;5", 182		UNTIC_COMMENT("resume key")},</div><div class='add'>+   {"&amp;6", 183		UNTIC_COMMENT("save key")},</div><div class='add'>+   {"&amp;7", 184		UNTIC_COMMENT("suspend key")},</div><div class='add'>+   {"&amp;8", 185		UNTIC_COMMENT("undo key")},</div><div class='add'>+   {"&amp;9", 186		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"*0", 197		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"*1", 188		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"*2", 189		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"*3", 190		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"*4", 191		UNTIC_COMMENT("Key S-Delete")},</div><div class='add'>+   {"*5", 192		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"*6", 193		UNTIC_COMMENT("select key")},</div><div class='add'>+   {"*7", 194		UNTIC_COMMENT("Key S-End")},</div><div class='add'>+   {"*8", 195		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"*9", 196		UNTIC_COMMENT("shifted key")},</div><div class='add'>+   {"@0", 167		UNTIC_COMMENT("find key")},</div><div class='add'>+   {"@1", 158		UNTIC_COMMENT("begin key")},</div><div class='add'>+   {"@2", 159		UNTIC_COMMENT("cancel key")},</div><div class='add'>+   {"@3", 160		UNTIC_COMMENT("close key")},</div><div class='add'>+   {"@4", 161		UNTIC_COMMENT("command key")},</div><div class='add'>+   {"@5", 162		UNTIC_COMMENT("copy key")},</div><div class='add'>+   {"@6", 163		UNTIC_COMMENT("create key")},</div><div class='add'>+   {"@7", 164 		UNTIC_COMMENT("Key End")},</div><div class='add'>+   {"@8", 165		UNTIC_COMMENT("enter/send key")},</div><div class='add'>+   {"@9", 166		UNTIC_COMMENT("exit key")},</div><div class='add'>+   {"AB", 360 		UNTIC_COMMENT("set ANSI color background")},</div><div class='add'>+   {"AF", 359 		UNTIC_COMMENT("set ANSI color foreground")},</div><div class='add'>+   {"AL", 110 		UNTIC_COMMENT("parm_insert_line")},</div><div class='add'>+   {"CC", 9		UNTIC_COMMENT("terminal settable cmd character in prototype !?")},</div><div class='add'>+   {"CM", 15		UNTIC_COMMENT("memory relative cursor addressing")},</div><div class='add'>+   {"CW", 277		UNTIC_COMMENT("define a window #1 from #2, #3 to #4, #5")},</div><div class='add'>+   {"DC", 105		UNTIC_COMMENT("delete #1 chars")},</div><div class='add'>+   {"DI", 280		UNTIC_COMMENT("dial number #1")},</div><div class='add'>+   {"DK", 275		UNTIC_COMMENT("display clock at (#1,#2)")},</div><div class='add'>+   {"DL", 106 		UNTIC_COMMENT("parm_delete_line")},</div><div class='add'>+   {"DO", 107		UNTIC_COMMENT("down #1 lines")},</div><div class='add'>+   {"F1", 216		UNTIC_COMMENT("key_f11")},</div><div class='add'>+   {"F2", 217		UNTIC_COMMENT("key_f12")},</div><div class='add'>+   {"F3", 218		UNTIC_COMMENT("key_f13")},</div><div class='add'>+   {"F4", 219		UNTIC_COMMENT("key_f14")},</div><div class='add'>+   {"F5", 220		UNTIC_COMMENT("key_f15")},</div><div class='add'>+   {"F6", 221		UNTIC_COMMENT("key_f16")},</div><div class='add'>+   {"F7", 222		UNTIC_COMMENT("key_f17")},</div><div class='add'>+   {"F8", 223		UNTIC_COMMENT("key_f18")},</div><div class='add'>+   {"F9", 224		UNTIC_COMMENT("key_f19")},</div><div class='add'>+   {"FA", 225		UNTIC_COMMENT("key_f20")},</div><div class='add'>+   {"FB", 226		UNTIC_COMMENT("F21 function key")},</div><div class='add'>+   {"FC", 227		UNTIC_COMMENT("F22 function key")},</div><div class='add'>+   {"FD", 228		UNTIC_COMMENT("F23 function key")},</div><div class='add'>+   {"FE", 229		UNTIC_COMMENT("F24 function key")},</div><div class='add'>+   {"FF", 230		UNTIC_COMMENT("F25 function key")},</div><div class='add'>+   {"FG", 231		UNTIC_COMMENT("F26 function key")},</div><div class='add'>+   {"FH", 232		UNTIC_COMMENT("F27 function key")},</div><div class='add'>+   {"FI", 233		UNTIC_COMMENT("F28 function key")},</div><div class='add'>+   {"FJ", 234		UNTIC_COMMENT("F29 function key")},</div><div class='add'>+   {"FK", 235		UNTIC_COMMENT("F30 function key")},</div><div class='add'>+   {"FL", 236		UNTIC_COMMENT("F31 function key")},</div><div class='add'>+   {"FM", 237		UNTIC_COMMENT("F32 function key")},</div><div class='add'>+   {"FN", 238		UNTIC_COMMENT("F33 function key")},</div><div class='add'>+   {"FO", 239		UNTIC_COMMENT("F34 function key")},</div><div class='add'>+   {"FP", 240		UNTIC_COMMENT("F35 function key")},</div><div class='add'>+   {"FQ", 241		UNTIC_COMMENT("F36 function key")},</div><div class='add'>+   {"FR", 242		UNTIC_COMMENT("F37 function key")},</div><div class='add'>+   {"FS", 243		UNTIC_COMMENT("F38 function key")},</div><div class='add'>+   {"FT", 244		UNTIC_COMMENT("F39 function key")},</div><div class='add'>+   {"FU", 245		UNTIC_COMMENT("F40 function key")},</div><div class='add'>+   {"FV", 246		UNTIC_COMMENT("F41 function key")},</div><div class='add'>+   {"FW", 247		UNTIC_COMMENT("F42 function key")},</div><div class='add'>+   {"FX", 248		UNTIC_COMMENT("F43 function key")},</div><div class='add'>+   {"FY", 249		UNTIC_COMMENT("F44 function key")},</div><div class='add'>+   {"FZ", 250		UNTIC_COMMENT("F45 function key")},</div><div class='add'>+   {"Fa", 251		UNTIC_COMMENT("F46 function key")},</div><div class='add'>+   {"Fb", 252		UNTIC_COMMENT("F47 function key")},</div><div class='add'>+   {"Fc", 253		UNTIC_COMMENT("F48 function key")},</div><div class='add'>+   {"Fd", 254		UNTIC_COMMENT("F49 function key")},</div><div class='add'>+   {"Fe", 255		UNTIC_COMMENT("F50 function key")},</div><div class='add'>+   {"Ff", 256		UNTIC_COMMENT("F51 function key")},</div><div class='add'>+   {"Fg", 257		UNTIC_COMMENT("F52 function key")},</div><div class='add'>+   {"Fh", 258		UNTIC_COMMENT("F53 function key")},</div><div class='add'>+   {"Fi", 259		UNTIC_COMMENT("F54 function key")},</div><div class='add'>+   {"Fj", 260		UNTIC_COMMENT("F55 function key")},</div><div class='add'>+   {"Fk", 261		UNTIC_COMMENT("F56 function key")},</div><div class='add'>+   {"Fl", 262		UNTIC_COMMENT("F57 function key")},</div><div class='add'>+   {"Fm", 263		UNTIC_COMMENT("F58 function key")},</div><div class='add'>+   {"Fn", 264		UNTIC_COMMENT("F59 function key")},</div><div class='add'>+   {"Fo", 265		UNTIC_COMMENT("F60 function key")},</div><div class='add'>+   {"Fp", 266		UNTIC_COMMENT("F61 function key")},</div><div class='add'>+   {"Fq", 267		UNTIC_COMMENT("F62 function key")},</div><div class='add'>+   {"Fr", 268		UNTIC_COMMENT("F63 function key")},</div><div class='add'>+   {"G1", 400		UNTIC_COMMENT("single upper right")},</div><div class='add'>+   {"G2", 398		UNTIC_COMMENT("single upper left")},</div><div class='add'>+   {"G3", 399		UNTIC_COMMENT("single lower left")},</div><div class='add'>+   {"G4", 401		UNTIC_COMMENT("single lower right")},</div><div class='add'>+   {"GC", 408		UNTIC_COMMENT("single intersection")},</div><div class='add'>+   {"GD", 405		UNTIC_COMMENT("tee pointing down")},</div><div class='add'>+   {"GH", 406		UNTIC_COMMENT("single horizontal line")},</div><div class='add'>+   {"GL", 403		UNTIC_COMMENT("tee pointing left")},</div><div class='add'>+   {"GR", 402		UNTIC_COMMENT("tee pointing right")},</div><div class='add'>+   {"GU", 404		UNTIC_COMMENT("tee pointing up")},</div><div class='add'>+   {"GV", 407		UNTIC_COMMENT("single vertical line")},</div><div class='add'>+   {"Gm", 358		UNTIC_COMMENT("Curses should get button events")},</div><div class='add'>+   {"HU", 279		UNTIC_COMMENT("hang-up phone")},</div><div class='add'>+   {"IC", 108		UNTIC_COMMENT("insert #1 chars")},</div><div class='add'>+   {"Ic", 299		UNTIC_COMMENT("initialize color #1 to (#2,#3,#4)")},</div><div class='add'>+   {"Ip", 300		UNTIC_COMMENT("Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7)")},</div><div class='add'>+   {"K1", 139		UNTIC_COMMENT("upper left of keypad")},</div><div class='add'>+   {"K2", 141		UNTIC_COMMENT("center of keypad")},</div><div class='add'>+   {"K3", 140		UNTIC_COMMENT("upper right of keypad")},</div><div class='add'>+   {"K4", 142		UNTIC_COMMENT("lower left of keypad")},</div><div class='add'>+   {"K5", 143		UNTIC_COMMENT("lower right of keypad")},</div><div class='add'>+   {"Km", 355		UNTIC_COMMENT("Mouse event has occurred")},</div><div class='add'>+   {"LE", 111		UNTIC_COMMENT("move #1 chars to the left")},</div><div class='add'>+   {"LF", 157		UNTIC_COMMENT("turn off soft labels")},</div><div class='add'>+   {"LO", 156		UNTIC_COMMENT("turn on soft labels")},</div><div class='add'>+   {"Lf", 273		UNTIC_COMMENT("label format")},</div><div class='add'>+   {"MC", 270		UNTIC_COMMENT("clear right and left soft margins")},</div><div class='add'>+   {"ML", 271		UNTIC_COMMENT("set left soft margin")},</div><div class='add'>+   {"ML", 368		UNTIC_COMMENT("Set both left and right margins to #1, #2")},</div><div class='add'>+   {"MR", 272		UNTIC_COMMENT("set right soft margin")},</div><div class='add'>+   {"MT", 369		UNTIC_COMMENT("Sets both top and bottom margins to #1, #2")},</div><div class='add'>+   {"Mi", 356		UNTIC_COMMENT("Mouse status information")},</div><div class='add'>+   {"PA", 285		UNTIC_COMMENT("pause for 2-3 seconds")},</div><div class='add'>+   {"PU", 283		UNTIC_COMMENT("select pulse dialling")},</div><div class='add'>+   {"QD", 281		UNTIC_COMMENT("dial number #1 without checking")},</div><div class='add'>+   {"RA", 152		UNTIC_COMMENT("turn off automatic margins")},</div><div class='add'>+   {"RC", 276		UNTIC_COMMENT("remove clock")},</div><div class='add'>+   {"RF", 215		UNTIC_COMMENT("send next input char (for ptys)")},</div><div class='add'>+   {"RI", 112 		UNTIC_COMMENT("parm_right_cursor")},</div><div class='add'>+   {"RQ", 357		UNTIC_COMMENT("Request mouse position")},</div><div class='add'>+   {"RX", 150		UNTIC_COMMENT("turn off xon/xoff handshaking")},</div><div class='add'>+   {"S1", 378		UNTIC_COMMENT("Display PC character")},</div><div class='add'>+   {"S2", 379		UNTIC_COMMENT("Enter PC character display mode")},</div><div class='add'>+   {"S3", 380		UNTIC_COMMENT("Exit PC character display mode")},</div><div class='add'>+   {"S4", 381		UNTIC_COMMENT("Enter PC scancode mode")},</div><div class='add'>+   {"S5", 382		UNTIC_COMMENT("Exit PC scancode mode")},</div><div class='add'>+   {"S6", 383		UNTIC_COMMENT("PC terminal options")},</div><div class='add'>+   {"S7", 384		UNTIC_COMMENT("Escape for scancode emulation")},</div><div class='add'>+   {"S8", 385		UNTIC_COMMENT("Alternate escape for scancode emulation")},</div><div class='add'>+   {"SA", 151		UNTIC_COMMENT("turn on automatic margins")},</div><div class='add'>+   {"SC", 274		UNTIC_COMMENT("set clock, #1 hrs #2 mins #3 secs")},</div><div class='add'>+   {"SF", 109		UNTIC_COMMENT("scroll forward #1 lines")},</div><div class='add'>+   {"SR", 113		UNTIC_COMMENT("scroll back #1 lines")},</div><div class='add'>+   {"SX", 149		UNTIC_COMMENT("turn on xon/xoff handshaking")},</div><div class='add'>+   {"Sb", 303 		UNTIC_COMMENT("set background (color)")},</div><div class='add'>+   {"Sf", 302 		UNTIC_COMMENT("set foreground (color)")},</div><div class='add'>+   {"TO", 282		UNTIC_COMMENT("select touch tone dialing")},</div><div class='add'>+   {"UP", 114		UNTIC_COMMENT("up #1 lines")},</div><div class='add'>+   {"WA", 286		UNTIC_COMMENT("wait for dial-tone")},</div><div class='add'>+   {"WG", 278		UNTIC_COMMENT("go to window #1")},</div><div class='add'>+   {"XF", 154		UNTIC_COMMENT("XOFF character")},</div><div class='add'>+   {"XN", 153		UNTIC_COMMENT("XON character")},</div><div class='add'>+   {"Xh", 386		UNTIC_COMMENT("Enter horizontal highlight mode")},</div><div class='add'>+   {"Xl", 387		UNTIC_COMMENT("Enter left highlight mode")},</div><div class='add'>+   {"Xo", 388		UNTIC_COMMENT("Enter low highlight mode")},</div><div class='add'>+   {"Xr", 389		UNTIC_COMMENT("Enter right highlight mode")},</div><div class='add'>+   {"Xt", 390		UNTIC_COMMENT("Enter top highlight mode")},</div><div class='add'>+   {"Xv", 391		UNTIC_COMMENT("Enter vertical highlight mode")},</div><div class='add'>+   {"Xy", 370		UNTIC_COMMENT("Repeat bit image cell #1 #2 times")},</div><div class='add'>+   {"YZ", 377		UNTIC_COMMENT("Set page length to #1 lines")},</div><div class='add'>+   {"Yv", 372		UNTIC_COMMENT("Move to beginning of same row")},</div><div class='add'>+   {"Yw", 373		UNTIC_COMMENT("Give name for color #1")},</div><div class='add'>+   {"Yx", 374		UNTIC_COMMENT("Define rectangualar bit image region")},</div><div class='add'>+   {"Yy", 375		UNTIC_COMMENT("End a bit-image region")},</div><div class='add'>+   {"Yz", 376		UNTIC_COMMENT("Change to ribbon color #1")},</div><div class='add'>+   {"ZA", 304		UNTIC_COMMENT("Change number of characters per inch")},</div><div class='add'>+   {"ZB", 305		UNTIC_COMMENT("Change number of lines per inch")},</div><div class='add'>+   {"ZC", 306		UNTIC_COMMENT("Change horizontal resolution")},</div><div class='add'>+   {"ZD", 307		UNTIC_COMMENT("Change vertical resolution")},</div><div class='add'>+   {"ZE", 308		UNTIC_COMMENT("Define a character")},</div><div class='add'>+   {"ZF", 309		UNTIC_COMMENT("Enter double-wide mode")},</div><div class='add'>+   {"ZG", 310		UNTIC_COMMENT("Enter draft-quality mode")},</div><div class='add'>+   {"ZH", 311		UNTIC_COMMENT("Enter italic mode")},</div><div class='add'>+   {"ZI", 312		UNTIC_COMMENT("Start leftward carriage motion")},</div><div class='add'>+   {"ZJ", 313		UNTIC_COMMENT("Start micro-motion mode")},</div><div class='add'>+   {"ZK", 314		UNTIC_COMMENT("Enter NLQ mode")},</div><div class='add'>+   {"ZL", 315		UNTIC_COMMENT("Wnter normal-quality mode")},</div><div class='add'>+   {"ZM", 316		UNTIC_COMMENT("Enter shadow-print mode")},</div><div class='add'>+   {"ZN", 317		UNTIC_COMMENT("Enter subscript mode")},</div><div class='add'>+   {"ZO", 318		UNTIC_COMMENT("Enter superscript mode")},</div><div class='add'>+   {"ZP", 319		UNTIC_COMMENT("Start upward carriage motion")},</div><div class='add'>+   {"ZQ", 320		UNTIC_COMMENT("End double-wide mode")},</div><div class='add'>+   {"ZR", 321		UNTIC_COMMENT("End italic mode")},</div><div class='add'>+   {"ZS", 322		UNTIC_COMMENT("End left-motion mode")},</div><div class='add'>+   {"ZT", 323		UNTIC_COMMENT("End micro-motion mode")},</div><div class='add'>+   {"ZU", 324		UNTIC_COMMENT("End shadow-print mode")},</div><div class='add'>+   {"ZV", 325		UNTIC_COMMENT("End subscript mode")},</div><div class='add'>+   {"ZW", 326		UNTIC_COMMENT("End superscript mode")},</div><div class='add'>+   {"ZX", 327		UNTIC_COMMENT("End reverse character motion")},</div><div class='add'>+   {"ZY", 328		UNTIC_COMMENT("Like column_address in micro mode")},</div><div class='add'>+   {"ZZ", 329		UNTIC_COMMENT("Like cursor_down in micro mode")},</div><div class='add'>+   {"Za", 330		UNTIC_COMMENT("Like cursor_left in micro mode")},</div><div class='add'>+   {"Zb", 331		UNTIC_COMMENT("Like cursor_right in micro mode")},</div><div class='add'>+   {"Zc", 332		UNTIC_COMMENT("Like row_address in micro mode")},</div><div class='add'>+   {"Zd", 333		UNTIC_COMMENT("Like cursor_up in micro mode")},</div><div class='add'>+   {"Ze", 334		UNTIC_COMMENT("Match software bits to print-head pins")},</div><div class='add'>+   {"Zf", 335		UNTIC_COMMENT("Like parm_down_cursor in micro mode")},</div><div class='add'>+   {"Zg", 336		UNTIC_COMMENT("Like parm_left_cursor in micro mode")},</div><div class='add'>+   {"Zh", 337		UNTIC_COMMENT("Like parm_right_cursor in micro mode")},</div><div class='add'>+   {"Zi", 338		UNTIC_COMMENT("Like parm_up_cursor in micro mode")},</div><div class='add'>+   {"Zj", 339		UNTIC_COMMENT("Select character set")},</div><div class='add'>+   {"Zk", 340		UNTIC_COMMENT("Set bottom margin at current line")},</div><div class='add'>+   {"Zl", 341		UNTIC_COMMENT("Set bottom margin at line #1 or #2 lines from bottom")},</div><div class='add'>+   {"Zm", 342		UNTIC_COMMENT("Set left (right) margin at column #1 (#2)")},</div><div class='add'>+   {"Zn", 343		UNTIC_COMMENT("Set right margin at column #1")},</div><div class='add'>+   {"Zo", 344		UNTIC_COMMENT("Set top margin at current line")},</div><div class='add'>+   {"Zp", 345		UNTIC_COMMENT("Set top (bottom) margin at row #1 (#2)")},</div><div class='add'>+   {"Zq", 346		UNTIC_COMMENT("Start printing bit image braphics")},</div><div class='add'>+   {"Zr", 347		UNTIC_COMMENT("Start character set definition")},</div><div class='add'>+   {"Zs", 348		UNTIC_COMMENT("Stop printing bit image graphics")},</div><div class='add'>+   {"Zt", 349		UNTIC_COMMENT("End definition of character aet")},</div><div class='add'>+   {"Zu", 350		UNTIC_COMMENT("List of subscriptable characters")},</div><div class='add'>+   {"Zv", 351		UNTIC_COMMENT("List of superscriptable characters")},</div><div class='add'>+   {"Zw", 352		UNTIC_COMMENT("Printing any of these chars causes CR")},</div><div class='add'>+   {"Zx", 353		UNTIC_COMMENT("No motion for subsequent character")},</div><div class='add'>+   {"Zy", 354		UNTIC_COMMENT("List of character set names")},</div><div class='add'>+   {"Zz", 371		UNTIC_COMMENT("Move to next row of the bit image")},</div><div class='add'>+   {"ac", 146 		UNTIC_COMMENT("acs_chars")},</div><div class='add'>+   {"ae", 38 		UNTIC_COMMENT("exit_alt_charset_mode")},</div><div class='add'>+   {"al", 53		UNTIC_COMMENT("insert line")},</div><div class='add'>+   {"as", 25 		UNTIC_COMMENT("enter_alt_charset_mode")},</div><div class='add'>+   {"bc", 395		UNTIC_COMMENT("move left, if not ^H")},</div><div class='add'>+   {"bl", 1		UNTIC_COMMENT("audible signal (bell)")},</div><div class='add'>+   {"bt", 0		UNTIC_COMMENT("back tab")},</div><div class='add'>+   {"bx", 411		UNTIC_COMMENT("box chars primary set")},</div><div class='add'>+   {"cb", 269		UNTIC_COMMENT("Clear to beginning of line")},</div><div class='add'>+   {"cd", 7		UNTIC_COMMENT("clear to end of screen")},</div><div class='add'>+   {"ce", 6 		UNTIC_COMMENT("clr_eol")},</div><div class='add'>+   {"ch", 8		UNTIC_COMMENT("horizontal position #1, absolute")},</div><div class='add'>+   {"ci", 363		UNTIC_COMMENT("Init sequence for multiple codesets")},</div><div class='add'>+   {"cl", 5		UNTIC_COMMENT("clear screen and home cursor")},</div><div class='add'>+   {"cm", 10		UNTIC_COMMENT("move to row #1 columns #2")},</div><div class='add'>+   {"cr", 2		UNTIC_COMMENT("carriage return")},</div><div class='add'>+   {"cs", 3		UNTIC_COMMENT("change region to line #1 to line #2")},</div><div class='add'>+   {"ct", 4		UNTIC_COMMENT("clear all tab stops")},</div><div class='add'>+   {"cv", 127		UNTIC_COMMENT("vertical position #1 absolute")},</div><div class='add'>+   {"dc", 21		UNTIC_COMMENT("delete character")},</div><div class='add'>+   {"dl", 22		UNTIC_COMMENT("delete line")},</div><div class='add'>+   {"dm", 29		UNTIC_COMMENT("enter delete mode")},</div><div class='add'>+   {"do", 11		UNTIC_COMMENT("down one line")},</div><div class='add'>+   {"ds", 23		UNTIC_COMMENT("disable status line")},</div><div class='add'>+   {"dv", 362		UNTIC_COMMENT("Indicate language/codeset support")},</div><div class='add'>+   {"eA", 155		UNTIC_COMMENT("enable alternate char set")},</div><div class='add'>+   {"ec", 37		UNTIC_COMMENT("erase #1 characters")},</div><div class='add'>+   {"ed", 41		UNTIC_COMMENT("end delete mode")},</div><div class='add'>+   {"ei", 42		UNTIC_COMMENT("exit insert mode")},</div><div class='add'>+   {"ff", 46		UNTIC_COMMENT("hardcopy terminal page eject")},</div><div class='add'>+   {"fh", 284		UNTIC_COMMENT("flash switch hook")},</div><div class='add'>+   {"fs", 47		UNTIC_COMMENT("return from status line")},</div><div class='add'>+   {"hd", 24		UNTIC_COMMENT("half a line down")},</div><div class='add'>+   {"ho", 12		UNTIC_COMMENT("home cursor (if no cup)")},</div><div class='add'>+   {"hu", 137		UNTIC_COMMENT("half a line up")},</div><div class='add'>+   {"i1", 48		UNTIC_COMMENT("initialization string")},</div><div class='add'>+   {"i2", 392		UNTIC_COMMENT("secondary initialization string")},</div><div class='add'>+   {"i3", 50		UNTIC_COMMENT("initialization string")},</div><div class='add'>+   {"iP", 138		UNTIC_COMMENT("path name of program for initialization")},</div><div class='add'>+   {"ic", 52		UNTIC_COMMENT("insert character")},</div><div class='add'>+   {"if", 51		UNTIC_COMMENT("name of initialization file")},</div><div class='add'>+   {"im", 31		UNTIC_COMMENT("enter insert mode")},</div><div class='add'>+   {"ip", 54		UNTIC_COMMENT("insert padding after inserted character")},</div><div class='add'>+   {"is", 49		UNTIC_COMMENT("initialization string")},</div><div class='add'>+   {"k0", 65		UNTIC_COMMENT("F0 function key")},</div><div class='add'>+   {"k1", 66		UNTIC_COMMENT("F1 function key")},</div><div class='add'>+   {"k2", 68		UNTIC_COMMENT("F2 function key")},</div><div class='add'>+   {"k3", 69		UNTIC_COMMENT("F3 function key")},</div><div class='add'>+   {"k4", 70		UNTIC_COMMENT("F4 function key")},</div><div class='add'>+   {"k5", 71		UNTIC_COMMENT("F5 function key")},</div><div class='add'>+   {"k6", 72		UNTIC_COMMENT("F6 function key")},</div><div class='add'>+   {"k7", 73		UNTIC_COMMENT("F7 function key")},</div><div class='add'>+   {"k8", 74		UNTIC_COMMENT("F8 fucntion key")},</div><div class='add'>+   {"k9", 75		UNTIC_COMMENT("F9 function key")},</div><div class='add'>+   {"k;", 67		UNTIC_COMMENT("F10 function key")},</div><div class='add'>+   {"kA", 78		UNTIC_COMMENT("insert-line key")},</div><div class='add'>+   {"kB", 148		UNTIC_COMMENT("back-tab key")},</div><div class='add'>+   {"kC", 57		UNTIC_COMMENT("clear-screen or erase key")},</div><div class='add'>+   {"kD", 59		UNTIC_COMMENT("delete-character key")},</div><div class='add'>+   {"kE", 63		UNTIC_COMMENT("clear-to-end-of-line key")},</div><div class='add'>+   {"kF", 84		UNTIC_COMMENT("scroll-forward key")},</div><div class='add'>+   {"kH", 80		UNTIC_COMMENT("last-line key")},</div><div class='add'>+   {"kI", 77		UNTIC_COMMENT("insert-character key")},</div><div class='add'>+   {"kL", 60		UNTIC_COMMENT("delete-line key")},</div><div class='add'>+   {"kM", 62		UNTIC_COMMENT("sent by rmir or smir in insert mode")},</div><div class='add'>+   {"kN", 81		UNTIC_COMMENT("next-page key")},</div><div class='add'>+   {"kP", 82		UNTIC_COMMENT("prev-page key")},</div><div class='add'>+   {"kR", 85		UNTIC_COMMENT("scroll-backward key")},</div><div class='add'>+   {"kS", 64		UNTIC_COMMENT("clear-to-end-of-screen key")},</div><div class='add'>+   {"kT", 86		UNTIC_COMMENT("set-tab key")},</div><div class='add'>+   {"ka", 56		UNTIC_COMMENT("clear-all-tabs key")},</div><div class='add'>+   {"kb", 55		UNTIC_COMMENT("backspace key")},</div><div class='add'>+   {"kd", 61		UNTIC_COMMENT("down-arrow key")},</div><div class='add'>+   {"ke", 88		UNTIC_COMMENT("leave 'keyboard_transmit' mode")},</div><div class='add'>+   {"kh", 76		UNTIC_COMMENT("home key")},</div><div class='add'>+   {"kl", 79		UNTIC_COMMENT("left-arrow key")},</div><div class='add'>+   {"ko", 396		UNTIC_COMMENT("list of self-mapped keycaps")},</div><div class='add'>+   {"kr", 83		UNTIC_COMMENT("right-arrow key")},</div><div class='add'>+   {"ks", 89		UNTIC_COMMENT("enter 'keyboard_transmit' mode")},</div><div class='add'>+   {"kt", 58		UNTIC_COMMENT("clear-tab key")},</div><div class='add'>+   {"ku", 87		UNTIC_COMMENT("up-arrow key")},</div><div class='add'>+   {"l0", 90		UNTIC_COMMENT("label on function key f0 if not f0")},</div><div class='add'>+   {"l1", 91		UNTIC_COMMENT("label on function key f1 if not f1")},</div><div class='add'>+   {"l2", 93		UNTIC_COMMENT("label on function key f2 if not f2")},</div><div class='add'>+   {"l3", 94		UNTIC_COMMENT("label on function key f3 if not f3")},</div><div class='add'>+   {"l4", 95		UNTIC_COMMENT("label on function key f4 if not f4")},</div><div class='add'>+   {"l5", 96		UNTIC_COMMENT("lable on function key f5 if not f5")},</div><div class='add'>+   {"l6", 97		UNTIC_COMMENT("label on function key f6 if not f6")},</div><div class='add'>+   {"l7", 98		UNTIC_COMMENT("label on function key f7 if not f7")},</div><div class='add'>+   {"l8", 99		UNTIC_COMMENT("label on function key f8 if not f8")},</div><div class='add'>+   {"l9", 100		UNTIC_COMMENT("label on function key f9 if not f9")},</div><div class='add'>+   {"la", 92		UNTIC_COMMENT("label on function key f10 if not f10")},</div><div class='add'>+   {"le", 14		UNTIC_COMMENT("move left one space")},</div><div class='add'>+   {"ll", 18		UNTIC_COMMENT("last line, first column (if no cup)")},</div><div class='add'>+   {"ma", 397		UNTIC_COMMENT("map arrow keys rogue(1) motion keys")},</div><div class='add'>+   {"mb", 26		UNTIC_COMMENT("turn on blinking")},</div><div class='add'>+   {"md", 27		UNTIC_COMMENT("turn on bold (extra bright) mode")},</div><div class='add'>+   {"me", 39		UNTIC_COMMENT("turn off all attributes")},</div><div class='add'>+   {"mh", 30		UNTIC_COMMENT("turn on half-bright mode")},</div><div class='add'>+   {"mk", 32		UNTIC_COMMENT("turn on blank mode (characters invisible)")},</div><div class='add'>+   {"ml", 409		UNTIC_COMMENT("memory lock above")},</div><div class='add'>+   {"mm", 102		UNTIC_COMMENT("turn on meta mode (8th-bit on)")},</div><div class='add'>+   {"mo", 101		UNTIC_COMMENT("turn off meta mode")},</div><div class='add'>+   {"mp", 33		UNTIC_COMMENT("turn on protected mode")},</div><div class='add'>+   {"mr", 34		UNTIC_COMMENT("turn on reverse video mode")},</div><div class='add'>+   {"mu", 410		UNTIC_COMMENT("memory unlock")},</div><div class='add'>+   {"nd", 17		UNTIC_COMMENT("move right one space")},</div><div class='add'>+   {"nl", 394		UNTIC_COMMENT("use to move down")},</div><div class='add'>+   {"nw", 103		UNTIC_COMMENT("newline (behave like cr followed by lf)")},</div><div class='add'>+   {"oc", 298		UNTIC_COMMENT("Set all color pairs to the original ones")},</div><div class='add'>+   {"op", 297		UNTIC_COMMENT("Set default pair to its original value")},</div><div class='add'>+   {"pO", 144		UNTIC_COMMENT("turn on printer for #1 bytes")},</div><div class='add'>+   {"pc", 104		UNTIC_COMMENT("padding char (instead of null)")},</div><div class='add'>+   {"pf", 119		UNTIC_COMMENT("turn off printer")},</div><div class='add'>+   {"pk", 115		UNTIC_COMMENT("program function key #1 to type string #2")},</div><div class='add'>+   {"pl", 116		UNTIC_COMMENT("program function key #1 to execute string #2")},</div><div class='add'>+   {"pn", 147		UNTIC_COMMENT("program label #1 to show string #2")},</div><div class='add'>+   {"po", 120		UNTIC_COMMENT("turn on printer")},</div><div class='add'>+   {"ps", 118		UNTIC_COMMENT("print contents of screen")},</div><div class='add'>+   {"px", 117		UNTIC_COMMENT("program function key #1 to transmit string #2")},</div><div class='add'>+   {"r1", 122		UNTIC_COMMENT("reset string")},</div><div class='add'>+   {"r2", 123		UNTIC_COMMENT("reset string")},</div><div class='add'>+   {"r3", 124		UNTIC_COMMENT("reset string")},</div><div class='add'>+   {"rP", 145		UNTIC_COMMENT("like ip but when in insert mode")},</div><div class='add'>+   {"rc", 126		UNTIC_COMMENT("restore cursor to last position of sc")},</div><div class='add'>+   {"rf", 125		UNTIC_COMMENT("name of reset file")},</div><div class='add'>+   {"rp", 121		UNTIC_COMMENT("repeat char #1 #2 times")},</div><div class='add'>+   {"rs", 393		UNTIC_COMMENT("terminal reset string")},</div><div class='add'>+   {"s0", 364		UNTIC_COMMENT("Shift to code set 0 (EUC set 0, ASCII)")},</div><div class='add'>+   {"s1", 365		UNTIC_COMMENT("Shift to code set 1")},</div><div class='add'>+   {"s2", 366		UNTIC_COMMENT("Shift to code set 2")},</div><div class='add'>+   {"s3", 367		UNTIC_COMMENT("Shift to code set 3")},</div><div class='add'>+   {"sa", 131		UNTIC_COMMENT("define video attributes #1-#9 (PG9)")},</div><div class='add'>+   {"sc", 128		UNTIC_COMMENT("save current cursor position")},</div><div class='add'>+   {"se", 43		UNTIC_COMMENT("exit standout mode")},</div><div class='add'>+   {"sf", 129		UNTIC_COMMENT("scroll text up")},</div><div class='add'>+   {"so", 35		UNTIC_COMMENT("begin standout mode")},</div><div class='add'>+   {"sp", 301		UNTIC_COMMENT("Set current color pair to #1")},</div><div class='add'>+   {"sr", 130		UNTIC_COMMENT("scroll text down")},</div><div class='add'>+   {"st", 132		UNTIC_COMMENT("set a tab in every row, current columns")},</div><div class='add'>+   {"ta", 134		UNTIC_COMMENT("tab to next 8-space hardware tab stop")},</div><div class='add'>+   {"te", 40		UNTIC_COMMENT("strings to end programs using cup")},</div><div class='add'>+   {"ti", 28		UNTIC_COMMENT("string to start programs using cup")},</div><div class='add'>+   {"ts", 135		UNTIC_COMMENT("move to status line")},</div><div class='add'>+   {"u0", 287		UNTIC_COMMENT("User string #0")},</div><div class='add'>+   {"u1", 288		UNTIC_COMMENT("User string #1")},</div><div class='add'>+   {"u2", 289		UNTIC_COMMENT("User string #2")},</div><div class='add'>+   {"u3", 290		UNTIC_COMMENT("User string #3")},</div><div class='add'>+   {"u4", 291		UNTIC_COMMENT("User string #4")},</div><div class='add'>+   {"u5", 292		UNTIC_COMMENT("User string #5")},</div><div class='add'>+   {"u6", 293		UNTIC_COMMENT("User string #6")},</div><div class='add'>+   {"u7", 294		UNTIC_COMMENT("User string #7")},</div><div class='add'>+   {"u8", 295		UNTIC_COMMENT("User string #8")},</div><div class='add'>+   {"u9", 296		UNTIC_COMMENT("User string #9")},</div><div class='add'>+   {"uc", 136		UNTIC_COMMENT("underline char and move past it")},</div><div class='add'>+   {"ue", 44		UNTIC_COMMENT("exit underline mode")},</div><div class='add'>+   {"up", 19		UNTIC_COMMENT("up one line")},</div><div class='add'>+   {"us", 36		UNTIC_COMMENT("begin underline mode")},</div><div class='add'>+   {"vb", 45		UNTIC_COMMENT("visible bell (may not move cursor)")},</div><div class='add'>+   {"ve", 16		UNTIC_COMMENT("make cursor appear normal (undo civis/cvvis)")},</div><div class='add'>+   {"vi", 13		UNTIC_COMMENT("make cursor invisible")},</div><div class='add'>+   {"vs", 20		UNTIC_COMMENT("make cursor very visible")},</div><div class='add'>+   {"wi", 133		UNTIC_COMMENT("current window is lines #1-#2 cols #3-#4")},</div><div class='add'>+   {"xl", 361		UNTIC_COMMENT("Program function key #1 to type string #2 and show string #3")},</div><div class='add'>+   {"", -1		UNTIC_COMMENT(NULL)}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static int compute_cap_offset (char *cap, SLterminfo_Type *t, Tgetstr_Map_Type *map, unsigned int max_ofs)</div><div class='add'>+{</div><div class='add'>+   char cha, chb;</div><div class='add'>+</div><div class='add'>+   (void) t;</div><div class='add'>+   cha = *cap++; chb = *cap;</div><div class='add'>+</div><div class='add'>+   while (*map-&gt;name != 0)</div><div class='add'>+     {</div><div class='add'>+	if ((cha == *map-&gt;name) &amp;&amp; (chb == *(map-&gt;name + 1)))</div><div class='add'>+	  {</div><div class='add'>+	     if (map-&gt;offset &gt;= (int) max_ofs) return -1;</div><div class='add'>+	     return map-&gt;offset;</div><div class='add'>+	  }</div><div class='add'>+	map++;</div><div class='add'>+     }</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *_SLtt_tigetstr (SLterminfo_Type *t, char *cap)</div><div class='add'>+{</div><div class='add'>+   int offset;</div><div class='add'>+</div><div class='add'>+   if (t == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   if (t-&gt;flags == SLTERMCAP) return tcap_getstr (cap, t);</div><div class='add'>+</div><div class='add'>+   offset = compute_cap_offset (cap, t, Tgetstr_Map, t-&gt;num_string_offsets);</div><div class='add'>+   if (offset &lt; 0) return NULL;</div><div class='add'>+   offset = make_integer (t-&gt;string_offsets + 2 * offset);</div><div class='add'>+   if (offset &lt; 0) return NULL;</div><div class='add'>+   return t-&gt;string_table + offset;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static Tgetstr_Map_Type Tgetnum_Map[] =</div><div class='add'>+{</div><div class='add'>+   {"BT", 30		UNTIC_COMMENT("number of buttons on mouse")},</div><div class='add'>+   {"Co", 13		UNTIC_COMMENT("maximum numbers of colors on screen")},</div><div class='add'>+   {"MW", 12		UNTIC_COMMENT("maxumum number of defineable windows")},</div><div class='add'>+   {"NC", 15		UNTIC_COMMENT("video attributes that can't be used with colors")},</div><div class='add'>+   {"Nl", 8		UNTIC_COMMENT("number of labels on screen")},</div><div class='add'>+   {"Ya", 16		UNTIC_COMMENT("numbers of bytes buffered before printing")},</div><div class='add'>+   {"Yb", 17		UNTIC_COMMENT("spacing of pins vertically in pins per inch")},</div><div class='add'>+   {"Yc", 18		UNTIC_COMMENT("spacing of dots horizontally in dots per inch")},</div><div class='add'>+   {"Yd", 19		UNTIC_COMMENT("maximum value in micro_..._address")},</div><div class='add'>+   {"Ye", 20		UNTIC_COMMENT("maximum value in parm_..._micro")},</div><div class='add'>+   {"Yf", 21		UNTIC_COMMENT("character size when in micro mode")},</div><div class='add'>+   {"Yg", 22		UNTIC_COMMENT("line size when in micro mode")},</div><div class='add'>+   {"Yh", 23		UNTIC_COMMENT("numbers of pins in print-head")},</div><div class='add'>+   {"Yi", 24		UNTIC_COMMENT("horizontal resolution in units per line")},</div><div class='add'>+   {"Yj", 25		UNTIC_COMMENT("vertical resolution in units per line")},</div><div class='add'>+   {"Yk", 26		UNTIC_COMMENT("horizontal resolution in units per inch")},</div><div class='add'>+   {"Yl", 27		UNTIC_COMMENT("vertical resolution in units per inch")},</div><div class='add'>+   {"Ym", 28		UNTIC_COMMENT("print rate in chars per second")},</div><div class='add'>+   {"Yn", 29		UNTIC_COMMENT("character step size when in double wide mode")},</div><div class='add'>+   {"Yo", 31		UNTIC_COMMENT("number of passed for each bit-image row")},</div><div class='add'>+   {"Yp", 32		UNTIC_COMMENT("type of bit-image device")},</div><div class='add'>+   {"co", 0		UNTIC_COMMENT("number of columns in aline")},</div><div class='add'>+   {"dB", 36		UNTIC_COMMENT("padding required for ^H")},</div><div class='add'>+   {"dC", 34		UNTIC_COMMENT("pad needed for CR")},</div><div class='add'>+   {"dN", 35		UNTIC_COMMENT("pad needed for LF")},</div><div class='add'>+   {"dT", 37		UNTIC_COMMENT("padding required for ^I")},</div><div class='add'>+   {"it", 1		UNTIC_COMMENT("tabs initially every # spaces")},</div><div class='add'>+   {"kn", 38		UNTIC_COMMENT("count of function keys")},</div><div class='add'>+   {"lh", 9		UNTIC_COMMENT("rows in each label")},</div><div class='add'>+   {"li", 2		UNTIC_COMMENT("number of lines on screen or page")},</div><div class='add'>+   {"lm", 3		UNTIC_COMMENT("lines of memory if &gt; line. 0 =&gt; varies")},</div><div class='add'>+   {"lw", 10		UNTIC_COMMENT("columns in each label")},</div><div class='add'>+   {"ma", 11		UNTIC_COMMENT("maximum combined attributes terminal can handle")},</div><div class='add'>+   {"pa", 14		UNTIC_COMMENT("maximum number of color-pairs on the screen")},</div><div class='add'>+   {"pb", 5		UNTIC_COMMENT("lowest baud rate where padding needed")},</div><div class='add'>+   {"sg", 4		UNTIC_COMMENT("number of blank chars left by smso or rmso")},</div><div class='add'>+   {"ug", 33		UNTIC_COMMENT("number of blanks left by ul")},</div><div class='add'>+   {"vt", 6		UNTIC_COMMENT("virtual terminal number (CB/unix)")},</div><div class='add'>+   {"ws", 7		UNTIC_COMMENT("columns in status line")},</div><div class='add'>+   {"", -1		UNTIC_COMMENT(NULL)}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLtt_tigetnum (SLterminfo_Type *t, char *cap)</div><div class='add'>+{</div><div class='add'>+   int offset;</div><div class='add'>+</div><div class='add'>+   if (t == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (t-&gt;flags == SLTERMCAP) return tcap_getnum (cap, t);</div><div class='add'>+</div><div class='add'>+   offset = compute_cap_offset (cap, t, Tgetnum_Map, t-&gt;num_numbers);</div><div class='add'>+   if (offset &lt; 0) return -1;</div><div class='add'>+   return make_integer (t-&gt;numbers + 2 * offset);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static Tgetstr_Map_Type Tgetflag_Map[] =</div><div class='add'>+{</div><div class='add'>+   {"5i", 22		UNTIC_COMMENT("printer won't echo on screen")},</div><div class='add'>+   {"HC", 23		UNTIC_COMMENT("cursor is hard to see")},</div><div class='add'>+   {"MT", 40		UNTIC_COMMENT("has meta key")},</div><div class='add'>+   {"ND", 26		UNTIC_COMMENT("scrolling region is non-destructive")},</div><div class='add'>+   {"NL", 41		UNTIC_COMMENT("move down with \n")},</div><div class='add'>+   {"NP", 25		UNTIC_COMMENT("pad character does not exist")},</div><div class='add'>+   {"NR", 24		UNTIC_COMMENT("smcup does not reverse rmcup")},</div><div class='add'>+   {"YA", 30		UNTIC_COMMENT("only positive motion for hpa/mhpa caps")},</div><div class='add'>+   {"YB", 31		UNTIC_COMMENT("using cr turns off micro mode")},</div><div class='add'>+   {"YC", 32		UNTIC_COMMENT("printer needs operator to change character set")},</div><div class='add'>+   {"YD", 33		UNTIC_COMMENT("only positive motion for vpa/mvpa caps")},</div><div class='add'>+   {"YE", 34		UNTIC_COMMENT("printing in last column causes cr")},</div><div class='add'>+   {"YF", 35		UNTIC_COMMENT("changing character pitch changes resolution")},</div><div class='add'>+   {"YG", 36		UNTIC_COMMENT("changing line pitch changes resolution")},</div><div class='add'>+   {"am", 1		UNTIC_COMMENT("terminal has automatic margins")},</div><div class='add'>+   {"bs", 37		UNTIC_COMMENT("uses ^H to move left")},</div><div class='add'>+   {"bw", 0		UNTIC_COMMENT("cub1 wraps from column 0 to last column")},</div><div class='add'>+   {"cc", 27		UNTIC_COMMENT("terminal can re-define existing colors")},</div><div class='add'>+   {"da", 11		UNTIC_COMMENT("display may be retained above the screen")},</div><div class='add'>+   {"db", 12		UNTIC_COMMENT("display may be retained below the screen")},</div><div class='add'>+   {"eo", 5		UNTIC_COMMENT("can erase overstrikes with a blank")},</div><div class='add'>+   {"es", 16		UNTIC_COMMENT("escape can be used on the status line")},</div><div class='add'>+   {"gn", 6		UNTIC_COMMENT("generic line type")},</div><div class='add'>+   {"hc", 7		UNTIC_COMMENT("hardcopy terminal")},</div><div class='add'>+   {"hl", 29		UNTIC_COMMENT("terminal uses only HLS color notation (tektronix)")},</div><div class='add'>+   {"hs", 9		UNTIC_COMMENT("has extra status line")},</div><div class='add'>+   {"hz", 18		UNTIC_COMMENT("can't print ~'s (hazeltine)")},</div><div class='add'>+   {"in", 10		UNTIC_COMMENT("insert mode distinguishes nulls")},</div><div class='add'>+   {"km", 8		UNTIC_COMMENT("Has a meta key, sets msb high")},</div><div class='add'>+   {"mi", 13		UNTIC_COMMENT("safe to move while in insert mode")},</div><div class='add'>+   {"ms", 14		UNTIC_COMMENT("safe to move while in standout mode")},</div><div class='add'>+   {"nc", 39		UNTIC_COMMENT("no way to go to start of line")},</div><div class='add'>+   {"ns", 38		UNTIC_COMMENT("crt cannot scroll")},</div><div class='add'>+   {"nx", 21		UNTIC_COMMENT("padding won't work, xon/xoff required")},</div><div class='add'>+   {"os", 15		UNTIC_COMMENT("terminal can overstrike")},</div><div class='add'>+   {"pt", 42		UNTIC_COMMENT("has 8-char tabs invoked with ^I")},</div><div class='add'>+   {"ul", 19		UNTIC_COMMENT("underline character overstrikes")},</div><div class='add'>+   {"ut", 28		UNTIC_COMMENT("screen erased with background color")},</div><div class='add'>+   {"xb", 2		UNTIC_COMMENT("beehive (f1=escape, f2=ctrl C)")},</div><div class='add'>+   {"xn", 4		UNTIC_COMMENT("newline ignored after 80 cols (concept)")},</div><div class='add'>+   {"xo", 20		UNTIC_COMMENT("terminal uses xon/xoff handshaking")},</div><div class='add'>+   {"xr", 43		UNTIC_COMMENT("return clears the line")},</div><div class='add'>+   {"xs", 3		UNTIC_COMMENT("standout not erased by overwriting (hp)")},</div><div class='add'>+   {"xt", 17		UNTIC_COMMENT("tabs destructive, magic so char (t1061)")},</div><div class='add'>+   {"", -1		UNTIC_COMMENT(NULL)}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLtt_tigetflag (SLterminfo_Type *t, char *cap)</div><div class='add'>+{</div><div class='add'>+   int offset;</div><div class='add'>+</div><div class='add'>+   if (t == NULL) return -1;</div><div class='add'>+</div><div class='add'>+   if (t-&gt;flags == SLTERMCAP) return tcap_getflag (cap, t);</div><div class='add'>+</div><div class='add'>+   offset = compute_cap_offset (cap, t, Tgetflag_Map, t-&gt;boolean_section_size);</div><div class='add'>+</div><div class='add'>+   if (offset &lt; 0) return -1;</div><div class='add'>+   return (int) *(t-&gt;boolean_flags + offset);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* These are my termcap routines.  They only work with the TERMCAP environment</div><div class='add'>+ * variable.  This variable must contain the termcap entry and NOT the file.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+static int tcap_getflag (char *cap, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+   char a, b;</div><div class='add'>+   char *f = (char *) t-&gt;boolean_flags;</div><div class='add'>+   char *fmax;</div><div class='add'>+</div><div class='add'>+   if (f == NULL) return 0;</div><div class='add'>+   fmax = f + t-&gt;boolean_section_size;</div><div class='add'>+</div><div class='add'>+   a = *cap;</div><div class='add'>+   b = *(cap + 1);</div><div class='add'>+   while (f &lt; fmax)</div><div class='add'>+     {</div><div class='add'>+	if ((a == f[0]) &amp;&amp; (b == f[1]))</div><div class='add'>+	  return 1;</div><div class='add'>+	f += 2;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *tcap_get_cap (unsigned char *cap, unsigned char *caps, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   unsigned char c0, c1;</div><div class='add'>+   unsigned char *caps_max;</div><div class='add'>+</div><div class='add'>+   c0 = cap[0];</div><div class='add'>+   c1 = cap[1];</div><div class='add'>+</div><div class='add'>+   if (caps == NULL) return NULL;</div><div class='add'>+   caps_max = caps + len;</div><div class='add'>+   while (caps &lt; caps_max)</div><div class='add'>+     {</div><div class='add'>+	if ((c0 == caps[0]) &amp;&amp; (c1 == caps[1]))</div><div class='add'>+	  {</div><div class='add'>+	     return (char *) caps + 3;</div><div class='add'>+	  }</div><div class='add'>+	caps += (int) caps[2];</div><div class='add'>+     }</div><div class='add'>+   return NULL;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int tcap_getnum (char *cap, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+   cap = tcap_get_cap ((unsigned char *) cap, t-&gt;numbers, t-&gt;num_numbers);</div><div class='add'>+   if (cap == NULL) return -1;</div><div class='add'>+   return atoi (cap);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *tcap_getstr (char *cap, SLterminfo_Type *t)</div><div class='add'>+{</div><div class='add'>+   return tcap_get_cap ((unsigned char *) cap, (unsigned char *) t-&gt;string_table, t-&gt;string_table_size);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int tcap_extract_field (unsigned char *t0)</div><div class='add'>+{</div><div class='add'>+   register unsigned char ch, *t = t0;</div><div class='add'>+   while (((ch = *t) != 0) &amp;&amp; (ch != ':')) t++;</div><div class='add'>+   if (ch == ':') return (int) (t - t0);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLtt_Try_Termcap = 1;</div><div class='add'>+static int tcap_getent (char *term, SLterminfo_Type *ti)</div><div class='add'>+{</div><div class='add'>+   unsigned char *termcap, ch;</div><div class='add'>+   unsigned char *buf, *b;</div><div class='add'>+   unsigned char *t;</div><div class='add'>+   int len;</div><div class='add'>+</div><div class='add'>+   if (SLtt_Try_Termcap == 0) return -1;</div><div class='add'>+#if 1</div><div class='add'>+   /* XFREE86 xterm sets the TERMCAP environment variable to an invalid</div><div class='add'>+    * value.  Specifically, it lacks the tc= string.</div><div class='add'>+    */</div><div class='add'>+   if (!strncmp (term, "xterm", 5))</div><div class='add'>+     return -1;</div><div class='add'>+#endif</div><div class='add'>+   termcap = (unsigned char *) getenv ("TERMCAP");</div><div class='add'>+   if ((termcap == NULL) || (*termcap == '/')) return -1;</div><div class='add'>+</div><div class='add'>+   /* We have a termcap so lets use it provided it does not have a reference</div><div class='add'>+    * to another terminal via tc=.  In that case, use terminfo.  The alternative</div><div class='add'>+    * would be to parse the termcap file which I do not want to do right now.</div><div class='add'>+    * Besides, this is a terminfo based system and if the termcap were parsed</div><div class='add'>+    * terminfo would almost never get a chance to run.  In addition, the tc=</div><div class='add'>+    * thing should not occur if tset is used to set the termcap entry.</div><div class='add'>+    */</div><div class='add'>+   t = termcap;</div><div class='add'>+   while ((len = tcap_extract_field (t)) != -1)</div><div class='add'>+     {</div><div class='add'>+	if ((len &gt; 3) &amp;&amp; (t[0] == 't') &amp;&amp; (t[1] == 'c') &amp;&amp; (t[2] == '='))</div><div class='add'>+	  return -1;</div><div class='add'>+	t += (len + 1);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* malloc some extra space just in case it is needed. */</div><div class='add'>+   len = strlen ((char *) termcap) + 256;</div><div class='add'>+   if (NULL == (buf = (unsigned char *) SLmalloc ((unsigned int) len))) return -1;</div><div class='add'>+</div><div class='add'>+   b = buf;</div><div class='add'>+</div><div class='add'>+   /* The beginning of the termcap entry contains the names of the entry.</div><div class='add'>+    * It is terminated by a colon.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   ti-&gt;terminal_names = (char *) b;</div><div class='add'>+   t = termcap;</div><div class='add'>+   len = tcap_extract_field (t);</div><div class='add'>+   if (len &lt; 0)</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *)buf);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   strncpy ((char *) b, (char *) t, (unsigned int) len);</div><div class='add'>+   b[len] = 0;</div><div class='add'>+   b += len + 1;</div><div class='add'>+   ti-&gt;name_section_size = len;</div><div class='add'>+</div><div class='add'>+   /* Now, we are really at the start of the termcap entries.  Point the</div><div class='add'>+    * termcap variable here since we want to refer to this a number of times.</div><div class='add'>+    */</div><div class='add'>+   termcap = t + (len + 1);</div><div class='add'>+</div><div class='add'>+   /* Process strings first. */</div><div class='add'>+   ti-&gt;string_table = (char *) b;</div><div class='add'>+   t = termcap;</div><div class='add'>+   while (-1 != (len = tcap_extract_field (t)))</div><div class='add'>+     {</div><div class='add'>+	unsigned char *b1;</div><div class='add'>+	unsigned char *tmax;</div><div class='add'>+</div><div class='add'>+	/* We are looking for: XX=something */</div><div class='add'>+	if ((len &lt; 4) || (t[2] != '=') || (*t == '.'))</div><div class='add'>+	  {</div><div class='add'>+	     t += len + 1;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+	tmax = t + len;</div><div class='add'>+	b1 = b;</div><div class='add'>+</div><div class='add'>+	while (t &lt; tmax)</div><div class='add'>+	  {</div><div class='add'>+	     ch = *t++;</div><div class='add'>+	     if ((ch == '\\') &amp;&amp; (t &lt; tmax))</div><div class='add'>+	       {</div><div class='add'>+		  t = (unsigned char *) _SLexpand_escaped_char ((char *) t, (char *) &amp;ch);</div><div class='add'>+	       }</div><div class='add'>+	     else if ((ch == '^') &amp;&amp; (t &lt; tmax))</div><div class='add'>+	       {</div><div class='add'>+		  ch = *t++;</div><div class='add'>+		  if (ch == '?') ch = 127;</div><div class='add'>+		  else ch = (ch | 0x20) - ('a' - 1);</div><div class='add'>+	       }</div><div class='add'>+	     *b++ = ch;</div><div class='add'>+	  }</div><div class='add'>+	/* Null terminate it. */</div><div class='add'>+	*b++ = 0;</div><div class='add'>+	len = (int) (b - b1);</div><div class='add'>+	b1[2] = (unsigned char) len;    /* replace the = by the length */</div><div class='add'>+	/* skip colon to next field. */</div><div class='add'>+	t++;</div><div class='add'>+     }</div><div class='add'>+   ti-&gt;string_table_size = (int) (b - (unsigned char *) ti-&gt;string_table);</div><div class='add'>+</div><div class='add'>+   /* Now process the numbers. */</div><div class='add'>+</div><div class='add'>+   t = termcap;</div><div class='add'>+   ti-&gt;numbers = b;</div><div class='add'>+   while (-1 != (len = tcap_extract_field (t)))</div><div class='add'>+     {</div><div class='add'>+	unsigned char *b1;</div><div class='add'>+	unsigned char *tmax;</div><div class='add'>+</div><div class='add'>+	/* We are looking for: XX#NUMBER */</div><div class='add'>+	if ((len &lt; 4) || (t[2] != '#') || (*t == '.'))</div><div class='add'>+	  {</div><div class='add'>+	     t += len + 1;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+	tmax = t + len;</div><div class='add'>+	b1 = b;</div><div class='add'>+</div><div class='add'>+	while (t &lt; tmax)</div><div class='add'>+	  {</div><div class='add'>+	     *b++ = *t++;</div><div class='add'>+	  }</div><div class='add'>+	/* Null terminate it. */</div><div class='add'>+	*b++ = 0;</div><div class='add'>+	len = (int) (b - b1);</div><div class='add'>+	b1[2] = (unsigned char) len;    /* replace the # by the length */</div><div class='add'>+	t++;</div><div class='add'>+     }</div><div class='add'>+   ti-&gt;num_numbers = (int) (b - ti-&gt;numbers);</div><div class='add'>+</div><div class='add'>+   /* Now process the flags. */</div><div class='add'>+   t = termcap;</div><div class='add'>+   ti-&gt;boolean_flags = b;</div><div class='add'>+   while (-1 != (len = tcap_extract_field (t)))</div><div class='add'>+     {</div><div class='add'>+	/* We are looking for: XX#NUMBER */</div><div class='add'>+	if ((len != 2) || (*t == '.') || (*t &lt;= ' '))</div><div class='add'>+	  {</div><div class='add'>+	     t += len + 1;</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+	b[0] = t[0];</div><div class='add'>+	b[1] = t[1];</div><div class='add'>+	t += 3;</div><div class='add'>+	b += 2;</div><div class='add'>+     }</div><div class='add'>+   ti-&gt;boolean_section_size = (int) (b - ti-&gt;boolean_flags);</div><div class='add'>+   ti-&gt;flags = SLTERMCAP;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* These routines are provided only for backward binary compatability.</div><div class='add'>+ * They will vanish in V2.x</div><div class='add'>+ */</div><div class='add'>+char *SLtt_tigetent (char *s)</div><div class='add'>+{</div><div class='add'>+   return (char *) _SLtt_tigetent (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+extern char *SLtt_tigetstr (char *s, char **p)</div><div class='add'>+{</div><div class='add'>+   if (p == NULL)</div><div class='add'>+     return NULL;</div><div class='add'>+   return _SLtt_tigetstr ((SLterminfo_Type *) *p, s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+extern int SLtt_tigetnum (char *s, char **p)</div><div class='add'>+{</div><div class='add'>+   if (p == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+   return _SLtt_tigetnum ((SLterminfo_Type *) *p, s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/sltime.c b/mdk-stage1/slang/sltime.c<br/>new file mode 100644<br/>index 000000000..14fc6ec16<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sltime.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltime.c</a></div><div class='hunk'>@@ -0,0 +1,310 @@</div><div class='add'>+/* time related system calls */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+#include &lt;time.h&gt;</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include &lt;dos.h&gt;</div><div class='add'>+#endif</div><div class='add'>+#if defined(__GO32__) || defined(__WATCOMC__)</div><div class='add'>+# include &lt;dos.h&gt;</div><div class='add'>+# include &lt;bios.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#ifdef __WIN32__</div><div class='add'>+#include &lt;windows.h&gt;</div><div class='add'>+/* Sleep is defined badly in MSVC... */</div><div class='add'>+# ifdef _MSC_VER</div><div class='add'>+#  define sleep(n) _sleep((n)*1000)</div><div class='add'>+# else</div><div class='add'>+#  ifdef sleep</div><div class='add'>+#   undef sleep</div><div class='add'>+#  endif</div><div class='add'>+#  define sleep(x) if(x)Sleep((x)*1000)</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+#if defined(IBMPC_SYSTEM)</div><div class='add'>+/* For other system (Unix and VMS), _SLusleep is in sldisply.c */</div><div class='add'>+int _SLusleep (unsigned long s)</div><div class='add'>+{</div><div class='add'>+   sleep (s/1000000L);</div><div class='add'>+   s = s % 1000000L;</div><div class='add'>+</div><div class='add'>+# if defined(__WIN32__)</div><div class='add'>+   Sleep (s/1000);</div><div class='add'>+#else</div><div class='add'>+# if defined(__IBMC__)</div><div class='add'>+   DosSleep(s/1000);</div><div class='add'>+# else</div><div class='add'>+#  if defined(_MSC_VER)</div><div class='add'>+   _sleep (s/1000);</div><div class='add'>+#  endif</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__IBMC__) &amp;&amp; !defined(_AIX)</div><div class='add'>+/* sleep is not a standard function in VA3. */</div><div class='add'>+unsigned int sleep (unsigned int seconds)</div><div class='add'>+{</div><div class='add'>+   DosSleep(1000L * ((long)seconds));</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static char *ctime_cmd (unsigned long *tt)</div><div class='add'>+{</div><div class='add'>+   char *t;</div><div class='add'>+</div><div class='add'>+   t = ctime ((time_t *) tt);</div><div class='add'>+   t[24] = 0;  /* knock off \n */</div><div class='add'>+   return (t);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void sleep_cmd (void)</div><div class='add'>+{</div><div class='add'>+   unsigned int secs;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   unsigned long usecs;</div><div class='add'>+   double x;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_double (&amp;x, NULL, NULL))</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   if (x &lt; 0.0) </div><div class='add'>+     x = 0.0;</div><div class='add'>+   secs = (unsigned int) x;</div><div class='add'>+   sleep (secs);</div><div class='add'>+   x -= (double) secs;</div><div class='add'>+   usecs = (unsigned long) (1e6 * x);</div><div class='add'>+   if (usecs &gt; 0) _SLusleep (usecs);</div><div class='add'>+#else</div><div class='add'>+   if (-1 == SLang_pop_uinteger (&amp;secs))</div><div class='add'>+     return;</div><div class='add'>+   if (secs != 0) sleep (secs);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned long _time_cmd (void)</div><div class='add'>+{</div><div class='add'>+   return (unsigned long) time (NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#if defined(__GO32__)</div><div class='add'>+static char *djgpp_current_time (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   union REGS rg;</div><div class='add'>+   unsigned int year;</div><div class='add'>+   unsigned char month, day, weekday, hour, minute, sec;</div><div class='add'>+   char days[] = "SunMonTueWedThuFriSat";</div><div class='add'>+   char months[] = "JanFebMarAprMayJunJulAugSepOctNovDec";</div><div class='add'>+   static char the_date[26];</div><div class='add'>+</div><div class='add'>+   rg.h.ah = 0x2A;</div><div class='add'>+#ifndef __WATCOMC__</div><div class='add'>+   int86(0x21, &amp;rg, &amp;rg);</div><div class='add'>+   year = rg.x.cx &amp; 0xFFFF;</div><div class='add'>+#else</div><div class='add'>+   int386(0x21, &amp;rg, &amp;rg);</div><div class='add'>+   year = rg.x.ecx &amp; 0xFFFF;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   month = 3 * (rg.h.dh - 1);</div><div class='add'>+   day = rg.h.dl;</div><div class='add'>+   weekday = 3 * rg.h.al;</div><div class='add'>+</div><div class='add'>+   rg.h.ah = 0x2C;</div><div class='add'>+</div><div class='add'>+#ifndef __WATCOMC__</div><div class='add'>+   int86(0x21, &amp;rg, &amp;rg);</div><div class='add'>+#else</div><div class='add'>+   int386(0x21, &amp;rg, &amp;rg);</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   hour = rg.h.ch;</div><div class='add'>+   minute = rg.h.cl;</div><div class='add'>+   sec = rg.h.dh;</div><div class='add'>+</div><div class='add'>+   /* we want this form: Thu Apr 14 15:43:39 1994\n  */</div><div class='add'>+   sprintf(the_date, "%.3s %.3s%3d %02d:%02d:%02d %d\n",</div><div class='add'>+	   days + weekday, months + month,</div><div class='add'>+	   day, hour, minute, sec, year);</div><div class='add'>+   return the_date;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+char *SLcurrent_time_string (void) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char *the_time;</div><div class='add'>+#ifndef __GO32__</div><div class='add'>+   time_t myclock;</div><div class='add'>+</div><div class='add'>+   myclock = time((time_t *) 0);</div><div class='add'>+   the_time = (char *) ctime(&amp;myclock);</div><div class='add'>+#else</div><div class='add'>+   the_time = djgpp_current_time ();</div><div class='add'>+#endif</div><div class='add'>+   /* returns the form Sun Sep 16 01:03:52 1985\n\0 */</div><div class='add'>+   the_time[24] = '\0';</div><div class='add'>+   return(the_time);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+static int push_tm_struct (struct tm *tms)</div><div class='add'>+{</div><div class='add'>+   char *field_names [9];</div><div class='add'>+   unsigned char field_types[9];</div><div class='add'>+   VOID_STAR field_values [9];</div><div class='add'>+   int int_values [9];</div><div class='add'>+   unsigned int i;</div><div class='add'>+</div><div class='add'>+   if (tms == NULL)</div><div class='add'>+     return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+   field_names [0] = "tm_sec"; int_values [0] = tms-&gt;tm_sec;</div><div class='add'>+   field_names [1] = "tm_min"; int_values [1] = tms-&gt;tm_min;</div><div class='add'>+   field_names [2] = "tm_hour"; int_values [2] = tms-&gt;tm_hour;</div><div class='add'>+   field_names [3] = "tm_mday"; int_values [3] = tms-&gt;tm_mday;</div><div class='add'>+   field_names [4] = "tm_mon"; int_values [4] = tms-&gt;tm_mon;</div><div class='add'>+   field_names [5] = "tm_year"; int_values [5] = tms-&gt;tm_year;</div><div class='add'>+   field_names [6] = "tm_wday"; int_values [6] = tms-&gt;tm_wday;</div><div class='add'>+   field_names [7] = "tm_yday"; int_values [7] = tms-&gt;tm_yday;</div><div class='add'>+   field_names [8] = "tm_isdst"; int_values [8] = tms-&gt;tm_isdst;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; 9; i++)</div><div class='add'>+     {</div><div class='add'>+	field_types [i] = SLANG_INT_TYPE;</div><div class='add'>+	field_values [i] = (VOID_STAR) (int_values + i);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return SLstruct_create_struct (9, field_names, field_types, field_values);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static void localtime_cmd (long *t)</div><div class='add'>+{</div><div class='add'>+   time_t tt = (time_t) *t;</div><div class='add'>+   (void) push_tm_struct (localtime (&amp;tt));</div><div class='add'>+}</div><div class='add'>+   </div><div class='add'>+static void gmtime_cmd (long *t)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_GMTIME</div><div class='add'>+   time_t tt = (time_t) *t;</div><div class='add'>+   (void) push_tm_struct (gmtime (&amp;tt));</div><div class='add'>+#else</div><div class='add'>+   localtime_cmd (t);</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TIMES</div><div class='add'>+</div><div class='add'>+# ifdef HAVE_SYS_TIMES_H</div><div class='add'>+#  include &lt;sys/times.h&gt;</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+#include &lt;limits.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef CLK_TCK</div><div class='add'>+# define SECS_PER_TICK (1.0/(double)CLK_TCK)</div><div class='add'>+#else </div><div class='add'>+# ifdef CLOCKS_PER_SEC</div><div class='add'>+#  define SECS_PER_TICK (1.0/(double)CLOCKS_PER_SEC)</div><div class='add'>+# else</div><div class='add'>+#  define SECS_PER_TICK (1.0/60.0)</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static void times_cmd (void)</div><div class='add'>+{</div><div class='add'>+   double dvals[4];</div><div class='add'>+   struct tms t;</div><div class='add'>+   VOID_STAR field_values[4];</div><div class='add'>+   char *field_names[4];</div><div class='add'>+   unsigned int i;</div><div class='add'>+   unsigned char field_types[4];</div><div class='add'>+   </div><div class='add'>+   (void) times (&amp;t);</div><div class='add'>+</div><div class='add'>+   field_names[0] = "tms_utime";   dvals[0] = (double)t.tms_utime; </div><div class='add'>+   field_names[1] = "tms_stime";   dvals[1] = (double)t.tms_stime; </div><div class='add'>+   field_names[2] = "tms_cutime";  dvals[2] = (double)t.tms_cutime;</div><div class='add'>+   field_names[3] = "tms_cstime";  dvals[3] = (double)t.tms_cstime;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; 4; i++)</div><div class='add'>+     {</div><div class='add'>+	dvals[i] *= SECS_PER_TICK;</div><div class='add'>+	field_values[i] = (VOID_STAR) &amp;dvals[i];</div><div class='add'>+	field_types[i] = SLANG_DOUBLE_TYPE;</div><div class='add'>+     }</div><div class='add'>+   (void) SLstruct_create_struct (4, field_names, field_types, field_values);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static struct tms Tic_TMS;</div><div class='add'>+</div><div class='add'>+static void tic_cmd (void)</div><div class='add'>+{</div><div class='add'>+   (void) times (&amp;Tic_TMS);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static double toc_cmd (void)</div><div class='add'>+{</div><div class='add'>+   struct tms t;</div><div class='add'>+   double d;</div><div class='add'>+</div><div class='add'>+   (void) times (&amp;t);</div><div class='add'>+   d = ((t.tms_utime - Tic_TMS.tms_utime)</div><div class='add'>+	+ (t.tms_stime - Tic_TMS.tms_stime)) * SECS_PER_TICK;</div><div class='add'>+   Tic_TMS = t;</div><div class='add'>+   return d;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif				       /* HAVE_TIMES */</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+static SLang_Intrin_Fun_Type Time_Funs_Table [] =</div><div class='add'>+{</div><div class='add'>+   MAKE_INTRINSIC_1("ctime", ctime_cmd, SLANG_STRING_TYPE, SLANG_ULONG_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("sleep", sleep_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("_time", _time_cmd, SLANG_ULONG_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("time", SLcurrent_time_string, SLANG_STRING_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_1("localtime", localtime_cmd, SLANG_VOID_TYPE, SLANG_LONG_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_1("gmtime", gmtime_cmd, SLANG_VOID_TYPE, SLANG_LONG_TYPE),</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TIMES</div><div class='add'>+   MAKE_INTRINSIC_0("times", times_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("tic", tic_cmd, SLANG_VOID_TYPE),</div><div class='add'>+   MAKE_INTRINSIC_0("toc", toc_cmd, SLANG_DOUBLE_TYPE),</div><div class='add'>+#endif</div><div class='add'>+   SLANG_END_INTRIN_FUN_TABLE</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLang_init_sltime (void)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_TIMES</div><div class='add'>+   (void) tic_cmd ();</div><div class='add'>+#endif</div><div class='add'>+   return SLadd_intrin_fun_table (Time_Funs_Table, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/sltoken.c b/mdk-stage1/slang/sltoken.c<br/>new file mode 100644<br/>index 000000000..d08967a24<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sltoken.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltoken.c</a></div><div class='hunk'>@@ -0,0 +1,1702 @@</div><div class='add'>+/* Copyright (c) 1998, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+#define MAX_TOKEN_LEN 254</div><div class='add'>+#define MAX_FILE_LINE_LEN 256</div><div class='add'>+</div><div class='add'>+static char Empty_Line[1] = {0};</div><div class='add'>+</div><div class='add'>+static int Default_Compile_Line_Num_Info;</div><div class='add'>+static char *Input_Line = Empty_Line;</div><div class='add'>+static char *Input_Line_Pointer;</div><div class='add'>+</div><div class='add'>+static SLPreprocess_Type *This_SLpp;</div><div class='add'>+</div><div class='add'>+static SLang_Load_Type *LLT;</div><div class='add'>+</div><div class='add'>+static char *map_token_to_string (_SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+   static char numbuf [32];</div><div class='add'>+   unsigned char type;</div><div class='add'>+   s = NULL;</div><div class='add'>+</div><div class='add'>+   if (tok != NULL) type = tok-&gt;type;</div><div class='add'>+   else type = 0;</div><div class='add'>+</div><div class='add'>+   switch (type)</div><div class='add'>+     {</div><div class='add'>+      case 0:</div><div class='add'>+	s = "??";</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case CHAR_TOKEN:</div><div class='add'>+      case SHORT_TOKEN:</div><div class='add'>+      case INT_TOKEN:</div><div class='add'>+      case LONG_TOKEN:</div><div class='add'>+	s = numbuf;</div><div class='add'>+	sprintf (s, "%ld", tok-&gt;v.long_val);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case UCHAR_TOKEN:</div><div class='add'>+      case USHORT_TOKEN:</div><div class='add'>+      case UINT_TOKEN:</div><div class='add'>+      case ULONG_TOKEN:</div><div class='add'>+	s = numbuf;</div><div class='add'>+	sprintf (s, "%lu", (unsigned long)tok-&gt;v.long_val);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case OBRACKET_TOKEN: s = "["; break;</div><div class='add'>+      case CBRACKET_TOKEN: s = "]"; break;</div><div class='add'>+      case OPAREN_TOKEN: s = "("; break;</div><div class='add'>+      case CPAREN_TOKEN: s = ")"; break;</div><div class='add'>+      case OBRACE_TOKEN: s = "{"; break;</div><div class='add'>+      case CBRACE_TOKEN: s = "}"; break;</div><div class='add'>+      case DEREF_TOKEN: s = "@"; break;</div><div class='add'>+      case POUND_TOKEN: s = "#"; break;</div><div class='add'>+      case COMMA_TOKEN: s = ","; break;</div><div class='add'>+      case SEMICOLON_TOKEN: s = ";"; break;</div><div class='add'>+      case COLON_TOKEN: s = ":"; break;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+      case FLOAT_TOKEN:</div><div class='add'>+      case DOUBLE_TOKEN:</div><div class='add'>+      case COMPLEX_TOKEN:</div><div class='add'>+#endif</div><div class='add'>+      case IDENT_TOKEN:</div><div class='add'>+	if ((tok-&gt;free_sval_flag == 0) || (tok-&gt;num_refs == 0))</div><div class='add'>+	  break;</div><div class='add'>+	/* drop */</div><div class='add'>+      default:</div><div class='add'>+	s = tok-&gt;v.s_val;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (s == NULL)</div><div class='add'>+     {</div><div class='add'>+	s = numbuf;</div><div class='add'>+	sprintf (s, "(0x%02X)", type);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return s;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *make_line_file_error (char *buf, unsigned int buflen,</div><div class='add'>+				   _SLang_Token_Type *tok, char *dsc, int line, char *file)</div><div class='add'>+{</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   if (tok != NULL) line = tok-&gt;line_number;</div><div class='add'>+#endif</div><div class='add'>+   if (file == NULL) file = "??";</div><div class='add'>+</div><div class='add'>+   (void) _SLsnprintf (buf, buflen, "%s: found '%s', line %d, file: %s",</div><div class='add'>+		       dsc, map_token_to_string (tok), line, file);</div><div class='add'>+</div><div class='add'>+   return buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLparse_error(char *str, _SLang_Token_Type *tok, int flag)</div><div class='add'>+{</div><div class='add'>+   char buf [1024];</div><div class='add'>+</div><div class='add'>+   if (str == NULL)</div><div class='add'>+     str = "Parse Error";</div><div class='add'>+</div><div class='add'>+   make_line_file_error (buf, sizeof (buf), tok, str, LLT-&gt;line_num, (char *) LLT-&gt;name);</div><div class='add'>+</div><div class='add'>+   if ((flag == 0) &amp;&amp; SLang_Error)</div><div class='add'>+     return;</div><div class='add'>+</div><div class='add'>+   SLang_verror (SL_SYNTAX_ERROR, "%s", buf);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void do_line_file_error (int line, char *file)</div><div class='add'>+{</div><div class='add'>+   SLang_verror (SL_SYNTAX_ERROR,</div><div class='add'>+		 "called from line %d, file: %s", line, file);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#define ALPHA_CHAR 	1</div><div class='add'>+#define DIGIT_CHAR	2</div><div class='add'>+#define EXCL_CHAR 	3</div><div class='add'>+#define SEP_CHAR	4</div><div class='add'>+#define OP_CHAR		5</div><div class='add'>+#define DOT_CHAR	6</div><div class='add'>+#define BOLDOT_CHAR	7</div><div class='add'>+#define DQUOTE_CHAR	8</div><div class='add'>+#define QUOTE_CHAR	9</div><div class='add'>+#define COMMENT_CHAR	10</div><div class='add'>+#define NL_CHAR		11</div><div class='add'>+#define BAD_CHAR	12</div><div class='add'>+#define WHITE_CHAR	13</div><div class='add'>+</div><div class='add'>+#define CHAR_EOF	255</div><div class='add'>+</div><div class='add'>+#define CHAR_CLASS(c)	(Char_Type_Table[(c)][0])</div><div class='add'>+#define CHAR_DATA(c)	(Char_Type_Table[(c)][1])</div><div class='add'>+</div><div class='add'>+/* In this table, if a single character can represent an operator, e.g.,</div><div class='add'>+ * '&amp;' (BAND_TOKEN), then it must be placed before multiple-character</div><div class='add'>+ * operators that begin with the same character, e.g., "&amp;=".  See</div><div class='add'>+ * get_op_token to see how this is exploited.</div><div class='add'>+ *</div><div class='add'>+ * The third character null terminates the operator string.  This is for</div><div class='add'>+ * the token structure.</div><div class='add'>+ */</div><div class='add'>+static char Operators [29][4] =</div><div class='add'>+{</div><div class='add'>+#define OFS_EXCL	0</div><div class='add'>+     {'!',	'=',	0, NE_TOKEN},</div><div class='add'>+#define OFS_POUND	1</div><div class='add'>+     {'#',	0,	0, POUND_TOKEN},</div><div class='add'>+#define OFS_BAND	2</div><div class='add'>+     {'&amp;',	0,	0, BAND_TOKEN},</div><div class='add'>+     {'&amp;',	'&amp;',	0, EOF_TOKEN},</div><div class='add'>+     {'&amp;',	'=',	0, BANDEQS_TOKEN},</div><div class='add'>+#define OFS_STAR	5</div><div class='add'>+     {'*',	0,	0, TIMES_TOKEN},</div><div class='add'>+     {'*',	'=',	0, TIMESEQS_TOKEN},</div><div class='add'>+#define OFS_PLUS	7</div><div class='add'>+     {'+',	0,	0, ADD_TOKEN},</div><div class='add'>+     {'+',	'+',	0, PLUSPLUS_TOKEN},</div><div class='add'>+     {'+',	'=',	0, PLUSEQS_TOKEN},</div><div class='add'>+#define OFS_MINUS	10</div><div class='add'>+     {'-',	0,	0, SUB_TOKEN},</div><div class='add'>+     {'-',	'-',	0, MINUSMINUS_TOKEN},</div><div class='add'>+     {'-',	'=',	0, MINUSEQS_TOKEN},</div><div class='add'>+     {'-',	'&gt;',	0, NAMESPACE_TOKEN},</div><div class='add'>+#define OFS_DIV		14</div><div class='add'>+     {'/',	0,	0, DIV_TOKEN},</div><div class='add'>+     {'/',	'=',	0, DIVEQS_TOKEN},</div><div class='add'>+#define OFS_LT		16</div><div class='add'>+     {'&lt;',	0,	0, LT_TOKEN},</div><div class='add'>+     {'&lt;',	'=',	0, LE_TOKEN},</div><div class='add'>+#define OFS_EQS		18</div><div class='add'>+     {'=',	0,	0, ASSIGN_TOKEN},</div><div class='add'>+     {'=',	'=',	0, EQ_TOKEN},</div><div class='add'>+#define OFS_GT		20</div><div class='add'>+     {'&gt;',	0,	0, GT_TOKEN},</div><div class='add'>+     {'&gt;',	'=',	0, GE_TOKEN},</div><div class='add'>+#define OFS_AT		22</div><div class='add'>+     {'@',	0,	0, DEREF_TOKEN},</div><div class='add'>+#define OFS_POW		23</div><div class='add'>+     {'^',	0,	0, POW_TOKEN},</div><div class='add'>+#define OFS_BOR		24</div><div class='add'>+     {'|',	0,	0, BOR_TOKEN},</div><div class='add'>+     {'|',	'|',	0, EOF_TOKEN},</div><div class='add'>+     {'|',	'=',	0, BOREQS_TOKEN},</div><div class='add'>+#define OFS_BNOT	27</div><div class='add'>+     {'~',	0,	0, BNOT_TOKEN},</div><div class='add'>+     {	0,	0,	0, EOF_TOKEN}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static unsigned char Char_Type_Table[256][2] =</div><div class='add'>+{</div><div class='add'>+ { NL_CHAR, 0 },	/* 0x0 */   { BAD_CHAR, 0 },	/* 0x1 */</div><div class='add'>+ { BAD_CHAR, 0 },	/* 0x2 */   { BAD_CHAR, 0 },	/* 0x3 */</div><div class='add'>+ { BAD_CHAR, 0 },	/* 0x4 */   { BAD_CHAR, 0 },	/* 0x5 */</div><div class='add'>+ { BAD_CHAR, 0 },	/* 0x6 */   { BAD_CHAR, 0 },	/* 0x7 */</div><div class='add'>+ { WHITE_CHAR, 0 },	/* 0x8 */   { WHITE_CHAR, 0 },	/* 0x9 */</div><div class='add'>+ { NL_CHAR, 0 },	/* \n */   { WHITE_CHAR, 0 },	/* 0xb */</div><div class='add'>+ { WHITE_CHAR, 0 },	/* 0xc */   { WHITE_CHAR, 0 },	/* \r */</div><div class='add'>+ { BAD_CHAR, 0 },	/* 0xe */   { BAD_CHAR, 0 },	/* 0xf */</div><div class='add'>+ { BAD_CHAR, 0 },	/* 0x10 */  { BAD_CHAR, 0 },	/* 0x11 */</div><div class='add'>+ { BAD_CHAR, 0 },	/* 0x12 */  { BAD_CHAR, 0 },	/* 0x13 */</div><div class='add'>+ { BAD_CHAR, 0 },	/* 0x14 */  { BAD_CHAR, 0 },	/* 0x15 */</div><div class='add'>+ { BAD_CHAR, 0 },	/* 0x16 */  { BAD_CHAR, 0 },	/* 0x17 */</div><div class='add'>+ { BAD_CHAR, 0 },	/* 0x18 */  { BAD_CHAR, 0 },	/* 0x19 */</div><div class='add'>+ { BAD_CHAR, 0 },	/* 0x1a */  { BAD_CHAR, 0 },	/* 0x1b */</div><div class='add'>+ { BAD_CHAR, 0 },	/* 0x1c */  { BAD_CHAR, 0 },	/* 0x1d */</div><div class='add'>+ { BAD_CHAR, 0 },	/* 0x1e */  { BAD_CHAR, 0 },	/* 0x1f */</div><div class='add'>+ { WHITE_CHAR, 0 },	/* 0x20 */  { EXCL_CHAR, OFS_EXCL },	/* ! */</div><div class='add'>+ { DQUOTE_CHAR, 0 },	/* " */	    { OP_CHAR, OFS_POUND },	/* # */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* $ */	    { NL_CHAR, 0 },/* % */</div><div class='add'>+ { OP_CHAR, OFS_BAND },	/* &amp; */	    { QUOTE_CHAR, 0 },	/* ' */</div><div class='add'>+ { SEP_CHAR, OPAREN_TOKEN },	/* ( */	    { SEP_CHAR, CPAREN_TOKEN },	/* ) */</div><div class='add'>+ { OP_CHAR, OFS_STAR },	/* * */	    { OP_CHAR, OFS_PLUS},	/* + */</div><div class='add'>+ { SEP_CHAR, COMMA_TOKEN },	/* , */	    { OP_CHAR, OFS_MINUS },	/* - */</div><div class='add'>+ { DOT_CHAR, 0 },	/* . */	    { OP_CHAR, OFS_DIV },	/* / */</div><div class='add'>+ { DIGIT_CHAR, 0 },	/* 0 */	    { DIGIT_CHAR, 0 },	/* 1 */</div><div class='add'>+ { DIGIT_CHAR, 0 },	/* 2 */	    { DIGIT_CHAR, 0 },	/* 3 */</div><div class='add'>+ { DIGIT_CHAR, 0 },	/* 4 */	    { DIGIT_CHAR, 0 },	/* 5 */</div><div class='add'>+ { DIGIT_CHAR, 0 },	/* 6 */	    { DIGIT_CHAR, 0 },	/* 7 */</div><div class='add'>+ { DIGIT_CHAR, 0 },	/* 8 */	    { DIGIT_CHAR, 0 },	/* 9 */</div><div class='add'>+ { SEP_CHAR, COLON_TOKEN },	/* : */	    { SEP_CHAR, SEMICOLON_TOKEN },	/* ; */</div><div class='add'>+ { OP_CHAR, OFS_LT },	/* &lt; */	    { OP_CHAR, OFS_EQS },	/* = */</div><div class='add'>+ { OP_CHAR, OFS_GT },	/* &gt; */	    { BAD_CHAR, 0 },	/* ? */</div><div class='add'>+ { OP_CHAR, OFS_AT},	/* @ */	    { ALPHA_CHAR, 0 },	/* A */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* B */	    { ALPHA_CHAR, 0 },	/* C */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* D */	    { ALPHA_CHAR, 0 },	/* E */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* F */	    { ALPHA_CHAR, 0 },	/* G */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* H */	    { ALPHA_CHAR, 0 },	/* I */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* J */	    { ALPHA_CHAR, 0 },	/* K */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* L */	    { ALPHA_CHAR, 0 },	/* M */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* N */	    { ALPHA_CHAR, 0 },	/* O */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* P */	    { ALPHA_CHAR, 0 },	/* Q */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* R */	    { ALPHA_CHAR, 0 },	/* S */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* T */	    { ALPHA_CHAR, 0 },	/* U */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* V */	    { ALPHA_CHAR, 0 },	/* W */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* X */	    { ALPHA_CHAR, 0 },	/* Y */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* Z */	    { SEP_CHAR, OBRACKET_TOKEN },	/* [ */</div><div class='add'>+ { BAD_CHAR, 0 },	/* \ */	    { SEP_CHAR, CBRACKET_TOKEN },	/* ] */</div><div class='add'>+ { OP_CHAR, OFS_POW },	/* ^ */	    { ALPHA_CHAR, 0 },	/* _ */</div><div class='add'>+ { BAD_CHAR, 0 },	/* ` */	    { ALPHA_CHAR, 0 },	/* a */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* b */	    { ALPHA_CHAR, 0 },	/* c */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* d */	    { ALPHA_CHAR, 0 },	/* e */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* f */	    { ALPHA_CHAR, 0 },	/* g */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* h */	    { ALPHA_CHAR, 0 },	/* i */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* j */	    { ALPHA_CHAR, 0 },	/* k */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* l */	    { ALPHA_CHAR, 0 },	/* m */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* n */	    { ALPHA_CHAR, 0 },	/* o */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* p */	    { ALPHA_CHAR, 0 },	/* q */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* r */	    { ALPHA_CHAR, 0 },	/* s */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* t */	    { ALPHA_CHAR, 0 },	/* u */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* v */	    { ALPHA_CHAR, 0 },	/* w */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* x */	    { ALPHA_CHAR, 0 },	/* y */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* z */	    { SEP_CHAR, OBRACE_TOKEN },	/* { */</div><div class='add'>+ { OP_CHAR, OFS_BOR },	/* | */	    { SEP_CHAR, CBRACE_TOKEN },	/* } */</div><div class='add'>+ { OP_CHAR, OFS_BNOT },	/* ~ */	    { BAD_CHAR, 0 },	/* 0x7f */</div><div class='add'>+   </div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+ { ALPHA_CHAR, 0 },	/* � */	    { ALPHA_CHAR, 0 },	/* � */</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+int _SLcheck_identifier_syntax (char *name)</div><div class='add'>+{</div><div class='add'>+   unsigned char *p;</div><div class='add'>+   </div><div class='add'>+   p = (unsigned char *) name;</div><div class='add'>+   if (ALPHA_CHAR == Char_Type_Table[*p][0]) while (1)</div><div class='add'>+     {</div><div class='add'>+	unsigned ch;</div><div class='add'>+	unsigned char type;</div><div class='add'>+</div><div class='add'>+	ch = *++p;</div><div class='add'>+</div><div class='add'>+	type = Char_Type_Table [ch][0];</div><div class='add'>+	if ((type != ALPHA_CHAR) &amp;&amp; (type != DIGIT_CHAR))</div><div class='add'>+	  {</div><div class='add'>+	     if (ch == 0)</div><div class='add'>+	       return 0;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   SLang_verror (SL_SYNTAX_ERROR, </div><div class='add'>+		 "Name %s contains an illegal character", name);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static unsigned char prep_get_char (void)</div><div class='add'>+{</div><div class='add'>+   register unsigned char ch;</div><div class='add'>+</div><div class='add'>+   if (0 != (ch = *Input_Line_Pointer++))</div><div class='add'>+     return ch;</div><div class='add'>+</div><div class='add'>+   Input_Line_Pointer--;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void unget_prep_char (unsigned char ch)</div><div class='add'>+{</div><div class='add'>+   if ((Input_Line_Pointer != Input_Line)</div><div class='add'>+       &amp;&amp; (ch != 0))</div><div class='add'>+     Input_Line_Pointer--;</div><div class='add'>+   /* *Input_Line_Pointer = ch; -- Do not modify the Input_Line */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#include "keywhash.c"</div><div class='add'>+</div><div class='add'>+static int get_ident_token (_SLang_Token_Type *tok, unsigned char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   unsigned char ch;</div><div class='add'>+   unsigned char type;</div><div class='add'>+   Keyword_Table_Type *table;</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	ch = prep_get_char ();</div><div class='add'>+	type = CHAR_CLASS (ch);</div><div class='add'>+	if ((type != ALPHA_CHAR) &amp;&amp; (type != DIGIT_CHAR))</div><div class='add'>+	  {</div><div class='add'>+	     unget_prep_char (ch);</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	s [len++] = ch;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   s[len] = 0;</div><div class='add'>+</div><div class='add'>+   /* check if keyword */</div><div class='add'>+   table = is_keyword ((char *) s, len);</div><div class='add'>+   if (table != NULL)</div><div class='add'>+     {</div><div class='add'>+	tok-&gt;v.s_val = table-&gt;name;</div><div class='add'>+	return (tok-&gt;type = table-&gt;type);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   tok-&gt;v.s_val = _SLstring_make_hashed_string ((char *)s, len, &amp;tok-&gt;hash);</div><div class='add'>+   tok-&gt;free_sval_flag = 1;</div><div class='add'>+   return (tok-&gt;type = IDENT_TOKEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_number_token (_SLang_Token_Type *tok, unsigned char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   unsigned char ch;</div><div class='add'>+   unsigned char type;</div><div class='add'>+</div><div class='add'>+   /* Look for pattern  [0-9.xX]*([eE][-+]?[digits])?[ijfhul]? */</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	ch = prep_get_char ();</div><div class='add'>+</div><div class='add'>+	type = CHAR_CLASS (ch);</div><div class='add'>+	if ((type != DIGIT_CHAR) &amp;&amp; (type != DOT_CHAR))</div><div class='add'>+	  {</div><div class='add'>+	     if ((ch != 'x') &amp;&amp; (ch != 'X'))</div><div class='add'>+	       break;</div><div class='add'>+	     /* It must be hex */</div><div class='add'>+	     do</div><div class='add'>+	       {</div><div class='add'>+		  if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+		    goto too_long_return_error;</div><div class='add'>+</div><div class='add'>+		  s[len++] = ch;</div><div class='add'>+		  ch = prep_get_char ();</div><div class='add'>+		  type = CHAR_CLASS (ch);</div><div class='add'>+	       }</div><div class='add'>+	     while ((type == DIGIT_CHAR) || (type == ALPHA_CHAR));</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+	  goto too_long_return_error;</div><div class='add'>+	s [len++] = ch;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* At this point, type and ch are synchronized */</div><div class='add'>+</div><div class='add'>+   if ((ch == 'e') || (ch == 'E'))</div><div class='add'>+     {</div><div class='add'>+	if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+	  goto too_long_return_error;</div><div class='add'>+	s[len++] = ch;</div><div class='add'>+	ch = prep_get_char ();</div><div class='add'>+	if ((ch == '+') || (ch == '-'))</div><div class='add'>+	  {</div><div class='add'>+	     if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+	       goto too_long_return_error;</div><div class='add'>+	     s[len++] = ch;</div><div class='add'>+	     ch = prep_get_char ();</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	while (DIGIT_CHAR == (type = CHAR_CLASS(ch)))</div><div class='add'>+	  {</div><div class='add'>+	     if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+	       goto too_long_return_error;</div><div class='add'>+	     s[len++] = ch;</div><div class='add'>+	     ch = prep_get_char ();</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (ALPHA_CHAR == type)</div><div class='add'>+     {</div><div class='add'>+	if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+	  goto too_long_return_error;</div><div class='add'>+	s[len++] = ch;</div><div class='add'>+	ch = prep_get_char ();</div><div class='add'>+	type = CHAR_CLASS(ch);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   unget_prep_char (ch);</div><div class='add'>+   s[len] = 0;</div><div class='add'>+</div><div class='add'>+   switch (SLang_guess_type ((char *) s))</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	tok-&gt;v.s_val = (char *) s;</div><div class='add'>+	_SLparse_error ("Not a number", tok, 0);</div><div class='add'>+	return (tok-&gt;type = EOF_TOKEN);</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+      case SLANG_FLOAT_TYPE:</div><div class='add'>+	tok-&gt;v.s_val = _SLstring_make_hashed_string ((char *)s, len, &amp;tok-&gt;hash);</div><div class='add'>+	tok-&gt;free_sval_flag = 1;</div><div class='add'>+	return (tok-&gt;type = FLOAT_TOKEN);</div><div class='add'>+</div><div class='add'>+      case SLANG_DOUBLE_TYPE:</div><div class='add'>+	tok-&gt;v.s_val = _SLstring_make_hashed_string ((char *)s, len, &amp;tok-&gt;hash);</div><div class='add'>+	tok-&gt;free_sval_flag = 1;</div><div class='add'>+	return (tok-&gt;type = DOUBLE_TOKEN);</div><div class='add'>+#endif</div><div class='add'>+#if SLANG_HAS_COMPLEX</div><div class='add'>+      case SLANG_COMPLEX_TYPE:</div><div class='add'>+	tok-&gt;v.s_val = _SLstring_make_hashed_string ((char *)s, len, &amp;tok-&gt;hash);</div><div class='add'>+	tok-&gt;free_sval_flag = 1;</div><div class='add'>+	return (tok-&gt;type = COMPLEX_TOKEN);</div><div class='add'>+#endif</div><div class='add'>+      case SLANG_CHAR_TYPE:</div><div class='add'>+	tok-&gt;v.long_val = (char)SLatol (s);</div><div class='add'>+	return tok-&gt;type = CHAR_TOKEN;</div><div class='add'>+      case SLANG_UCHAR_TYPE:</div><div class='add'>+	tok-&gt;v.long_val = (unsigned char)SLatol (s);</div><div class='add'>+	return tok-&gt;type = UCHAR_TOKEN;</div><div class='add'>+      case SLANG_SHORT_TYPE:</div><div class='add'>+	tok-&gt;v.long_val = (short)SLatol (s);</div><div class='add'>+	return tok-&gt;type = SHORT_TOKEN;</div><div class='add'>+      case SLANG_USHORT_TYPE:</div><div class='add'>+	tok-&gt;v.long_val = (unsigned short)SLatoul (s);</div><div class='add'>+	return tok-&gt;type = USHORT_TOKEN;</div><div class='add'>+      case SLANG_INT_TYPE:</div><div class='add'>+	tok-&gt;v.long_val = (int)SLatol (s);</div><div class='add'>+	return tok-&gt;type = INT_TOKEN;</div><div class='add'>+      case SLANG_UINT_TYPE:</div><div class='add'>+	tok-&gt;v.long_val = (unsigned int)SLatoul (s);</div><div class='add'>+	return tok-&gt;type = UINT_TOKEN;</div><div class='add'>+      case SLANG_LONG_TYPE:</div><div class='add'>+	tok-&gt;v.long_val = SLatol (s);</div><div class='add'>+	return tok-&gt;type = LONG_TOKEN;</div><div class='add'>+      case SLANG_ULONG_TYPE:</div><div class='add'>+	tok-&gt;v.long_val = SLatoul (s);</div><div class='add'>+	return tok-&gt;type = ULONG_TOKEN;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   too_long_return_error:</div><div class='add'>+   _SLparse_error ("Number too long for buffer", NULL, 0);</div><div class='add'>+   return (tok-&gt;type == EOF_TOKEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_op_token (_SLang_Token_Type *tok, char ch)</div><div class='add'>+{</div><div class='add'>+   unsigned int offset;</div><div class='add'>+   char second_char;</div><div class='add'>+   unsigned char type;</div><div class='add'>+   char *name;</div><div class='add'>+</div><div class='add'>+   /* operators are: + - / * ++ -- += -= = == != &gt; &lt; &gt;= &lt;= | etc..</div><div class='add'>+    * These lex to the longest valid operator token.</div><div class='add'>+    */</div><div class='add'>+</div><div class='add'>+   offset = CHAR_DATA((unsigned char) ch);</div><div class='add'>+   if (0 == Operators [offset][1])</div><div class='add'>+     {</div><div class='add'>+	name = Operators [offset];</div><div class='add'>+	type = name [3];</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	type = EOF_TOKEN;</div><div class='add'>+	name = NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   second_char = prep_get_char ();</div><div class='add'>+   do</div><div class='add'>+     {</div><div class='add'>+	if (second_char == Operators[offset][1])</div><div class='add'>+	  {</div><div class='add'>+	     name = Operators [offset];</div><div class='add'>+	     type = name [3];</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	offset++;</div><div class='add'>+     }</div><div class='add'>+   while (ch == Operators[offset][0]);</div><div class='add'>+</div><div class='add'>+   tok-&gt;type = type;</div><div class='add'>+</div><div class='add'>+   if (type == EOF_TOKEN)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error ("Operator not supported", NULL, 0);</div><div class='add'>+	return type;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   tok-&gt;v.s_val = name;</div><div class='add'>+</div><div class='add'>+   if (name[1] == 0)</div><div class='add'>+     unget_prep_char (second_char);</div><div class='add'>+</div><div class='add'>+   return type;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* If this returns non-zero, then it is a binary string */</div><div class='add'>+static int expand_escaped_string (register char *s,</div><div class='add'>+				  register char *t, register char *tmax,</div><div class='add'>+				  unsigned int *lenp)</div><div class='add'>+{</div><div class='add'>+   char *s0;</div><div class='add'>+   int is_binary = 0;</div><div class='add'>+   char ch;</div><div class='add'>+</div><div class='add'>+   s0 = s;</div><div class='add'>+   while (t &lt; tmax)</div><div class='add'>+     {</div><div class='add'>+	ch = *t++;</div><div class='add'>+	if (ch == '\\')</div><div class='add'>+	  {</div><div class='add'>+	     t = _SLexpand_escaped_char (t, &amp;ch);</div><div class='add'>+	     if (ch == 0) is_binary = 1;</div><div class='add'>+	  }</div><div class='add'>+	*s++ = ch;</div><div class='add'>+     }</div><div class='add'>+   *s = 0;</div><div class='add'>+</div><div class='add'>+   *lenp = (unsigned char) (s - s0);</div><div class='add'>+   return is_binary;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int get_string_token (_SLang_Token_Type *tok, unsigned char quote_char,</div><div class='add'>+			     unsigned char *s)</div><div class='add'>+{</div><div class='add'>+   unsigned char ch;</div><div class='add'>+   unsigned int len = 0;</div><div class='add'>+   int has_quote = 0;</div><div class='add'>+   int is_binary;</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	ch = prep_get_char ();</div><div class='add'>+	if (ch == 0)</div><div class='add'>+	  {</div><div class='add'>+	     _SLparse_error("Expecting quote-character", NULL, 0);</div><div class='add'>+	     return (tok-&gt;type = EOF_TOKEN);</div><div class='add'>+	  }</div><div class='add'>+	if (ch == quote_char) break;</div><div class='add'>+</div><div class='add'>+	s[len++] = ch;</div><div class='add'>+</div><div class='add'>+	if (len == (MAX_TOKEN_LEN - 1))</div><div class='add'>+	  {</div><div class='add'>+	     _SLparse_error ("String too long for buffer", NULL, 0);</div><div class='add'>+	     return (tok-&gt;type == EOF_TOKEN);</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (ch == '\\')</div><div class='add'>+	  {</div><div class='add'>+	     has_quote = 1;</div><div class='add'>+	     ch = prep_get_char ();</div><div class='add'>+	     s[len++] = ch;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   s[len] = 0;</div><div class='add'>+</div><div class='add'>+   if (has_quote)</div><div class='add'>+     is_binary = expand_escaped_string ((char *) s, (char *)s, (char *)s + len, &amp;len);</div><div class='add'>+   else is_binary = 0;</div><div class='add'>+</div><div class='add'>+   if ('"' == quote_char)</div><div class='add'>+     {</div><div class='add'>+	tok-&gt;free_sval_flag = 1;</div><div class='add'>+	if (is_binary)</div><div class='add'>+	  {</div><div class='add'>+	     tok-&gt;v.b_val = SLbstring_create (s, len);</div><div class='add'>+	     return tok-&gt;type = BSTRING_TOKEN;</div><div class='add'>+	  }</div><div class='add'>+	else</div><div class='add'>+	  {</div><div class='add'>+	     tok-&gt;v.s_val = _SLstring_make_hashed_string ((char *)s,</div><div class='add'>+							  len,</div><div class='add'>+							  &amp;tok-&gt;hash);</div><div class='add'>+	     tok-&gt;free_sval_flag = 1;</div><div class='add'>+	     return (tok-&gt;type = STRING_TOKEN);</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* else single character */</div><div class='add'>+   if (s[1] != 0)</div><div class='add'>+     {</div><div class='add'>+	_SLparse_error("Single char expected", NULL, 0);</div><div class='add'>+	return (tok-&gt;type = EOF_TOKEN);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   tok-&gt;v.long_val = s[0];</div><div class='add'>+   return (tok-&gt;type = UCHAR_TOKEN);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int extract_token (_SLang_Token_Type *tok, unsigned char ch, unsigned char t)</div><div class='add'>+{</div><div class='add'>+   unsigned char s [MAX_TOKEN_LEN];</div><div class='add'>+   unsigned int slen;</div><div class='add'>+</div><div class='add'>+   s[0] = (char) ch;</div><div class='add'>+   slen = 1;</div><div class='add'>+</div><div class='add'>+   switch (t)</div><div class='add'>+     {</div><div class='add'>+      case ALPHA_CHAR:</div><div class='add'>+	return get_ident_token (tok, s, slen);</div><div class='add'>+</div><div class='add'>+      case OP_CHAR:</div><div class='add'>+	return get_op_token (tok, ch);</div><div class='add'>+</div><div class='add'>+      case DIGIT_CHAR:</div><div class='add'>+	return get_number_token (tok, s, slen);</div><div class='add'>+</div><div class='add'>+      case EXCL_CHAR:</div><div class='add'>+	ch = prep_get_char ();</div><div class='add'>+	s [slen++] = ch;</div><div class='add'>+	t = CHAR_CLASS(ch);</div><div class='add'>+	if (t == ALPHA_CHAR) return get_ident_token (tok, s, slen);</div><div class='add'>+	if (t == OP_CHAR)</div><div class='add'>+	  {</div><div class='add'>+	     unget_prep_char (ch);</div><div class='add'>+	     return get_op_token (tok, '!');</div><div class='add'>+	  }</div><div class='add'>+	_SLparse_error("Misplaced !", NULL, 0);</div><div class='add'>+	return -1;</div><div class='add'>+</div><div class='add'>+      case DOT_CHAR:</div><div class='add'>+	ch = prep_get_char ();</div><div class='add'>+	if (DIGIT_CHAR == CHAR_CLASS(ch))</div><div class='add'>+	  {</div><div class='add'>+	     s [slen++] = ch;</div><div class='add'>+	     return get_number_token (tok, s, slen);</div><div class='add'>+	  }</div><div class='add'>+	unget_prep_char (ch);</div><div class='add'>+	return (tok-&gt;type = DOT_TOKEN);</div><div class='add'>+</div><div class='add'>+      case SEP_CHAR:</div><div class='add'>+	return (tok-&gt;type = CHAR_DATA(ch));</div><div class='add'>+</div><div class='add'>+      case DQUOTE_CHAR:</div><div class='add'>+      case QUOTE_CHAR:</div><div class='add'>+	return get_string_token (tok, ch, s);</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	_SLparse_error("Invalid character", NULL, 0);</div><div class='add'>+	return (tok-&gt;type = EOF_TOKEN);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLget_rpn_token (_SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+   unsigned char ch;</div><div class='add'>+</div><div class='add'>+   tok-&gt;v.s_val = "??";</div><div class='add'>+   while ((ch = *Input_Line_Pointer) != 0)</div><div class='add'>+     {</div><div class='add'>+	unsigned char t;</div><div class='add'>+</div><div class='add'>+	Input_Line_Pointer++;</div><div class='add'>+	if (WHITE_CHAR == (t = CHAR_CLASS(ch)))</div><div class='add'>+	  continue;</div><div class='add'>+</div><div class='add'>+	if (NL_CHAR == t)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	return extract_token (tok, ch, t);</div><div class='add'>+     }</div><div class='add'>+   Input_Line_Pointer = Empty_Line;</div><div class='add'>+   return EOF_TOKEN;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLget_token (_SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+   unsigned char ch;</div><div class='add'>+   unsigned char t;</div><div class='add'>+</div><div class='add'>+   tok-&gt;num_refs = 1;</div><div class='add'>+   tok-&gt;free_sval_flag = 0;</div><div class='add'>+   tok-&gt;v.s_val = "??";</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   tok-&gt;line_number = LLT-&gt;line_num;</div><div class='add'>+#endif</div><div class='add'>+   if (SLang_Error || (Input_Line == NULL))</div><div class='add'>+     return (tok-&gt;type = EOF_TOKEN);</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	ch = *Input_Line_Pointer++;</div><div class='add'>+	if (WHITE_CHAR == (t = CHAR_CLASS (ch)))</div><div class='add'>+	  continue;</div><div class='add'>+</div><div class='add'>+	if (t != NL_CHAR)</div><div class='add'>+	  return extract_token (tok, ch, t);</div><div class='add'>+</div><div class='add'>+	do</div><div class='add'>+	  {</div><div class='add'>+	     LLT-&gt;line_num++;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+	     tok-&gt;line_number++;</div><div class='add'>+#endif</div><div class='add'>+	     Input_Line = LLT-&gt;read(LLT);</div><div class='add'>+	     if ((NULL == Input_Line) || SLang_Error)</div><div class='add'>+	       {</div><div class='add'>+		  Input_Line_Pointer = Input_Line = NULL;</div><div class='add'>+		  return (tok-&gt;type = EOF_TOKEN);</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+	while (0 == SLprep_line_ok(Input_Line, This_SLpp));</div><div class='add'>+</div><div class='add'>+	Input_Line_Pointer = Input_Line;</div><div class='add'>+	if (*Input_Line_Pointer == '.')</div><div class='add'>+	  {</div><div class='add'>+	     Input_Line_Pointer++;</div><div class='add'>+	     return tok-&gt;type = RPN_TOKEN;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int prep_exists_function (char *line, char comment)</div><div class='add'>+{</div><div class='add'>+   char buf[MAX_FILE_LINE_LEN], *b, *bmax;</div><div class='add'>+   unsigned char ch;</div><div class='add'>+</div><div class='add'>+   bmax = buf + (sizeof (buf) - 1);</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	/* skip whitespace */</div><div class='add'>+	while ((ch = (unsigned char) *line),</div><div class='add'>+	       ch &amp;&amp; (ch != '\n') &amp;&amp; (ch &lt;= ' '))</div><div class='add'>+	  line++;</div><div class='add'>+</div><div class='add'>+	if ((ch &lt;= '\n')</div><div class='add'>+	    || (ch == (unsigned char) comment)) break;</div><div class='add'>+</div><div class='add'>+	b = buf;</div><div class='add'>+	while ((ch = (unsigned char) *line) &gt; ' ')</div><div class='add'>+	  {</div><div class='add'>+	     if (b &lt; bmax) *b++ = (char) ch;</div><div class='add'>+	     line++;</div><div class='add'>+	  }</div><div class='add'>+	*b = 0;</div><div class='add'>+</div><div class='add'>+	if (SLang_is_defined (buf))</div><div class='add'>+	  return 1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int prep_eval_expr (char *expr)</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   if (0 != SLang_load_string (expr))</div><div class='add'>+     return -1;</div><div class='add'>+   if (-1 == SLang_pop_integer (&amp;ret))</div><div class='add'>+     return -1;</div><div class='add'>+   return (ret != 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+int SLang_load_object (SLang_Load_Type *x)</div><div class='add'>+{</div><div class='add'>+   SLPreprocess_Type this_pp;</div><div class='add'>+   SLPreprocess_Type *save_this_pp;</div><div class='add'>+   SLang_Load_Type *save_llt;</div><div class='add'>+   char *save_input_line, *save_input_line_ptr;</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   int save_compile_line_num_info;</div><div class='add'>+#endif</div><div class='add'>+   int save_auto_declare_variables;</div><div class='add'>+</div><div class='add'>+   if (SLprep_exists_hook == NULL)</div><div class='add'>+     SLprep_exists_hook = prep_exists_function;</div><div class='add'>+</div><div class='add'>+   if (_SLprep_eval_hook == NULL)</div><div class='add'>+     _SLprep_eval_hook = prep_eval_expr;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLprep_open_prep (&amp;this_pp)) return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLcompile_push_context (x))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   save_compile_line_num_info = _SLang_Compile_Line_Num_Info;</div><div class='add'>+#endif</div><div class='add'>+   save_this_pp = This_SLpp;</div><div class='add'>+   save_input_line = Input_Line;</div><div class='add'>+   save_input_line_ptr = Input_Line_Pointer;</div><div class='add'>+   save_llt = LLT;</div><div class='add'>+   save_auto_declare_variables = _SLang_Auto_Declare_Globals;</div><div class='add'>+</div><div class='add'>+   This_SLpp = &amp;this_pp;</div><div class='add'>+   Input_Line_Pointer = Input_Line = Empty_Line;</div><div class='add'>+   LLT = x;</div><div class='add'>+</div><div class='add'>+   x-&gt;line_num = 0;</div><div class='add'>+   x-&gt;parse_level = 0;</div><div class='add'>+   _SLang_Auto_Declare_Globals = x-&gt;auto_declare_globals;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   _SLang_Compile_Line_Num_Info = Default_Compile_Line_Num_Info;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   _SLparse_start (x);</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     do_line_file_error (x-&gt;line_num, x-&gt;name);</div><div class='add'>+</div><div class='add'>+   _SLang_Auto_Declare_Globals = save_auto_declare_variables;</div><div class='add'>+</div><div class='add'>+   if (SLang_Error) SLang_restart (0);</div><div class='add'>+</div><div class='add'>+   (void) _SLcompile_pop_context ();</div><div class='add'>+</div><div class='add'>+   Input_Line = save_input_line;</div><div class='add'>+   Input_Line_Pointer = save_input_line_ptr;</div><div class='add'>+   LLT = save_llt;</div><div class='add'>+   This_SLpp = save_this_pp;</div><div class='add'>+</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+   _SLang_Compile_Line_Num_Info = save_compile_line_num_info;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   if (SLang_Error) return -1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+SLang_Load_Type *SLallocate_load_type (char *name)</div><div class='add'>+{</div><div class='add'>+   SLang_Load_Type *x;</div><div class='add'>+</div><div class='add'>+   if (NULL == (x = (SLang_Load_Type *)SLmalloc (sizeof (SLang_Load_Type))))</div><div class='add'>+     return NULL;</div><div class='add'>+   memset ((char *) x, 0, sizeof (SLang_Load_Type));</div><div class='add'>+</div><div class='add'>+   if (name == NULL) name = "";</div><div class='add'>+</div><div class='add'>+   x-&gt;name = SLang_create_slstring (name);</div><div class='add'>+   if (x-&gt;name == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) x);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   return x;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLdeallocate_load_type (SLang_Load_Type *x)</div><div class='add'>+{</div><div class='add'>+   if (x != NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (x-&gt;name);</div><div class='add'>+	SLfree ((char *) x);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *string;</div><div class='add'>+   char *ptr;</div><div class='add'>+}</div><div class='add'>+String_Client_Data_Type;</div><div class='add'>+</div><div class='add'>+static char *read_from_string (SLang_Load_Type *x)</div><div class='add'>+{</div><div class='add'>+   String_Client_Data_Type *data;</div><div class='add'>+   char *s, *s1, ch;</div><div class='add'>+</div><div class='add'>+   data = (String_Client_Data_Type *)x-&gt;client_data;</div><div class='add'>+   s1 = s = data-&gt;ptr;</div><div class='add'>+</div><div class='add'>+   if (*s == 0)</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   while ((ch = *s) != 0)</div><div class='add'>+     {</div><div class='add'>+	s++;</div><div class='add'>+	if (ch == '\n')</div><div class='add'>+	  break;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   data-&gt;ptr = s;</div><div class='add'>+   return s1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_load_string (char *string)</div><div class='add'>+{</div><div class='add'>+   SLang_Load_Type *x;</div><div class='add'>+   String_Client_Data_Type data;</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   if (string == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* Grab a private copy in case loading modifies string */</div><div class='add'>+   if (NULL == (string = SLang_create_slstring (string)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* To avoid creating a static data space for every string loaded,</div><div class='add'>+    * all string objects will be regarded as identical.  So, identify</div><div class='add'>+    * all of them by ***string***</div><div class='add'>+    */</div><div class='add'>+   if (NULL == (x = SLallocate_load_type ("***string***")))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (string);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   x-&gt;client_data = (VOID_STAR) &amp;data;</div><div class='add'>+   x-&gt;read = read_from_string;</div><div class='add'>+</div><div class='add'>+   data.ptr = data.string = string;</div><div class='add'>+   if (-1 == (ret = SLang_load_object (x)))</div><div class='add'>+     SLang_verror (SLang_Error, "called from eval: %s", string);</div><div class='add'>+</div><div class='add'>+   SLang_free_slstring (string);</div><div class='add'>+   SLdeallocate_load_type (x);</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   char *buf;</div><div class='add'>+   FILE *fp;</div><div class='add'>+}</div><div class='add'>+File_Client_Data_Type;</div><div class='add'>+</div><div class='add'>+char *SLang_User_Prompt;</div><div class='add'>+static char *read_from_file (SLang_Load_Type *x)</div><div class='add'>+{</div><div class='add'>+   FILE *fp;</div><div class='add'>+   File_Client_Data_Type *c;</div><div class='add'>+</div><div class='add'>+   c = (File_Client_Data_Type *)x-&gt;client_data;</div><div class='add'>+   fp = c-&gt;fp;</div><div class='add'>+</div><div class='add'>+   if ((fp == stdin) &amp;&amp; (SLang_User_Prompt != NULL))</div><div class='add'>+     {</div><div class='add'>+	fputs (SLang_User_Prompt, stdout);</div><div class='add'>+	fflush (stdout);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return fgets (c-&gt;buf, MAX_FILE_LINE_LEN, c-&gt;fp);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note that file could be freed from Slang during run of this routine</div><div class='add'>+ * so get it and store it !! (e.g., autoloading)</div><div class='add'>+ */</div><div class='add'>+int (*SLang_Load_File_Hook) (char *);</div><div class='add'>+int SLang_load_file (char *f)</div><div class='add'>+{</div><div class='add'>+   File_Client_Data_Type client_data;</div><div class='add'>+   SLang_Load_Type *x;</div><div class='add'>+   char *name, *buf;</div><div class='add'>+   FILE *fp;</div><div class='add'>+</div><div class='add'>+   if (SLang_Load_File_Hook != NULL)</div><div class='add'>+     return (*SLang_Load_File_Hook) (f);</div><div class='add'>+</div><div class='add'>+   if (f == NULL) name = "&lt;stdin&gt;"; else name = f;</div><div class='add'>+</div><div class='add'>+   name = SLang_create_slstring (name);</div><div class='add'>+   if (name == NULL)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (NULL == (x = SLallocate_load_type (name)))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   buf = NULL;</div><div class='add'>+</div><div class='add'>+   if (f != NULL)</div><div class='add'>+     fp = fopen (f, "r");</div><div class='add'>+   else</div><div class='add'>+     fp = stdin;</div><div class='add'>+</div><div class='add'>+   if (fp == NULL)</div><div class='add'>+     SLang_verror (SL_OBJ_NOPEN, "Unable to open %s", name);</div><div class='add'>+   else if (NULL != (buf = SLmalloc (MAX_FILE_LINE_LEN + 1)))</div><div class='add'>+     {</div><div class='add'>+	client_data.fp = fp;</div><div class='add'>+	client_data.buf = buf;</div><div class='add'>+	x-&gt;client_data = (VOID_STAR) &amp;client_data;</div><div class='add'>+	x-&gt;read = read_from_file;</div><div class='add'>+</div><div class='add'>+	(void) SLang_load_object (x);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if ((fp != NULL) &amp;&amp; (fp != stdin))</div><div class='add'>+     fclose (fp);</div><div class='add'>+</div><div class='add'>+   SLfree (buf);</div><div class='add'>+   SLang_free_slstring (name);</div><div class='add'>+   SLdeallocate_load_type (x);</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_guess_type (char *t)</div><div class='add'>+{</div><div class='add'>+   char *p;</div><div class='add'>+   register char ch;</div><div class='add'>+   int modifier = 0;</div><div class='add'>+</div><div class='add'>+   if (*t == '-') t++;</div><div class='add'>+   p = t;</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+   if (*p != '.')</div><div class='add'>+     {</div><div class='add'>+#endif</div><div class='add'>+	modifier = 0;</div><div class='add'>+	while ((*p &gt;= '0') &amp;&amp; (*p &lt;= '9')) p++;</div><div class='add'>+	if (t == p) return (SLANG_STRING_TYPE);</div><div class='add'>+	if ((*p == 'x') &amp;&amp; (p == t + 1))   /* 0x?? */</div><div class='add'>+	  {</div><div class='add'>+	     modifier |= 8;</div><div class='add'>+	     p++;</div><div class='add'>+	     while (ch = *p,</div><div class='add'>+		    ((ch &gt;= '0') &amp;&amp; (ch &lt;= '9'))</div><div class='add'>+		    || (((ch | 0x20) &gt;= 'a') &amp;&amp; ((ch | 0x20) &lt;= 'f'))) p++;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	/* Now look for UL, LU, UH, HU, L, H modifiers */</div><div class='add'>+	while ((ch = *p) != 0)</div><div class='add'>+	  {</div><div class='add'>+	     ch |= 0x20;</div><div class='add'>+	     if (ch == 'h') modifier |= 1;</div><div class='add'>+	     else if (ch == 'l') modifier |= 2;</div><div class='add'>+	     else if (ch == 'u') modifier |= 4;</div><div class='add'>+	     else break;</div><div class='add'>+	     p++;</div><div class='add'>+	  }</div><div class='add'>+	if ((1|2) == (modifier &amp; (1|2)))	       /* hl present */</div><div class='add'>+	  return SLANG_STRING_TYPE;</div><div class='add'>+</div><div class='add'>+	if (ch == 0)</div><div class='add'>+	  {</div><div class='add'>+	     if ((modifier &amp; 0x7) == 0) return SLANG_INT_TYPE;</div><div class='add'>+	     if (modifier &amp; 4)</div><div class='add'>+	       {</div><div class='add'>+		  if (modifier &amp; 1) return SLANG_USHORT_TYPE;</div><div class='add'>+		  if (modifier &amp; 2) return SLANG_ULONG_TYPE;</div><div class='add'>+		  return SLANG_UINT_TYPE;</div><div class='add'>+	       }</div><div class='add'>+	     if (modifier &amp; 1) return SLANG_SHORT_TYPE;</div><div class='add'>+	     if (modifier &amp; 2) return SLANG_LONG_TYPE;</div><div class='add'>+	     return SLANG_INT_TYPE;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (modifier) return SLANG_STRING_TYPE;</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* now down to double case */</div><div class='add'>+   if (*p == '.')</div><div class='add'>+     {</div><div class='add'>+	p++;</div><div class='add'>+	while ((*p &gt;= '0') &amp;&amp; (*p &lt;= '9')) p++;</div><div class='add'>+     }</div><div class='add'>+   if (*p == 0) return(SLANG_DOUBLE_TYPE);</div><div class='add'>+   if ((*p != 'e') &amp;&amp; (*p != 'E'))</div><div class='add'>+     {</div><div class='add'>+# if SLANG_HAS_COMPLEX</div><div class='add'>+	if (((*p == 'i') || (*p == 'j'))</div><div class='add'>+	    &amp;&amp; (p[1] == 0))</div><div class='add'>+	  return SLANG_COMPLEX_TYPE;</div><div class='add'>+# endif</div><div class='add'>+	if (((*p | 0x20) == 'f') &amp;&amp; (p[1] == 0))</div><div class='add'>+	  return SLANG_FLOAT_TYPE;</div><div class='add'>+</div><div class='add'>+	return SLANG_STRING_TYPE;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   p++;</div><div class='add'>+   if ((*p == '-') || (*p == '+')) p++;</div><div class='add'>+   while ((*p &gt;= '0') &amp;&amp; (*p &lt;= '9')) p++;</div><div class='add'>+   if (*p != 0)</div><div class='add'>+     {</div><div class='add'>+# if SLANG_HAS_COMPLEX</div><div class='add'>+	if (((*p == 'i') || (*p == 'j'))</div><div class='add'>+	    &amp;&amp; (p[1] == 0))</div><div class='add'>+	  return SLANG_COMPLEX_TYPE;</div><div class='add'>+# endif</div><div class='add'>+	if (((*p | 0x20) == 'f') &amp;&amp; (p[1] == 0))</div><div class='add'>+	  return SLANG_FLOAT_TYPE;</div><div class='add'>+</div><div class='add'>+	return SLANG_STRING_TYPE;</div><div class='add'>+     }</div><div class='add'>+   return SLANG_DOUBLE_TYPE;</div><div class='add'>+#else</div><div class='add'>+   return SLANG_STRING_TYPE;</div><div class='add'>+#endif				       /* SLANG_HAS_FLOAT */</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int hex_atoul (unsigned char *s, unsigned long *ul)</div><div class='add'>+{</div><div class='add'>+   register unsigned char ch;</div><div class='add'>+   register unsigned long value;</div><div class='add'>+   register int base;</div><div class='add'>+</div><div class='add'>+   s++;				       /* skip the leading 0 */</div><div class='add'>+</div><div class='add'>+   /* look for 'x' which indicates hex */</div><div class='add'>+   if ((*s | 0x20) == 'x')</div><div class='add'>+     {</div><div class='add'>+	base = 16;</div><div class='add'>+	s++;</div><div class='add'>+	if (*s == 0)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   else base = 8;</div><div class='add'>+</div><div class='add'>+   value = 0;</div><div class='add'>+   while ((ch = *s++) != 0)</div><div class='add'>+     {</div><div class='add'>+	char ch1 = ch | 0x20;</div><div class='add'>+	switch (ch1)</div><div class='add'>+	  {</div><div class='add'>+	   default:</div><div class='add'>+	     SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 'u':</div><div class='add'>+	   case 'l':</div><div class='add'>+	   case 'h':</div><div class='add'>+	     *ul = value;</div><div class='add'>+	     return 0;</div><div class='add'>+</div><div class='add'>+	   case '8':</div><div class='add'>+	   case '9':</div><div class='add'>+	     if (base != 16) SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+	     /* drop */</div><div class='add'>+	   case '0':</div><div class='add'>+	   case '1':</div><div class='add'>+	   case '2':</div><div class='add'>+	   case '3':</div><div class='add'>+	   case '4':</div><div class='add'>+	   case '5':</div><div class='add'>+	   case '6':</div><div class='add'>+	   case '7':</div><div class='add'>+	     ch1 -= '0';</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 'a':</div><div class='add'>+	   case 'b':</div><div class='add'>+	   case 'c':</div><div class='add'>+	   case 'd':</div><div class='add'>+	   case 'e':</div><div class='add'>+	   case 'f':</div><div class='add'>+	     if (base != 16) SLang_Error = SL_SYNTAX_ERROR;</div><div class='add'>+	     ch1 = (ch1 - 'a') + 10;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	value = value * base + ch1;</div><div class='add'>+     }</div><div class='add'>+   *ul = value;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note: These routines do not check integer overflow.  I would use the C</div><div class='add'>+ * library functions atol and atoul but some implementations check overflow</div><div class='add'>+ * and some do not.  The following implementations provide a consistent</div><div class='add'>+ * behavior.</div><div class='add'>+ */</div><div class='add'>+unsigned long SLatoul (unsigned char *s)</div><div class='add'>+{</div><div class='add'>+   int sign;</div><div class='add'>+   unsigned long value;</div><div class='add'>+</div><div class='add'>+   if (*s == '-') sign = -1;</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	sign = 1;</div><div class='add'>+	if (*s == '+') s++;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (*s == '0')</div><div class='add'>+     {</div><div class='add'>+	if (-1 == hex_atoul (s, &amp;value))</div><div class='add'>+	  return (unsigned long) -1;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	while (WHITE_CHAR == CHAR_CLASS(*s))</div><div class='add'>+	  s++;</div><div class='add'>+</div><div class='add'>+	value = 0;</div><div class='add'>+	while (DIGIT_CHAR == CHAR_CLASS(*s))</div><div class='add'>+	  {</div><div class='add'>+	     value = value * 10 + (unsigned long) (*s - '0');</div><div class='add'>+	     s++;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (sign == -1)</div><div class='add'>+     value = (unsigned long)-1L * value;</div><div class='add'>+</div><div class='add'>+   return value;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+long SLatol (unsigned char *s)</div><div class='add'>+{</div><div class='add'>+   while (WHITE_CHAR == CHAR_CLASS(*s))</div><div class='add'>+     s++;</div><div class='add'>+</div><div class='add'>+   if (*s == '-')</div><div class='add'>+     {</div><div class='add'>+	long value = (long) SLatoul (s+1);</div><div class='add'>+	return -value;</div><div class='add'>+     }</div><div class='add'>+   return (long) SLatoul (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLatoi (unsigned char *s)</div><div class='add'>+{</div><div class='add'>+   return (int) SLatol (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *check_byte_compiled_token (char *buf)</div><div class='add'>+{</div><div class='add'>+   unsigned int len_lo, len_hi, len;</div><div class='add'>+</div><div class='add'>+   len_lo = (unsigned char) *Input_Line_Pointer++;</div><div class='add'>+   if ((len_lo &lt; 32)</div><div class='add'>+       || ((len_hi = (unsigned char)*Input_Line_Pointer++) &lt; 32)</div><div class='add'>+       || ((len = (len_lo - 32) | ((len_hi - 32) &lt;&lt; 7)) &gt;= MAX_TOKEN_LEN))</div><div class='add'>+     {</div><div class='add'>+	SLang_doerror ("Byte compiled file appears corrupt");</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLMEMCPY (buf, Input_Line_Pointer, len);</div><div class='add'>+   buf += len;</div><div class='add'>+   Input_Line_Pointer += len;</div><div class='add'>+   *buf = 0;</div><div class='add'>+   return buf;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLcompile_byte_compiled (void)</div><div class='add'>+{</div><div class='add'>+   unsigned char type;</div><div class='add'>+   _SLang_Token_Type tok;</div><div class='add'>+   char buf[MAX_TOKEN_LEN];</div><div class='add'>+   char *ebuf;</div><div class='add'>+   unsigned int len;</div><div class='add'>+</div><div class='add'>+   memset ((char *) &amp;tok, 0, sizeof (_SLang_Token_Type));</div><div class='add'>+</div><div class='add'>+   while (SLang_Error == 0)</div><div class='add'>+     {</div><div class='add'>+	top_of_switch:</div><div class='add'>+	type = (unsigned char) *Input_Line_Pointer++;</div><div class='add'>+	switch (type)</div><div class='add'>+	  {</div><div class='add'>+	   case '\n':</div><div class='add'>+	   case 0:</div><div class='add'>+	     if (NULL == (Input_Line = LLT-&gt;read(LLT)))</div><div class='add'>+	       {</div><div class='add'>+		  Input_Line_Pointer = Input_Line = NULL;</div><div class='add'>+		  return;</div><div class='add'>+	       }</div><div class='add'>+	     Input_Line_Pointer = Input_Line;</div><div class='add'>+	     goto top_of_switch;</div><div class='add'>+</div><div class='add'>+	   case LINE_NUM_TOKEN:</div><div class='add'>+	   case CHAR_TOKEN:</div><div class='add'>+	   case UCHAR_TOKEN:</div><div class='add'>+	   case SHORT_TOKEN:</div><div class='add'>+	   case USHORT_TOKEN:</div><div class='add'>+	   case INT_TOKEN:</div><div class='add'>+	   case UINT_TOKEN:</div><div class='add'>+	   case LONG_TOKEN:</div><div class='add'>+	   case ULONG_TOKEN:</div><div class='add'>+	     if (NULL == check_byte_compiled_token (buf))</div><div class='add'>+	       return;</div><div class='add'>+	     tok.v.long_val = atol (buf);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case COMPLEX_TOKEN:</div><div class='add'>+	   case FLOAT_TOKEN:</div><div class='add'>+	   case DOUBLE_TOKEN:</div><div class='add'>+	     if (NULL == check_byte_compiled_token (buf))</div><div class='add'>+	       return;</div><div class='add'>+	     tok.v.s_val = buf;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case ESC_STRING_TOKEN:</div><div class='add'>+	     if (NULL == (ebuf = check_byte_compiled_token (buf)))</div><div class='add'>+	       return;</div><div class='add'>+	     tok.v.s_val = buf;</div><div class='add'>+	     if (expand_escaped_string (buf, buf, ebuf, &amp;len))</div><div class='add'>+	       {</div><div class='add'>+		  tok.hash = len;</div><div class='add'>+		  type = _BSTRING_TOKEN;</div><div class='add'>+	       }</div><div class='add'>+	     else</div><div class='add'>+	       {</div><div class='add'>+		  tok.hash = _SLstring_hash ((unsigned char *)buf, (unsigned char *)buf + len);</div><div class='add'>+		  type = STRING_TOKEN;</div><div class='add'>+	       }</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case TMP_TOKEN:</div><div class='add'>+	   case DEFINE_TOKEN:</div><div class='add'>+	   case DEFINE_STATIC_TOKEN:</div><div class='add'>+	   case DEFINE_PRIVATE_TOKEN:</div><div class='add'>+	   case DEFINE_PUBLIC_TOKEN:</div><div class='add'>+	   case DOT_TOKEN:</div><div class='add'>+	   case STRING_TOKEN:</div><div class='add'>+	   case IDENT_TOKEN:</div><div class='add'>+	   case _REF_TOKEN:</div><div class='add'>+	   case _DEREF_ASSIGN_TOKEN:</div><div class='add'>+	   case _SCALAR_ASSIGN_TOKEN:</div><div class='add'>+	   case _SCALAR_PLUSEQS_TOKEN:</div><div class='add'>+	   case _SCALAR_MINUSEQS_TOKEN:</div><div class='add'>+	   case _SCALAR_TIMESEQS_TOKEN:</div><div class='add'>+	   case _SCALAR_DIVEQS_TOKEN:</div><div class='add'>+	   case _SCALAR_BOREQS_TOKEN:</div><div class='add'>+	   case _SCALAR_BANDEQS_TOKEN:</div><div class='add'>+	   case _SCALAR_PLUSPLUS_TOKEN:</div><div class='add'>+	   case _SCALAR_POST_PLUSPLUS_TOKEN:</div><div class='add'>+	   case _SCALAR_MINUSMINUS_TOKEN:</div><div class='add'>+	   case _SCALAR_POST_MINUSMINUS_TOKEN:</div><div class='add'>+	   case _STRUCT_ASSIGN_TOKEN:</div><div class='add'>+	   case _STRUCT_PLUSEQS_TOKEN:</div><div class='add'>+	   case _STRUCT_MINUSEQS_TOKEN:</div><div class='add'>+	   case _STRUCT_TIMESEQS_TOKEN:</div><div class='add'>+	   case _STRUCT_DIVEQS_TOKEN:</div><div class='add'>+	   case _STRUCT_BOREQS_TOKEN:</div><div class='add'>+	   case _STRUCT_BANDEQS_TOKEN:</div><div class='add'>+	   case _STRUCT_POST_MINUSMINUS_TOKEN:</div><div class='add'>+	   case _STRUCT_MINUSMINUS_TOKEN:</div><div class='add'>+	   case _STRUCT_POST_PLUSPLUS_TOKEN:</div><div class='add'>+	   case _STRUCT_PLUSPLUS_TOKEN:</div><div class='add'>+	     if (NULL == (ebuf = check_byte_compiled_token (buf)))</div><div class='add'>+	       return;</div><div class='add'>+	     tok.v.s_val = buf;</div><div class='add'>+	     tok.hash = _SLstring_hash ((unsigned char *)buf, (unsigned char *)ebuf);</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   default:</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+	tok.type = type;</div><div class='add'>+</div><div class='add'>+	(*_SLcompile_ptr) (&amp;tok);</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int escape_string (unsigned char *s, unsigned char *smax,</div><div class='add'>+			  unsigned char *buf, unsigned char *buf_max,</div><div class='add'>+			  int *is_escaped)</div><div class='add'>+{</div><div class='add'>+   unsigned char ch;</div><div class='add'>+</div><div class='add'>+   *is_escaped = 0;</div><div class='add'>+   while (buf &lt; buf_max)</div><div class='add'>+     {</div><div class='add'>+	if (s == smax)</div><div class='add'>+	  {</div><div class='add'>+	     *buf = 0;</div><div class='add'>+	     return 0;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	ch = *s++;</div><div class='add'>+	switch (ch)</div><div class='add'>+	  {</div><div class='add'>+	   default:</div><div class='add'>+	     *buf++ = ch;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 0:</div><div class='add'>+	     *buf++ = '\\';</div><div class='add'>+	     if (buf &lt; buf_max) *buf++ = 'x';</div><div class='add'>+	     if (buf &lt; buf_max) *buf++ = '0';</div><div class='add'>+	     if (buf &lt; buf_max) *buf++ = '0';</div><div class='add'>+	     *is_escaped = 1;</div><div class='add'>+	     break; /* return 0; */</div><div class='add'>+</div><div class='add'>+	   case '\n':</div><div class='add'>+	     *buf++ = '\\';</div><div class='add'>+	     if (buf &lt; buf_max) *buf++ = 'n';</div><div class='add'>+	     *is_escaped = 1;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '\r':</div><div class='add'>+	     *buf++ = '\\';</div><div class='add'>+	     if (buf &lt; buf_max) *buf++ = 'r';</div><div class='add'>+	     *is_escaped = 1;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case 0x1A:		       /* ^Z */</div><div class='add'>+	     *buf++ = '\\';</div><div class='add'>+	     if (buf &lt; buf_max) *buf++ = 'x';</div><div class='add'>+	     if (buf &lt; buf_max) *buf++ = '1';</div><div class='add'>+	     if (buf &lt; buf_max) *buf++ = 'A';</div><div class='add'>+	     *is_escaped = 1;</div><div class='add'>+	     break;</div><div class='add'>+</div><div class='add'>+	   case '\\':</div><div class='add'>+	     *buf++ = ch;</div><div class='add'>+	     if (buf &lt; buf_max) *buf++ = ch;</div><div class='add'>+	     *is_escaped = 1;</div><div class='add'>+	     break;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+   _SLparse_error ("String too long to byte-compile", NULL, 0);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static FILE *Byte_Compile_Fp;</div><div class='add'>+static unsigned int Byte_Compile_Line_Len;</div><div class='add'>+</div><div class='add'>+static int bytecomp_write_data (char *buf, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   char *err = "Write Error";</div><div class='add'>+</div><div class='add'>+   if ((Byte_Compile_Line_Len + len + 1) &gt;= MAX_FILE_LINE_LEN)</div><div class='add'>+     {</div><div class='add'>+	if (EOF == fputs ("\n", Byte_Compile_Fp))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_doerror (err);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	Byte_Compile_Line_Len = 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (EOF == fputs (buf, Byte_Compile_Fp))</div><div class='add'>+     {</div><div class='add'>+	SLang_doerror (err);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   Byte_Compile_Line_Len += len;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void byte_compile_token (_SLang_Token_Type *tok)</div><div class='add'>+{</div><div class='add'>+   unsigned char buf [MAX_TOKEN_LEN + 4], *buf_max;</div><div class='add'>+   unsigned int len;</div><div class='add'>+   char *b3;</div><div class='add'>+   int is_escaped;</div><div class='add'>+   unsigned char *s;</div><div class='add'>+</div><div class='add'>+   if (SLang_Error) return;</div><div class='add'>+</div><div class='add'>+   buf [0] = (unsigned char) tok-&gt;type;</div><div class='add'>+   buf [1] = 0;</div><div class='add'>+</div><div class='add'>+   buf_max = buf + sizeof(buf);</div><div class='add'>+   b3 = (char *) buf + 3;</div><div class='add'>+</div><div class='add'>+   switch (tok-&gt;type)</div><div class='add'>+     {</div><div class='add'>+      case LINE_NUM_TOKEN:</div><div class='add'>+      case CHAR_TOKEN:</div><div class='add'>+      case SHORT_TOKEN:</div><div class='add'>+      case INT_TOKEN:</div><div class='add'>+      case LONG_TOKEN:</div><div class='add'>+	sprintf (b3, "%ld", tok-&gt;v.long_val);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case UCHAR_TOKEN:</div><div class='add'>+      case USHORT_TOKEN:</div><div class='add'>+      case UINT_TOKEN:</div><div class='add'>+      case ULONG_TOKEN:</div><div class='add'>+	sprintf (b3, "%lu", tok-&gt;v.long_val);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case _BSTRING_TOKEN:</div><div class='add'>+	s = (unsigned char *) tok-&gt;v.s_val;</div><div class='add'>+	len = (unsigned int) tok-&gt;hash;</div><div class='add'>+</div><div class='add'>+	if (-1 == escape_string (s, s + len,</div><div class='add'>+				 (unsigned char *)b3, buf_max,</div><div class='add'>+				 &amp;is_escaped))</div><div class='add'>+	    return;</div><div class='add'>+</div><div class='add'>+	buf[0] = ESC_STRING_TOKEN;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case BSTRING_TOKEN:</div><div class='add'>+	if (NULL == (s = SLbstring_get_pointer (tok-&gt;v.b_val, &amp;len)))</div><div class='add'>+	  return;</div><div class='add'>+</div><div class='add'>+	if (-1 == escape_string (s, s + len,</div><div class='add'>+				 (unsigned char *)b3, buf_max,</div><div class='add'>+				 &amp;is_escaped))</div><div class='add'>+	    return;</div><div class='add'>+	buf[0] = ESC_STRING_TOKEN;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case STRING_TOKEN:</div><div class='add'>+	s = (unsigned char *)tok-&gt;v.s_val;</div><div class='add'>+</div><div class='add'>+	if (-1 == escape_string (s, s + strlen ((char *)s),</div><div class='add'>+				 (unsigned char *)b3, buf_max,</div><div class='add'>+				 &amp;is_escaped))</div><div class='add'>+	    return;</div><div class='add'>+</div><div class='add'>+	if (is_escaped)</div><div class='add'>+	  buf[0] = ESC_STRING_TOKEN;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+	/* a _SCALAR_* token is attached to an identifier. */</div><div class='add'>+      case _DEREF_ASSIGN_TOKEN:</div><div class='add'>+      case _SCALAR_ASSIGN_TOKEN:</div><div class='add'>+      case _SCALAR_PLUSEQS_TOKEN:</div><div class='add'>+      case _SCALAR_MINUSEQS_TOKEN:</div><div class='add'>+      case _SCALAR_TIMESEQS_TOKEN:</div><div class='add'>+      case _SCALAR_DIVEQS_TOKEN:</div><div class='add'>+      case _SCALAR_BOREQS_TOKEN:</div><div class='add'>+      case _SCALAR_BANDEQS_TOKEN:</div><div class='add'>+      case _SCALAR_PLUSPLUS_TOKEN:</div><div class='add'>+      case _SCALAR_POST_PLUSPLUS_TOKEN:</div><div class='add'>+      case _SCALAR_MINUSMINUS_TOKEN:</div><div class='add'>+      case _SCALAR_POST_MINUSMINUS_TOKEN:</div><div class='add'>+      case DOT_TOKEN:</div><div class='add'>+      case TMP_TOKEN:</div><div class='add'>+      case DEFINE_TOKEN:</div><div class='add'>+      case DEFINE_STATIC_TOKEN:</div><div class='add'>+      case DEFINE_PRIVATE_TOKEN:</div><div class='add'>+      case DEFINE_PUBLIC_TOKEN:</div><div class='add'>+      case FLOAT_TOKEN:</div><div class='add'>+      case DOUBLE_TOKEN:</div><div class='add'>+      case COMPLEX_TOKEN:</div><div class='add'>+      case IDENT_TOKEN:</div><div class='add'>+      case _REF_TOKEN:</div><div class='add'>+      case _STRUCT_ASSIGN_TOKEN:</div><div class='add'>+      case _STRUCT_PLUSEQS_TOKEN:</div><div class='add'>+      case _STRUCT_MINUSEQS_TOKEN:</div><div class='add'>+      case _STRUCT_TIMESEQS_TOKEN:</div><div class='add'>+      case _STRUCT_DIVEQS_TOKEN:</div><div class='add'>+      case _STRUCT_BOREQS_TOKEN:</div><div class='add'>+      case _STRUCT_BANDEQS_TOKEN:</div><div class='add'>+      case _STRUCT_POST_MINUSMINUS_TOKEN:</div><div class='add'>+      case _STRUCT_MINUSMINUS_TOKEN:</div><div class='add'>+      case _STRUCT_POST_PLUSPLUS_TOKEN:</div><div class='add'>+      case _STRUCT_PLUSPLUS_TOKEN:</div><div class='add'>+	strcpy (b3, tok-&gt;v.s_val);</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      default:</div><div class='add'>+	b3 = NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (b3 != NULL)</div><div class='add'>+     {</div><div class='add'>+	len = strlen (b3);</div><div class='add'>+	buf[1] = (unsigned char) ((len &amp; 0x7F) + 32);</div><div class='add'>+	buf[2] = (unsigned char) (((len &gt;&gt; 7) &amp; 0x7F) + 32);</div><div class='add'>+	len += 3;</div><div class='add'>+     }</div><div class='add'>+   else len = 1;</div><div class='add'>+</div><div class='add'>+   (void) bytecomp_write_data ((char *)buf, len);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_byte_compile_file (char *name, int method)</div><div class='add'>+{</div><div class='add'>+   char file [1024];</div><div class='add'>+</div><div class='add'>+   (void) method;</div><div class='add'>+   if (strlen (name) + 2 &gt;= sizeof (file))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_INVALID_PARM, "Filename too long");</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   sprintf (file, "%sc", name);</div><div class='add'>+   if (NULL == (Byte_Compile_Fp = fopen (file, "w")))</div><div class='add'>+     {</div><div class='add'>+	SLang_verror(SL_OBJ_NOPEN, "%s: unable to open", file);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   Byte_Compile_Line_Len = 0;</div><div class='add'>+   if (-1 != bytecomp_write_data (".#", 2))</div><div class='add'>+     {</div><div class='add'>+	_SLcompile_ptr = byte_compile_token;</div><div class='add'>+	(void) SLang_load_file (name);</div><div class='add'>+	_SLcompile_ptr = _SLcompile;</div><div class='add'>+</div><div class='add'>+	(void) bytecomp_write_data ("\n", 1);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (EOF == fclose (Byte_Compile_Fp))</div><div class='add'>+     SLang_doerror ("Write Error");</div><div class='add'>+</div><div class='add'>+   if (SLang_Error)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (0, "Error processing %s", name);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_generate_debug_info (int x)</div><div class='add'>+{</div><div class='add'>+   int y = Default_Compile_Line_Num_Info;</div><div class='add'>+   Default_Compile_Line_Num_Info = x;</div><div class='add'>+   return y;</div><div class='add'>+}</div><div class='head'>diff --git a/mdk-stage1/slang/sltypes.c b/mdk-stage1/slang/sltypes.c<br/>new file mode 100644<br/>index 000000000..05b8741b1<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/sltypes.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/sltypes.c</a></div><div class='hunk'>@@ -0,0 +1,966 @@</div><div class='add'>+/* Basic type operations for S-Lang */</div><div class='add'>+/* Copyright (c) 1992, 1996, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#if SLANG_HAS_FLOAT</div><div class='add'>+# include &lt;math.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#define SL_APP_WANTS_FOREACH	       /* for String_Type */</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+int SLpop_string (char **s) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   char *sls;</div><div class='add'>+</div><div class='add'>+   *s = NULL;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_slstring (&amp;sls))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (NULL == (*s = SLmake_string (sls)))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (sls);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_free_slstring (sls);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int SLang_pop_slstring (char **s) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   return SLclass_pop_ptr_obj (SLANG_STRING_TYPE, (VOID_STAR *)s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+/* if *data != 0, string should be freed upon use. */</div><div class='add'>+int SLang_pop_string(char **s, int *data) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   if (SLpop_string (s))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   *data = 1;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int _SLang_push_slstring (char *s)</div><div class='add'>+{</div><div class='add'>+   if (0 == SLclass_push_ptr_obj (SLANG_STRING_TYPE, (VOID_STAR)s))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   SLang_free_slstring (s);</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLpush_alloced_slstring (char *s, unsigned int len)</div><div class='add'>+{</div><div class='add'>+   if (NULL == (s = _SLcreate_via_alloced_slstring (s, len)))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   return _SLang_push_slstring (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_push_string (char *t) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   if (t == NULL)</div><div class='add'>+     return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+   if (NULL == (t = SLang_create_slstring (t)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return _SLang_push_slstring (t);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+int _SLang_dup_and_push_slstring (char *s)</div><div class='add'>+{</div><div class='add'>+   if (NULL == (s = _SLstring_dup_slstring (s)))</div><div class='add'>+     return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+   return _SLang_push_slstring (s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+</div><div class='add'>+/* This function _always_ frees the malloced string */</div><div class='add'>+int SLang_push_malloced_string (char *c) /*{{{*/</div><div class='add'>+{</div><div class='add'>+   int ret;</div><div class='add'>+</div><div class='add'>+   ret = SLang_push_string (c);</div><div class='add'>+   SLfree (c);</div><div class='add'>+</div><div class='add'>+   return ret;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/*}}}*/</div><div class='add'>+</div><div class='add'>+#if 0</div><div class='add'>+static int int_int_power (int a, int b)</div><div class='add'>+{</div><div class='add'>+   int r, s;</div><div class='add'>+</div><div class='add'>+   if (a == 0) return 0;</div><div class='add'>+   if (b &lt; 0) return 0;</div><div class='add'>+   if (b == 0) return 1;</div><div class='add'>+</div><div class='add'>+   s = 1;</div><div class='add'>+   if (a &lt; 0)</div><div class='add'>+     {</div><div class='add'>+	if ((b % 2) == 1) s = -1;</div><div class='add'>+	a = -a;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   /* FIXME: Priority=low</div><div class='add'>+    * This needs optimized</div><div class='add'>+    */</div><div class='add'>+   r = 1;</div><div class='add'>+   while (b)</div><div class='add'>+     {</div><div class='add'>+	r = r * a;</div><div class='add'>+	b--;</div><div class='add'>+     }</div><div class='add'>+   return r * s;</div><div class='add'>+}</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+string_string_bin_op_result (int op, unsigned char a, unsigned char b,</div><div class='add'>+			     unsigned char *c)</div><div class='add'>+{</div><div class='add'>+   (void) a;</div><div class='add'>+   (void) b;</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+      case SLANG_PLUS:</div><div class='add'>+	*c = SLANG_STRING_TYPE;</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_GT:</div><div class='add'>+      case SLANG_GE:</div><div class='add'>+      case SLANG_LT:</div><div class='add'>+      case SLANG_LE:</div><div class='add'>+      case SLANG_EQ:</div><div class='add'>+      case SLANG_NE:</div><div class='add'>+	*c = SLANG_CHAR_TYPE;</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int</div><div class='add'>+string_string_bin_op (int op,</div><div class='add'>+		      unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+		      unsigned char b_type, VOID_STAR bp, unsigned int nb,</div><div class='add'>+		      VOID_STAR cp)</div><div class='add'>+{</div><div class='add'>+   char *ic;</div><div class='add'>+   char **a, **b, **c;</div><div class='add'>+   unsigned int n, n_max;</div><div class='add'>+   unsigned int da, db;</div><div class='add'>+</div><div class='add'>+   (void) a_type;</div><div class='add'>+   (void) b_type;</div><div class='add'>+</div><div class='add'>+   if (na == 1) da = 0; else da = 1;</div><div class='add'>+   if (nb == 1) db = 0; else db = 1;</div><div class='add'>+</div><div class='add'>+   if (na &gt; nb) n_max = na; else n_max = nb;</div><div class='add'>+</div><div class='add'>+   a = (char **) ap;</div><div class='add'>+   b = (char **) bp;</div><div class='add'>+   for (n = 0; n &lt; n_max; n++)</div><div class='add'>+     {</div><div class='add'>+	if ((*a == NULL) || (*b == NULL))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_VARIABLE_UNINITIALIZED, "String element[%u] not initialized for binary operation", n);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	a += da; b += db;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   a = (char **) ap;</div><div class='add'>+   b = (char **) bp;</div><div class='add'>+   ic = (char *) cp;</div><div class='add'>+   c = NULL;</div><div class='add'>+</div><div class='add'>+   switch (op)</div><div class='add'>+     {</div><div class='add'>+      case SLANG_DIVIDE:</div><div class='add'>+      case SLANG_MINUS:</div><div class='add'>+      default:</div><div class='add'>+	return 0;</div><div class='add'>+</div><div class='add'>+       case SLANG_PLUS:</div><div class='add'>+	/* Concat */</div><div class='add'>+	c = (char **) cp;</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     if (NULL == (c[n] = SLang_concat_slstrings (*a, *b)))</div><div class='add'>+	       goto return_error;</div><div class='add'>+</div><div class='add'>+	     a += da; b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+</div><div class='add'>+      case SLANG_NE:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     ic [n] = (0 != strcmp (*a, *b));</div><div class='add'>+	     a += da;</div><div class='add'>+	     b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_GT:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     ic [n] = (strcmp (*a, *b) &gt; 0);</div><div class='add'>+	     a += da;</div><div class='add'>+	     b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_GE:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     ic [n] = (strcmp (*a, *b) &gt;= 0);</div><div class='add'>+	     a += da;</div><div class='add'>+	     b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_LT:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     ic [n] = (strcmp (*a, *b) &lt; 0);</div><div class='add'>+	     a += da;</div><div class='add'>+	     b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_LE:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     ic [n] = (strcmp (*a, *b) &lt;= 0);</div><div class='add'>+	     a += da;</div><div class='add'>+	     b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+      case SLANG_EQ:</div><div class='add'>+	for (n = 0; n &lt; n_max; n++)</div><div class='add'>+	  {</div><div class='add'>+	     ic [n] = (strcmp (*a, *b) == 0);</div><div class='add'>+	     a += da;</div><div class='add'>+	     b += db;</div><div class='add'>+	  }</div><div class='add'>+	break;</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+</div><div class='add'>+   return_error:</div><div class='add'>+   if (c != NULL)</div><div class='add'>+     {</div><div class='add'>+	unsigned int nn;</div><div class='add'>+	for (nn = 0; nn &lt; n; nn++)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_free_slstring (c[nn]);</div><div class='add'>+	     c[nn] = NULL;</div><div class='add'>+	  }</div><div class='add'>+	for (nn = n; nn &lt; n_max; nn++)</div><div class='add'>+	  c[nn] = NULL;</div><div class='add'>+     }</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void string_destroy (unsigned char unused, VOID_STAR s)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+   SLang_free_slstring (*(char **) s);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int string_push (unsigned char unused, VOID_STAR sptr)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+   return SLang_push_string (*(char **) sptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int string_cmp (unsigned char unused, VOID_STAR ap, VOID_STAR bp, int *c)</div><div class='add'>+{</div><div class='add'>+   char *a, *b;</div><div class='add'>+   (void) unused;</div><div class='add'>+   </div><div class='add'>+   a = *(char **) ap;</div><div class='add'>+   b = *(char **) bp;</div><div class='add'>+   if (a != b)</div><div class='add'>+     {</div><div class='add'>+	if (a == NULL) *c = -1;</div><div class='add'>+	else if (b == NULL) *c = 1;</div><div class='add'>+	else *c = strcmp (a, b);</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+   *c = 0;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int string_to_int (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+			  unsigned char b_type, VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   char **s;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   int *b;</div><div class='add'>+</div><div class='add'>+   (void) a_type;</div><div class='add'>+   (void) b_type;</div><div class='add'>+</div><div class='add'>+   s = (char **) ap;</div><div class='add'>+   b = (int *) bp;</div><div class='add'>+   for (i = 0; i &lt; na; i++)</div><div class='add'>+     {</div><div class='add'>+	if (s[i] == NULL) b[i] = 0;</div><div class='add'>+	else b[i] = s[i][0];</div><div class='add'>+     }</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+struct _SLang_Foreach_Context_Type</div><div class='add'>+{</div><div class='add'>+   char *string;</div><div class='add'>+   unsigned int n;</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static SLang_Foreach_Context_Type *</div><div class='add'>+string_foreach_open (unsigned char type, unsigned int num)</div><div class='add'>+{</div><div class='add'>+   char *s;</div><div class='add'>+   SLang_Foreach_Context_Type *c;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   if (num != 0)</div><div class='add'>+     {</div><div class='add'>+	SLang_verror (SL_NOT_IMPLEMENTED,</div><div class='add'>+		      "'foreach using' form not supported by String_Type");</div><div class='add'>+	SLdo_pop_n (num + 1);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   if (-1 == SLang_pop_slstring (&amp;s))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   c = (SLang_Foreach_Context_Type *)SLmalloc (sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+   if (c == NULL)</div><div class='add'>+     {</div><div class='add'>+	SLang_free_slstring (s);</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type));</div><div class='add'>+   c-&gt;string = s;</div><div class='add'>+</div><div class='add'>+   return c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void string_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   if (c == NULL) return;</div><div class='add'>+   SLang_free_slstring (c-&gt;string);</div><div class='add'>+   SLfree ((char *) c);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int string_foreach (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+   char ch;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   ch = c-&gt;string[c-&gt;n];</div><div class='add'>+   if (ch == 0)</div><div class='add'>+     return 0;			       /* done */</div><div class='add'>+</div><div class='add'>+   c-&gt;n += 1;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_push_int_obj (SLANG_INT_TYPE, ch))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLstring_list_push (_SLString_List_Type *p)</div><div class='add'>+{</div><div class='add'>+   unsigned int num;</div><div class='add'>+   int inum;</div><div class='add'>+   SLang_Array_Type *at;</div><div class='add'>+   char **buf;</div><div class='add'>+</div><div class='add'>+   if ((buf = p-&gt;buf) == NULL)</div><div class='add'>+     return SLang_push_null ();</div><div class='add'>+   </div><div class='add'>+   num = p-&gt;num;</div><div class='add'>+   inum = (int) num;</div><div class='add'>+   </div><div class='add'>+   if (num == 0) num++;</div><div class='add'>+   if (num != p-&gt;max_num)</div><div class='add'>+     {</div><div class='add'>+	if (NULL == (buf = (char **)SLrealloc ((char *) buf, sizeof (char *) * num)))</div><div class='add'>+	  {</div><div class='add'>+	     _SLstring_list_delete (p);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	p-&gt;max_num = num;</div><div class='add'>+	p-&gt;buf = buf;</div><div class='add'>+     }</div><div class='add'>+     </div><div class='add'>+   if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, (VOID_STAR) buf, &amp;inum, 1)))</div><div class='add'>+     {</div><div class='add'>+	_SLstring_list_delete (p);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   p-&gt;buf = NULL;</div><div class='add'>+   _SLstring_list_delete (p);</div><div class='add'>+   return SLang_push_array (at, 1);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLstring_list_init (_SLString_List_Type *p, unsigned int max_num, unsigned int delta_num)</div><div class='add'>+{</div><div class='add'>+   if (NULL == (p-&gt;buf = (char **) SLmalloc (max_num * sizeof (char *))))</div><div class='add'>+     return -1;</div><div class='add'>+   </div><div class='add'>+   p-&gt;max_num = max_num;</div><div class='add'>+   p-&gt;num = 0;</div><div class='add'>+   p-&gt;delta_num = delta_num;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLstring_list_append (_SLString_List_Type *p, char *s)</div><div class='add'>+{</div><div class='add'>+   if (s == NULL)</div><div class='add'>+     {</div><div class='add'>+	_SLstring_list_delete (p);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (p-&gt;max_num == p-&gt;num)</div><div class='add'>+     {</div><div class='add'>+	char **b;</div><div class='add'>+	unsigned int max_num = p-&gt;num + p-&gt;delta_num;</div><div class='add'>+	b = (char **)SLrealloc ((char *)p-&gt;buf, max_num * sizeof (char *));</div><div class='add'>+	if (b == NULL)</div><div class='add'>+	  {</div><div class='add'>+	     _SLstring_list_delete (p);</div><div class='add'>+	     SLang_free_slstring (s);</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	p-&gt;buf = b;</div><div class='add'>+	p-&gt;max_num = max_num;</div><div class='add'>+     }</div><div class='add'>+   </div><div class='add'>+   p-&gt;buf[p-&gt;num] = s;</div><div class='add'>+   p-&gt;num++;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void _SLstring_list_delete (_SLString_List_Type *p)</div><div class='add'>+{</div><div class='add'>+   if (p-&gt;buf != NULL)</div><div class='add'>+     {</div><div class='add'>+	unsigned int i, imax;</div><div class='add'>+	char **buf = p-&gt;buf;</div><div class='add'>+	imax = p-&gt;num;</div><div class='add'>+	for (i = 0; i &lt; imax; i++)</div><div class='add'>+	  SLang_free_slstring (buf[i]);</div><div class='add'>+	SLfree ((char *)buf);</div><div class='add'>+	p-&gt;buf = NULL;</div><div class='add'>+     }</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Ref type */</div><div class='add'>+int SLang_pop_ref (SLang_Ref_Type **ref)</div><div class='add'>+{</div><div class='add'>+   return SLclass_pop_ptr_obj (SLANG_REF_TYPE, (VOID_STAR *)ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Note: This is ok if ptr is NULL.  Some routines rely on this behavior */</div><div class='add'>+int _SLang_push_ref (int is_global, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   SLang_Ref_Type *r;</div><div class='add'>+</div><div class='add'>+   if (ptr == NULL)</div><div class='add'>+     return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+   r = (SLang_Ref_Type *) SLmalloc (sizeof (SLang_Ref_Type));</div><div class='add'>+   if (r == NULL) return -1;</div><div class='add'>+</div><div class='add'>+   r-&gt;is_global = is_global;</div><div class='add'>+   r-&gt;v.nt = (SLang_Name_Type *) ptr;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLclass_push_ptr_obj (SLANG_REF_TYPE, (VOID_STAR) r))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) r);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void ref_destroy (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   SLfree ((char *) *(SLang_Ref_Type **)ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_free_ref (SLang_Ref_Type *ref)</div><div class='add'>+{</div><div class='add'>+   SLfree ((char *) ref);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int ref_push (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   SLang_Ref_Type *ref;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   ref = *(SLang_Ref_Type **) ptr;</div><div class='add'>+</div><div class='add'>+   if (ref == NULL)</div><div class='add'>+     return SLang_push_null ();</div><div class='add'>+</div><div class='add'>+   return _SLang_push_ref (ref-&gt;is_global, (VOID_STAR) ref-&gt;v.nt);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_assign_to_ref (SLang_Ref_Type *ref, unsigned char type, VOID_STAR v)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type *stkptr;</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   </div><div class='add'>+   cl = _SLclass_get_class (type);</div><div class='add'>+</div><div class='add'>+   /* Use apush since this function is passing ``array'' bytes rather than the</div><div class='add'>+    * address of the data.  I need to somehow make this more consistent.  To</div><div class='add'>+    * see what I mean, consider:</div><div class='add'>+    * </div><div class='add'>+    *    double z[2];</div><div class='add'>+    *    char *s = "silly";</div><div class='add'>+    *    int i;</div><div class='add'>+    * </div><div class='add'>+    *    SLang_assign_to_ref (ref, SLANG_INT_TYPE,    &amp;i);</div><div class='add'>+    *    SLang_assign_to_ref (ref, SLANG_STRING_TYPE, &amp;s);</div><div class='add'>+    *    SLang_assign_to_ref (ref, SLANG_COMPLEX_TYPE, z);</div><div class='add'>+    * </div><div class='add'>+    * That is, all external routines that take a VOID_STAR argument need to</div><div class='add'>+    * be documented such that how the function should be called with the</div><div class='add'>+    * various class_types.</div><div class='add'>+    */</div><div class='add'>+   if (-1 == (*cl-&gt;cl_apush) (type, v))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   stkptr = _SLStack_Pointer;</div><div class='add'>+   if (0 == _SLang_deref_assign (ref))</div><div class='add'>+     return 0;</div><div class='add'>+</div><div class='add'>+   if (stkptr != _SLStack_Pointer)</div><div class='add'>+     SLdo_pop ();</div><div class='add'>+</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static char *ref_string (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   SLang_Ref_Type *ref;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   ref = *(SLang_Ref_Type **) ptr;</div><div class='add'>+   if (ref-&gt;is_global)</div><div class='add'>+     {</div><div class='add'>+	char *name, *s;</div><div class='add'>+</div><div class='add'>+	name = ref-&gt;v.nt-&gt;name;</div><div class='add'>+	if ((name != NULL)</div><div class='add'>+	    &amp;&amp; (NULL != (s = SLmalloc (strlen(name) + 2))))</div><div class='add'>+	  {</div><div class='add'>+	     *s = '&amp;';</div><div class='add'>+	     strcpy (s + 1, name);</div><div class='add'>+	     return s;</div><div class='add'>+	  }</div><div class='add'>+	</div><div class='add'>+	return NULL;</div><div class='add'>+     }</div><div class='add'>+   return SLmake_string ("Local Variable Reference");</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int ref_dereference (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+   return _SLang_dereference_ref (*(SLang_Ref_Type **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int ref_cmp (unsigned char type, VOID_STAR a, VOID_STAR b, int *c)</div><div class='add'>+{</div><div class='add'>+   SLang_Ref_Type *ra, *rb;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   </div><div class='add'>+   ra = *(SLang_Ref_Type **)a;</div><div class='add'>+   rb = *(SLang_Ref_Type **)b;</div><div class='add'>+   </div><div class='add'>+   if (ra == NULL)</div><div class='add'>+     {</div><div class='add'>+	if (rb == NULL) *c = 0;</div><div class='add'>+	else *c = -1;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+   if (rb == NULL)</div><div class='add'>+     {</div><div class='add'>+	*c = 1;</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+	</div><div class='add'>+   if (ra-&gt;v.nt == rb-&gt;v.nt)</div><div class='add'>+     *c = 0;</div><div class='add'>+   else *c = strcmp (ra-&gt;v.nt-&gt;name, rb-&gt;v.nt-&gt;name);</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+   </div><div class='add'>+SLang_Name_Type *SLang_pop_function (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Ref_Type *ref;</div><div class='add'>+   SLang_Name_Type *f;</div><div class='add'>+</div><div class='add'>+   if (SLang_peek_at_stack () == SLANG_STRING_TYPE)</div><div class='add'>+     {</div><div class='add'>+	char *name;</div><div class='add'>+	</div><div class='add'>+	if (-1 == SLang_pop_slstring (&amp;name))</div><div class='add'>+	  return NULL;</div><div class='add'>+	</div><div class='add'>+	if (NULL == (f = SLang_get_function (name)))</div><div class='add'>+	  {</div><div class='add'>+	     SLang_verror (SL_UNDEFINED_NAME, "Function %s does not exist", name);</div><div class='add'>+	     SLang_free_slstring (name);</div><div class='add'>+	     return NULL;</div><div class='add'>+	  }</div><div class='add'>+	SLang_free_slstring (name);</div><div class='add'>+	return f;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_ref (&amp;ref))</div><div class='add'>+     return NULL;</div><div class='add'>+</div><div class='add'>+   f = SLang_get_fun_from_ref (ref);</div><div class='add'>+   SLang_free_ref (ref);</div><div class='add'>+   return f;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This is a placeholder for version 2 */</div><div class='add'>+void SLang_free_function (SLang_Name_Type *f)</div><div class='add'>+{</div><div class='add'>+   (void) f;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* NULL type */</div><div class='add'>+int SLang_push_null (void)</div><div class='add'>+{</div><div class='add'>+   return SLclass_push_ptr_obj (SLANG_NULL_TYPE, NULL);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_null (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type obj;</div><div class='add'>+   return _SLang_pop_object_of_type (SLANG_NULL_TYPE, &amp;obj, 0);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int null_push (unsigned char unused, VOID_STAR ptr_unused)</div><div class='add'>+{</div><div class='add'>+   (void) unused; (void) ptr_unused;</div><div class='add'>+   return SLang_push_null ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int null_pop (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_null ())</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   *(char **) ptr = NULL;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* Implement foreach (NULL) using (whatever) to do nothing.  This is useful</div><div class='add'>+ * because suppose that X is a list but is NULL in some situations.  Then</div><div class='add'>+ * when it is NULL, we want foreach(X) to do nothing.</div><div class='add'>+ */</div><div class='add'>+static SLang_Foreach_Context_Type *</div><div class='add'>+null_foreach_open (unsigned char type, unsigned int num)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   SLdo_pop_n (num + 1);</div><div class='add'>+   return (SLang_Foreach_Context_Type *)1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void null_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   (void) c;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int null_foreach (unsigned char type, SLang_Foreach_Context_Type *c)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   (void) c;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int null_to_bool (unsigned char type, int *t)</div><div class='add'>+{</div><div class='add'>+   (void) type;</div><div class='add'>+   *t = 0;</div><div class='add'>+   return SLang_pop_null ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* AnyType */</div><div class='add'>+int _SLanytype_typecast (unsigned char a_type, VOID_STAR ap, unsigned int na,</div><div class='add'>+			 unsigned char b_type, VOID_STAR bp)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+   SLang_Any_Type **any;</div><div class='add'>+   unsigned int i;</div><div class='add'>+   unsigned int sizeof_type;</div><div class='add'>+</div><div class='add'>+   (void) b_type;</div><div class='add'>+</div><div class='add'>+   any = (SLang_Any_Type **) bp;</div><div class='add'>+   </div><div class='add'>+   cl = _SLclass_get_class (a_type);</div><div class='add'>+   sizeof_type = cl-&gt;cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+   for (i = 0; i &lt; na; i++)</div><div class='add'>+     {</div><div class='add'>+	if ((-1 == (*cl-&gt;cl_apush) (a_type, ap))</div><div class='add'>+	    || (-1 == SLang_pop_anytype (&amp;any[i])))</div><div class='add'>+	  {</div><div class='add'>+	     while (i != 0)</div><div class='add'>+	       {</div><div class='add'>+		  i--;</div><div class='add'>+		  SLang_free_anytype (any[i]);</div><div class='add'>+		  any[i] = NULL;</div><div class='add'>+	       }</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+	ap = (VOID_STAR)((char *)ap + sizeof_type);</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_pop_anytype (SLang_Any_Type **any)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+   *any = NULL;</div><div class='add'>+</div><div class='add'>+   if (NULL == (obj = (SLang_Object_Type *) SLmalloc (sizeof (SLang_Object_Type))))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop (obj))</div><div class='add'>+     {</div><div class='add'>+	SLfree ((char *) obj);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+   *any = (SLang_Any_Type *)obj;</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* This function will result in an object that is represented by the</div><div class='add'>+ * anytype object.</div><div class='add'>+ */</div><div class='add'>+int SLang_push_anytype (SLang_Any_Type *any)</div><div class='add'>+{</div><div class='add'>+   return _SLpush_slang_obj ((SLang_Object_Type *)any);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* After this call, the stack will contain an Any_Type object */</div><div class='add'>+static int anytype_push (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   SLang_Any_Type *obj;</div><div class='add'>+</div><div class='add'>+   /* Push the object onto the stack, then pop it back off into our anytype</div><div class='add'>+    * container.  That way, any memory managing associated with the type</div><div class='add'>+    * will be performed automatically.  Another way to think of it is that</div><div class='add'>+    * pushing an Any_Type onto the stack will create another copy of the</div><div class='add'>+    * object represented by it.</div><div class='add'>+    */</div><div class='add'>+   if (-1 == _SLpush_slang_obj (*(SLang_Object_Type **)ptr))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == SLang_pop_anytype (&amp;obj))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* There is no need to reference count the anytype objects since every</div><div class='add'>+    * push results in a new anytype container.</div><div class='add'>+    */</div><div class='add'>+   if (-1 == SLclass_push_ptr_obj (type, (VOID_STAR) obj))</div><div class='add'>+     {</div><div class='add'>+	SLang_free_anytype (obj);</div><div class='add'>+	return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void anytype_destroy (unsigned char type, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   SLang_Object_Type *obj;</div><div class='add'>+</div><div class='add'>+   (void) type;</div><div class='add'>+   obj = *(SLang_Object_Type **)ptr;</div><div class='add'>+   SLang_free_object (obj);</div><div class='add'>+   SLfree ((char *) obj);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_free_anytype (SLang_Any_Type *any)</div><div class='add'>+{</div><div class='add'>+   if (any != NULL)</div><div class='add'>+     anytype_destroy (SLANG_ANY_TYPE, (VOID_STAR) &amp;any);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int anytype_dereference (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+   return _SLpush_slang_obj (*(SLang_Object_Type **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+/* SLANG_INTP_TYPE */</div><div class='add'>+static int intp_push (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+   return SLclass_push_int_obj (SLANG_INT_TYPE, **(int **)ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int intp_pop (unsigned char unused, VOID_STAR ptr)</div><div class='add'>+{</div><div class='add'>+   (void) unused;</div><div class='add'>+   return SLang_pop_integer (*(int **) ptr);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static int undefined_push (unsigned char t, VOID_STAR p)</div><div class='add'>+{</div><div class='add'>+   (void) t; (void) p;</div><div class='add'>+   if (SLang_Error == 0)</div><div class='add'>+     SLang_Error = SL_VARIABLE_UNINITIALIZED;</div><div class='add'>+   return -1;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int _SLregister_types (void)</div><div class='add'>+{</div><div class='add'>+   SLang_Class_Type *cl;</div><div class='add'>+</div><div class='add'>+   /* A good compiler should optimize this code away. */</div><div class='add'>+   if ((sizeof(short) != SIZEOF_SHORT)</div><div class='add'>+       || (sizeof(int) != SIZEOF_INT)</div><div class='add'>+       || (sizeof(long) != SIZEOF_LONG)</div><div class='add'>+       || (sizeof(float) != SIZEOF_FLOAT)</div><div class='add'>+       || (sizeof(double) != SIZEOF_DOUBLE))</div><div class='add'>+     SLang_exit_error ("S-Lang Library not built properly.  Fix SIZEOF_* in config.h and recompile");</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLclass_init ())</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* Undefined Type */</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("Undefined_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+   (void) SLclass_set_push_function (cl, undefined_push);</div><div class='add'>+   (void) SLclass_set_pop_function (cl, undefined_push);</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_UNDEFINED_TYPE, sizeof (int),</div><div class='add'>+				     SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+     return -1;</div><div class='add'>+   /* Make Void_Type a synonym for Undefined_Type.  Note that this does </div><div class='add'>+    * not mean that Void_Type represents SLANG_VOID_TYPE.  Void_Type is </div><div class='add'>+    * used by array_map to indicate no array is to be created.</div><div class='add'>+    */</div><div class='add'>+   if (-1 == SLclass_create_synonym ("Void_Type", SLANG_UNDEFINED_TYPE))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLarith_register_types ())</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* SLANG_INTP_TYPE */</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("_IntegerP_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+   (void) SLclass_set_push_function (cl, intp_push);</div><div class='add'>+   (void) SLclass_set_pop_function (cl, intp_pop);</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_INTP_TYPE, sizeof (int),</div><div class='add'>+				     SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* String Type */</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("String_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+   (void) SLclass_set_destroy_function (cl, string_destroy);</div><div class='add'>+   (void) SLclass_set_push_function (cl, string_push);</div><div class='add'>+   cl-&gt;cl_foreach_open = string_foreach_open;</div><div class='add'>+   cl-&gt;cl_foreach_close = string_foreach_close;</div><div class='add'>+   cl-&gt;cl_foreach = string_foreach;</div><div class='add'>+   cl-&gt;cl_cmp = string_cmp;</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_STRING_TYPE, sizeof (char *),</div><div class='add'>+				     SLANG_CLASS_TYPE_PTR))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* ref Type */</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("Ref_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+   cl-&gt;cl_dereference = ref_dereference;</div><div class='add'>+   cl-&gt;cl_push = ref_push;</div><div class='add'>+   cl-&gt;cl_destroy = ref_destroy;</div><div class='add'>+   cl-&gt;cl_string = ref_string;</div><div class='add'>+   cl-&gt;cl_cmp = ref_cmp;</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_REF_TYPE,</div><div class='add'>+				     sizeof (SLang_Ref_Type *),</div><div class='add'>+				     SLANG_CLASS_TYPE_PTR))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* NULL Type */</div><div class='add'>+</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("Null_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+   cl-&gt;cl_push = null_push;</div><div class='add'>+   cl-&gt;cl_pop = null_pop;</div><div class='add'>+   cl-&gt;cl_foreach_open = null_foreach_open;</div><div class='add'>+   cl-&gt;cl_foreach_close = null_foreach_close;</div><div class='add'>+   cl-&gt;cl_foreach = null_foreach;</div><div class='add'>+   cl-&gt;cl_to_bool = null_to_bool;</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_NULL_TYPE, sizeof (char *),</div><div class='add'>+				     SLANG_CLASS_TYPE_SCALAR))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   /* AnyType */</div><div class='add'>+   if (NULL == (cl = SLclass_allocate_class ("Any_Type")))</div><div class='add'>+     return -1;</div><div class='add'>+   (void) SLclass_set_push_function (cl, anytype_push);</div><div class='add'>+   (void) SLclass_set_destroy_function (cl, anytype_destroy);</div><div class='add'>+   cl-&gt;cl_dereference = anytype_dereference;</div><div class='add'>+   if (-1 == SLclass_register_class (cl, SLANG_ANY_TYPE, sizeof (VOID_STAR),</div><div class='add'>+				     SLANG_CLASS_TYPE_PTR))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if (-1 == _SLang_init_bstring ())</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   if ((-1 == SLclass_add_typecast (SLANG_STRING_TYPE, SLANG_INT_TYPE, string_to_int, 0))</div><div class='add'>+       || (-1 == SLclass_add_binary_op (SLANG_STRING_TYPE, SLANG_STRING_TYPE, string_string_bin_op, string_string_bin_op_result)))</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slutty.c b/mdk-stage1/slang/slutty.c<br/>new file mode 100644<br/>index 000000000..636c1bb90<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slutty.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slutty.c</a></div><div class='hunk'>@@ -0,0 +1,596 @@</div><div class='add'>+/* slutty.c --- Unix Low level terminal (tty) functions for S-Lang */</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slinclud.h"</div><div class='add'>+</div><div class='add'>+#include &lt;signal.h&gt;</div><div class='add'>+/* sequent support thanks to Kenneth Lorber &lt;keni@oasys.dt.navy.mil&gt; */</div><div class='add'>+/* SYSV (SYSV ISC R3.2 v3.0) provided by iain.lea@erlm.siemens.de */</div><div class='add'>+</div><div class='add'>+#if defined (_AIX) &amp;&amp; !defined (_ALL_SOURCE)</div><div class='add'>+# define _ALL_SOURCE	/* so NBBY is defined in &lt;sys/types.h&gt; */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;sys/time.h&gt;</div><div class='add'>+#include &lt;sys/types.h&gt;</div><div class='add'>+</div><div class='add'>+#ifdef SYSV</div><div class='add'>+# include &lt;fcntl.h&gt;</div><div class='add'>+# ifndef CRAY</div><div class='add'>+#  include &lt;sys/termio.h&gt;</div><div class='add'>+#  include &lt;sys/stream.h&gt;</div><div class='add'>+#  include &lt;sys/ptem.h&gt;</div><div class='add'>+#  include &lt;sys/tty.h&gt;</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __BEOS__</div><div class='add'>+/* Prototype for select */</div><div class='add'>+# include &lt;net/socket.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;sys/file.h&gt;</div><div class='add'>+</div><div class='add'>+#ifndef sun</div><div class='add'>+# include &lt;sys/ioctl.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifdef __QNX__</div><div class='add'>+# include &lt;sys/select.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include &lt;sys/stat.h&gt;</div><div class='add'>+#include &lt;errno.h&gt;</div><div class='add'>+</div><div class='add'>+#if defined (_AIX) &amp;&amp; !defined (FD_SET)</div><div class='add'>+# include &lt;sys/select.h&gt;	/* for FD_ISSET, FD_SET, FD_ZERO */</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef O_RDWR</div><div class='add'>+# include &lt;fcntl.h&gt;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+</div><div class='add'>+int SLang_TT_Read_FD = -1;</div><div class='add'>+int SLang_TT_Baud_Rate;</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TERMIOS_H</div><div class='add'>+# if !defined(HAVE_TCGETATTR) || !defined(HAVE_TCSETATTR)</div><div class='add'>+#   undef HAVE_TERMIOS_H</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_TERMIOS_H</div><div class='add'>+</div><div class='add'>+# if !defined(CBREAK) &amp;&amp; defined(sun)</div><div class='add'>+#  ifndef BSD_COMP</div><div class='add'>+#   define BSD_COMP 1</div><div class='add'>+#  endif</div><div class='add'>+#  include &lt;sys/ioctl.h&gt;</div><div class='add'>+# endif</div><div class='add'>+</div><div class='add'>+typedef struct</div><div class='add'>+  {</div><div class='add'>+      struct tchars t;</div><div class='add'>+      struct ltchars lt;</div><div class='add'>+      struct sgttyb s;</div><div class='add'>+  }</div><div class='add'>+TTY_Termio_Type;</div><div class='add'>+#else</div><div class='add'>+# include &lt;termios.h&gt;</div><div class='add'>+typedef struct termios TTY_Termio_Type;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static TTY_Termio_Type Old_TTY;</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TERMIOS_H</div><div class='add'>+typedef struct</div><div class='add'>+{</div><div class='add'>+   unsigned int key;</div><div class='add'>+   unsigned int value;</div><div class='add'>+} Baud_Rate_Type;</div><div class='add'>+</div><div class='add'>+static Baud_Rate_Type Baud_Rates [] =</div><div class='add'>+{</div><div class='add'>+#ifdef B0</div><div class='add'>+     {B0, 0},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B50</div><div class='add'>+     {B50, 50},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B75</div><div class='add'>+     {B75, 75},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B110</div><div class='add'>+     {B110, 110},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B134</div><div class='add'>+     {B134, 134},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B150</div><div class='add'>+     {B150, 150},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B200</div><div class='add'>+     {B200, 200},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B300</div><div class='add'>+     {B300, 300},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B600</div><div class='add'>+     {B600, 600},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B1200</div><div class='add'>+     {B1200, 1200},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B1800</div><div class='add'>+     {B1800, 1800},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B2400</div><div class='add'>+     {B2400, 2400},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B4800</div><div class='add'>+     {B4800, 4800},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B9600</div><div class='add'>+     {B9600, 9600},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B19200</div><div class='add'>+     {B19200, 19200},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B38400</div><div class='add'>+     {B38400, 38400},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B57600</div><div class='add'>+     {B57600, 57600},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B115200</div><div class='add'>+     {B115200, 115200},</div><div class='add'>+#endif</div><div class='add'>+#ifdef B230400</div><div class='add'>+     {B230400, 230400},</div><div class='add'>+#endif</div><div class='add'>+     {0, 0}</div><div class='add'>+};</div><div class='add'>+</div><div class='add'>+static void</div><div class='add'>+set_baud_rate (TTY_Termio_Type *tty)</div><div class='add'>+{</div><div class='add'>+#ifdef HAVE_CFGETOSPEED</div><div class='add'>+   unsigned int speed;</div><div class='add'>+   Baud_Rate_Type *b, *bmax;</div><div class='add'>+</div><div class='add'>+   if (SLang_TT_Baud_Rate)</div><div class='add'>+     return;			       /* already set */</div><div class='add'>+</div><div class='add'>+   speed = (unsigned int) cfgetospeed (tty);</div><div class='add'>+</div><div class='add'>+   b = Baud_Rates;</div><div class='add'>+   bmax = b + (sizeof (Baud_Rates)/sizeof(Baud_Rates[0]));</div><div class='add'>+   while (b &lt; bmax)</div><div class='add'>+     {</div><div class='add'>+	if (b-&gt;key == speed)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_TT_Baud_Rate = b-&gt;value;</div><div class='add'>+	     return;</div><div class='add'>+	  }</div><div class='add'>+	b++;</div><div class='add'>+     }</div><div class='add'>+#else</div><div class='add'>+   (void) tty;</div><div class='add'>+#endif</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#endif				       /* HAVE_TERMIOS_H */</div><div class='add'>+</div><div class='add'>+#ifdef HAVE_TERMIOS_H</div><div class='add'>+# define GET_TERMIOS(fd, x) tcgetattr(fd, x)</div><div class='add'>+# define SET_TERMIOS(fd, x) tcsetattr(fd, TCSADRAIN, x)</div><div class='add'>+#else</div><div class='add'>+# ifdef TCGETS</div><div class='add'>+#  define GET_TERMIOS(fd, x) ioctl(fd, TCGETS, x)</div><div class='add'>+#  define SET_TERMIOS(fd, x) ioctl(fd, TCSETS, x)</div><div class='add'>+# else</div><div class='add'>+#  define X(x,m)  &amp;(((TTY_Termio_Type *)(x))-&gt;m)</div><div class='add'>+#  define GET_TERMIOS(fd, x)	\</div><div class='add'>+    ((ioctl(fd, TIOCGETC, X(x,t)) || \</div><div class='add'>+      ioctl(fd, TIOCGLTC, X(x,lt)) || \</div><div class='add'>+      ioctl(fd, TIOCGETP, X(x,s))) ? -1 : 0)</div><div class='add'>+#  define SET_TERMIOS(fd, x)	\</div><div class='add'>+    ((ioctl(fd, TIOCSETC, X(x,t)) ||\</div><div class='add'>+      ioctl(fd, TIOCSLTC, X(x,lt)) || \</div><div class='add'>+      ioctl(fd, TIOCSETP, X(x,s))) ? -1 : 0)</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static int TTY_Inited = 0;</div><div class='add'>+static int TTY_Open = 0;</div><div class='add'>+</div><div class='add'>+#ifdef ultrix   /* Ultrix gets _POSIX_VDISABLE wrong! */</div><div class='add'>+# define NULL_VALUE -1</div><div class='add'>+#else</div><div class='add'>+# ifdef _POSIX_VDISABLE</div><div class='add'>+#  define NULL_VALUE _POSIX_VDISABLE</div><div class='add'>+# else</div><div class='add'>+#  define NULL_VALUE 255</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+int SLang_init_tty (int abort_char, int no_flow_control, int opost)</div><div class='add'>+{</div><div class='add'>+   TTY_Termio_Type newtty;</div><div class='add'>+</div><div class='add'>+   SLsig_block_signals ();</div><div class='add'>+</div><div class='add'>+   if (TTY_Inited)</div><div class='add'>+     {</div><div class='add'>+	SLsig_unblock_signals ();</div><div class='add'>+	return 0;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   TTY_Open = 0;</div><div class='add'>+</div><div class='add'>+   if ((SLang_TT_Read_FD == -1)</div><div class='add'>+       || (1 != isatty (SLang_TT_Read_FD)))</div><div class='add'>+     {</div><div class='add'>+#ifdef O_RDWR</div><div class='add'>+# ifndef __BEOS__  /* I have been told that BEOS will HANG if passed /dev/tty */</div><div class='add'>+	if ((SLang_TT_Read_FD = open("/dev/tty", O_RDWR)) &gt;= 0)</div><div class='add'>+	  {</div><div class='add'>+	     TTY_Open = 1;</div><div class='add'>+	  }</div><div class='add'>+# endif</div><div class='add'>+#endif</div><div class='add'>+	if (TTY_Open == 0)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_TT_Read_FD = fileno (stderr);</div><div class='add'>+	     if (1 != isatty (SLang_TT_Read_FD))</div><div class='add'>+	       {</div><div class='add'>+		  SLang_TT_Read_FD = fileno (stdin);</div><div class='add'>+		  if (1 != isatty (SLang_TT_Read_FD))</div><div class='add'>+		    {</div><div class='add'>+		       fprintf (stderr, "Failed to open terminal.");</div><div class='add'>+		       return -1;</div><div class='add'>+		    }</div><div class='add'>+	       }</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   SLang_Abort_Char = abort_char;</div><div class='add'>+</div><div class='add'>+   /* Some systems may not permit signals to be blocked.  As a result, the</div><div class='add'>+    * return code must be checked.</div><div class='add'>+    */</div><div class='add'>+   while (-1 == GET_TERMIOS(SLang_TT_Read_FD, &amp;Old_TTY))</div><div class='add'>+     {</div><div class='add'>+	if (errno != EINTR)</div><div class='add'>+	  {</div><div class='add'>+	     SLsig_unblock_signals ();</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (-1 == GET_TERMIOS(SLang_TT_Read_FD, &amp;newtty))</div><div class='add'>+     {</div><div class='add'>+	if (errno != EINTR)</div><div class='add'>+	  {</div><div class='add'>+	     SLsig_unblock_signals ();</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_TERMIOS_H</div><div class='add'>+   newtty.s.sg_flags &amp;= ~(ECHO);</div><div class='add'>+   newtty.s.sg_flags &amp;= ~(CRMOD);</div><div class='add'>+   /*   if (Flow_Control == 0) newtty.s.sg_flags &amp;= ~IXON; */</div><div class='add'>+   newtty.t.t_eofc = 1;</div><div class='add'>+   if (abort_char == -1) SLang_Abort_Char = newtty.t.t_intrc;</div><div class='add'>+   newtty.t.t_intrc = SLang_Abort_Char;	/* ^G */</div><div class='add'>+   newtty.t.t_quitc = 255;</div><div class='add'>+   newtty.lt.t_suspc = 255;   /* to ignore ^Z */</div><div class='add'>+   newtty.lt.t_dsuspc = 255;    /* to ignore ^Y */</div><div class='add'>+   newtty.lt.t_lnextc = 255;</div><div class='add'>+   newtty.s.sg_flags |= CBREAK;		/* do I want cbreak or raw????? */</div><div class='add'>+#else</div><div class='add'>+</div><div class='add'>+   /* get baud rate */</div><div class='add'>+</div><div class='add'>+   newtty.c_iflag &amp;= ~(ECHO | INLCR | ICRNL);</div><div class='add'>+#ifdef ISTRIP</div><div class='add'>+   /* newtty.c_iflag &amp;= ~ISTRIP; */</div><div class='add'>+#endif</div><div class='add'>+   if (opost == 0) newtty.c_oflag &amp;= ~OPOST;</div><div class='add'>+</div><div class='add'>+   set_baud_rate (&amp;newtty);</div><div class='add'>+</div><div class='add'>+   if (no_flow_control) newtty.c_iflag &amp;= ~IXON; else newtty.c_iflag |= IXON;</div><div class='add'>+</div><div class='add'>+   newtty.c_cc[VEOF] = 1;</div><div class='add'>+   newtty.c_cc[VMIN] = 1;</div><div class='add'>+   newtty.c_cc[VTIME] = 0;</div><div class='add'>+   newtty.c_lflag = ISIG | NOFLSH;</div><div class='add'>+   if (abort_char == -1) SLang_Abort_Char = newtty.c_cc[VINTR];</div><div class='add'>+   newtty.c_cc[VINTR] = SLang_Abort_Char;   /* ^G */</div><div class='add'>+   newtty.c_cc[VQUIT] = NULL_VALUE;</div><div class='add'>+   newtty.c_cc[VSUSP] = NULL_VALUE;   /* to ignore ^Z */</div><div class='add'>+#ifdef VDSUSP</div><div class='add'>+   newtty.c_cc[VDSUSP] = NULL_VALUE;   /* to ignore ^Y */</div><div class='add'>+#endif</div><div class='add'>+#ifdef VLNEXT</div><div class='add'>+   newtty.c_cc[VLNEXT] = NULL_VALUE;   /* to ignore ^V ? */</div><div class='add'>+#endif</div><div class='add'>+#ifdef VSWTCH</div><div class='add'>+   newtty.c_cc[VSWTCH] = NULL_VALUE;   /* to ignore who knows what */</div><div class='add'>+#endif</div><div class='add'>+#endif /* NOT HAVE_TERMIOS_H */</div><div class='add'>+</div><div class='add'>+   while (-1 == SET_TERMIOS(SLang_TT_Read_FD, &amp;newtty))</div><div class='add'>+     {</div><div class='add'>+	if (errno != EINTR)</div><div class='add'>+	  {</div><div class='add'>+	     SLsig_unblock_signals ();</div><div class='add'>+	     return -1;</div><div class='add'>+	  }</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   TTY_Inited = 1;</div><div class='add'>+   SLsig_unblock_signals ();</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLtty_set_suspend_state (int mode)</div><div class='add'>+{</div><div class='add'>+   TTY_Termio_Type newtty;</div><div class='add'>+</div><div class='add'>+   SLsig_block_signals ();</div><div class='add'>+</div><div class='add'>+   if (TTY_Inited == 0)</div><div class='add'>+     {</div><div class='add'>+	SLsig_unblock_signals ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while ((-1 == GET_TERMIOS (SLang_TT_Read_FD, &amp;newtty))</div><div class='add'>+	  &amp;&amp; (errno == EINTR))</div><div class='add'>+     ;</div><div class='add'>+</div><div class='add'>+#ifndef HAVE_TERMIOS_H</div><div class='add'>+   /* I do not know if all systems define the t_dsuspc field */</div><div class='add'>+   if (mode == 0)</div><div class='add'>+     {</div><div class='add'>+	newtty.lt.t_suspc = 255;</div><div class='add'>+	newtty.lt.t_dsuspc = 255;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	newtty.lt.t_suspc = Old_TTY.lt.t_suspc;</div><div class='add'>+	newtty.lt.t_dsuspc = Old_TTY.lt.t_dsuspc;</div><div class='add'>+     }</div><div class='add'>+#else</div><div class='add'>+   if (mode == 0)</div><div class='add'>+     {</div><div class='add'>+	newtty.c_cc[VSUSP] = NULL_VALUE;</div><div class='add'>+#ifdef VDSUSP</div><div class='add'>+	newtty.c_cc[VDSUSP] = NULL_VALUE;</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	newtty.c_cc[VSUSP] = Old_TTY.c_cc[VSUSP];</div><div class='add'>+#ifdef VDSUSP</div><div class='add'>+	newtty.c_cc[VDSUSP] = Old_TTY.c_cc[VDSUSP];</div><div class='add'>+#endif</div><div class='add'>+     }</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+   while ((-1 == SET_TERMIOS (SLang_TT_Read_FD, &amp;newtty))</div><div class='add'>+	  &amp;&amp; (errno == EINTR))</div><div class='add'>+     ;</div><div class='add'>+</div><div class='add'>+   SLsig_unblock_signals ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void SLang_reset_tty (void)</div><div class='add'>+{</div><div class='add'>+   SLsig_block_signals ();</div><div class='add'>+</div><div class='add'>+   if (TTY_Inited == 0)</div><div class='add'>+     {</div><div class='add'>+	SLsig_unblock_signals ();</div><div class='add'>+	return;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while ((-1 == SET_TERMIOS(SLang_TT_Read_FD, &amp;Old_TTY))</div><div class='add'>+	  &amp;&amp; (errno == EINTR))</div><div class='add'>+     ;</div><div class='add'>+</div><div class='add'>+   if (TTY_Open)</div><div class='add'>+     {</div><div class='add'>+	while ((-1 == close (SLang_TT_Read_FD))</div><div class='add'>+	       &amp;&amp; (errno == EINTR))</div><div class='add'>+	  ;</div><div class='add'>+</div><div class='add'>+	TTY_Open = 0;</div><div class='add'>+	SLang_TT_Read_FD = -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   TTY_Inited = 0;</div><div class='add'>+   SLsig_unblock_signals ();</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+static void default_sigint (int sig)</div><div class='add'>+{</div><div class='add'>+   sig = errno;			       /* use parameter */</div><div class='add'>+</div><div class='add'>+   SLKeyBoard_Quit = 1;</div><div class='add'>+   if (SLang_Ignore_User_Abort == 0) SLang_Error = SL_USER_BREAK;</div><div class='add'>+   SLsignal_intr (SIGINT, default_sigint);</div><div class='add'>+   errno = sig;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLang_set_abort_signal (void (*hand)(int))</div><div class='add'>+{</div><div class='add'>+   int save_errno = errno;</div><div class='add'>+   SLSig_Fun_Type *f;</div><div class='add'>+</div><div class='add'>+   if (hand == NULL) hand = default_sigint;</div><div class='add'>+   f = SLsignal_intr (SIGINT, hand);</div><div class='add'>+</div><div class='add'>+   errno = save_errno;</div><div class='add'>+</div><div class='add'>+   if (f == (SLSig_Fun_Type *) SIG_ERR)</div><div class='add'>+     return -1;</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+#ifndef FD_SET</div><div class='add'>+#define FD_SET(fd, tthis) *(tthis) = 1 &lt;&lt; (fd)</div><div class='add'>+#define FD_ZERO(tthis)    *(tthis) = 0</div><div class='add'>+#define FD_ISSET(fd, tthis) (*(tthis) &amp; (1 &lt;&lt; fd))</div><div class='add'>+typedef int fd_set;</div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+static fd_set Read_FD_Set;</div><div class='add'>+</div><div class='add'>+/* HACK: If &gt; 0, use 1/10 seconds.  If &lt; 0, use 1/1000 seconds */</div><div class='add'>+</div><div class='add'>+int _SLsys_input_pending(int tsecs)</div><div class='add'>+{</div><div class='add'>+   struct timeval wait;</div><div class='add'>+   long usecs, secs;</div><div class='add'>+</div><div class='add'>+   if (TTY_Inited == 0) return -1;</div><div class='add'>+</div><div class='add'>+   if (tsecs &gt;= 0)</div><div class='add'>+     {</div><div class='add'>+	secs = tsecs / 10;</div><div class='add'>+	usecs = (tsecs % 10) * 100000;</div><div class='add'>+     }</div><div class='add'>+   else</div><div class='add'>+     {</div><div class='add'>+	tsecs = -tsecs;</div><div class='add'>+	secs = tsecs / 1000;</div><div class='add'>+	usecs = (tsecs % 1000) * 1000;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   wait.tv_sec = secs;</div><div class='add'>+   wait.tv_usec = usecs;</div><div class='add'>+</div><div class='add'>+   FD_ZERO(&amp;Read_FD_Set);</div><div class='add'>+   FD_SET(SLang_TT_Read_FD, &amp;Read_FD_Set);</div><div class='add'>+</div><div class='add'>+   return select(SLang_TT_Read_FD + 1, &amp;Read_FD_Set, NULL, NULL, &amp;wait);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int (*SLang_getkey_intr_hook) (void);</div><div class='add'>+</div><div class='add'>+static int handle_interrupt (void)</div><div class='add'>+{</div><div class='add'>+   if (SLang_getkey_intr_hook != NULL)</div><div class='add'>+     {</div><div class='add'>+	int save_tty_fd = SLang_TT_Read_FD;</div><div class='add'>+</div><div class='add'>+	if (-1 == (*SLang_getkey_intr_hook) ())</div><div class='add'>+	  return -1;</div><div class='add'>+</div><div class='add'>+	if (save_tty_fd != SLang_TT_Read_FD)</div><div class='add'>+	  return -1;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+unsigned int _SLsys_getkey (void)</div><div class='add'>+{</div><div class='add'>+   unsigned char c;</div><div class='add'>+</div><div class='add'>+   if (TTY_Inited == 0)</div><div class='add'>+     {</div><div class='add'>+	int ic = fgetc (stdin);</div><div class='add'>+	if (ic == EOF) return SLANG_GETKEY_ERROR;</div><div class='add'>+	return (unsigned int) ic;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	int ret;</div><div class='add'>+</div><div class='add'>+	if (SLKeyBoard_Quit)</div><div class='add'>+	  return SLang_Abort_Char;</div><div class='add'>+</div><div class='add'>+	if (0 == (ret = _SLsys_input_pending (100)))</div><div class='add'>+	  continue;</div><div class='add'>+</div><div class='add'>+	if (ret != -1)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	if (SLKeyBoard_Quit)</div><div class='add'>+	  return SLang_Abort_Char;</div><div class='add'>+</div><div class='add'>+	if (errno == EINTR)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == handle_interrupt ())</div><div class='add'>+	       return SLANG_GETKEY_ERROR;</div><div class='add'>+</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	break;			       /* let read handle it */</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   while (1)</div><div class='add'>+     {</div><div class='add'>+	int status = read(SLang_TT_Read_FD, (char *) &amp;c, 1);</div><div class='add'>+</div><div class='add'>+	if (status &gt; 0)</div><div class='add'>+	  break;</div><div class='add'>+</div><div class='add'>+	if (status == 0)</div><div class='add'>+	  {</div><div class='add'>+	     /* We are at the end of a file.  Let application handle it. */</div><div class='add'>+	     return SLANG_GETKEY_ERROR;</div><div class='add'>+	  }</div><div class='add'>+</div><div class='add'>+	if (errno == EINTR)</div><div class='add'>+	  {</div><div class='add'>+	     if (-1 == handle_interrupt ())</div><div class='add'>+	       return SLANG_GETKEY_ERROR;</div><div class='add'>+</div><div class='add'>+	     if (SLKeyBoard_Quit)</div><div class='add'>+	       return SLang_Abort_Char;</div><div class='add'>+</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+#ifdef EAGAIN</div><div class='add'>+	if (errno == EAGAIN)</div><div class='add'>+	  {</div><div class='add'>+	     sleep (1);</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+#ifdef EWOULDBLOCK</div><div class='add'>+	if (errno == EWOULDBLOCK)</div><div class='add'>+	  {</div><div class='add'>+	     sleep (1);</div><div class='add'>+	     continue;</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+#ifdef EIO</div><div class='add'>+	if (errno == EIO)</div><div class='add'>+	  {</div><div class='add'>+	     SLang_exit_error ("_SLsys_getkey: EIO error.");</div><div class='add'>+	  }</div><div class='add'>+#endif</div><div class='add'>+	return SLANG_GETKEY_ERROR;</div><div class='add'>+     }</div><div class='add'>+</div><div class='add'>+   return((unsigned int) c);</div><div class='add'>+}</div><div class='add'>+</div><div class='head'>diff --git a/mdk-stage1/slang/slxstrng.c b/mdk-stage1/slang/slxstrng.c<br/>new file mode 100644<br/>index 000000000..3f8a4dffa<br/>--- /dev/null<br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/slang/slxstrng.c?h=drakx-installer-images-2.88&amp;id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/slang/slxstrng.c</a></div><div class='hunk'>@@ -0,0 +1,43 @@</div><div class='add'>+/* Copyright (c) 1992, 1999, 2001 John E. Davis</div><div class='add'>+ * This file is part of the S-Lang library.</div><div class='add'>+ *</div><div class='add'>+ * You may distribute under the terms of either the GNU General Public</div><div class='add'>+ * License or the Perl Artistic License.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+/* These routines are simple and inefficient.  They were designed to work on</div><div class='add'>+ * SunOS when using Electric Fence.</div><div class='add'>+ */</div><div class='add'>+</div><div class='add'>+#include "slang.h"</div><div class='add'>+#include "_slang.h"</div><div class='add'>+char *SLstrcpy(register char *aa, register char *b)</div><div class='add'>+{</div><div class='add'>+   char *a = aa;</div><div class='add'>+   while ((*a++ = *b++) != 0);</div><div class='add'>+   return aa;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+int SLstrcmp(register char *a, register char *b)</div><div class='add'>+{</div><div class='add'>+   while (*a &amp;&amp; (*a == *b))</div><div class='add'>+     {</div><div class='add'>+	a++;</div><div class='add'>+	b++;</div><div class='add'>+     }</div><div class='add'>+   if (*a) return((unsigned char) *a - (unsigned char) *b);</div><div class='add'>+   else if (*b) return ((unsigned char) *a - (unsigned char) *b);</div><div class='add'>+   else return 0;</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+char *SLstrncpy(char *a, register char *b,register  int n)</div><div class='add'>+{</div><div class='add'>+   register char *aa = a;</div><div class='add'>+   while ((n &gt; 0) &amp;&amp; *b)</div><div class='add'>+     {</div><div class='add'>+	*aa++ = *b++;</div><div class='add'>+	n--;</div><div class='add'>+     }</div><div class='add'>+   while (n-- &gt; 0) *aa++ = 0;</div><div class='add'>+   return (a);</div><div class='add'>+}</div></td></tr></table></div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.1</a> (<a href='https://git-scm.com/'>git 2.21.0</a>) at 2025-03-04 20:31:00 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>