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&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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>tree</a><a class='active' href='/software/drakx/commit/?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>commit</a><a href='/software/drakx/diff/?h=drakx-installer-images-2.88&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 <gc@mandriva.com></td><td class='right'>2001-05-14 21:47:42 +0000</td></tr> <tr><th>committer</th><td>Guillaume Cottenceau <gc@mandriva.com></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&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&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&id=12cf594c688f3bc3e0b26d35305d5d6db7036fc4'>12cf594c688f3bc3e0b26d35305d5d6db7036fc4</a> (<a href='/software/drakx/diff/?h=drakx-installer-images-2.88&id=98a18b797c63ea9baab31768ed720ad32c0004e8&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&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&id=12cf594c688f3bc3e0b26d35305d5d6db7036fc4'>mdk-stage1/Makefile</a><br/>+++ b/<a href='/software/drakx/tree/mdk-stage1/Makefile?h=drakx-installer-images-2.88&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&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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt-frontend.c</a></div><div class='hunk'>@@ -33,7 +33,7 @@</div><div class='ctx'> #include <sys/time.h></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&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 $< -o $@</div><div class='add'>+</div><div class='add'>+$(OBJS-DIET): %-DIET.o: %.c</div><div class='add'>+ gcc $(FLAGS) $(DIETLIBC_INCLUDES) $(INCS) -c $< -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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/button.c</a></div><div class='hunk'>@@ -0,0 +1,190 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></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->data = bu;</div><div class='add'>+</div><div class='add'>+ bu->text = strdup(text);</div><div class='add'>+ bu->compact = compact;</div><div class='add'>+ co->ops = &buttonOps;</div><div class='add'>+</div><div class='add'>+ if (bu->compact) {</div><div class='add'>+ co->height = 1;</div><div class='add'>+ co->width = strlen(text) + 3;</div><div class='add'>+ } else {</div><div class='add'>+ co->height = 4;</div><div class='add'>+ co->width = strlen(text) + 5;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ co->top = row;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+ co->isMapped = 0;</div><div class='add'>+</div><div class='add'>+ newtGotorc(co->top, co->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->data;</div><div class='add'>+</div><div class='add'>+ free(bu->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->top = newTop;</div><div class='add'>+ co->left = newLeft;</div><div class='add'>+</div><div class='add'>+ newtGotorc(co->top, co->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->data;</div><div class='add'>+</div><div class='add'>+ if (!co->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->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->top+ pushed, co->left + 1 + pushed);</div><div class='add'>+ SLsmg_write_char('<');</div><div class='add'>+ SLsmg_write_string(bu->text);</div><div class='add'>+ SLsmg_write_char('>');</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->left + 1, co->top + 1, co->width - 1, 3, 0);</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_WINDOW);</div><div class='add'>+ newtClearBox(co->left, co->top, co->width, 1);</div><div class='add'>+ newtClearBox(co->left, co->top, 1, co->height);</div><div class='add'>+ } else {</div><div class='add'>+ newtDrawBox(co->left, co->top, co->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->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->top + 1 + pushed, co->left + 1 + pushed);</div><div class='add'>+ SLsmg_write_char(' ');</div><div class='add'>+ SLsmg_write_string(bu->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->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->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 &&</div><div class='add'>+ co->top <= ev.u.mouse.y &&</div><div class='add'>+ co->top + co->height - !bu->compact > ev.u.mouse.y &&</div><div class='add'>+ co->left <= ev.u.mouse.x &&</div><div class='add'>+ co->left + co->width - !bu->compact > ev.u.mouse.x) {</div><div class='add'>+ if (!bu->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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/buttonbar.c</a></div><div class='hunk'>@@ -0,0 +1,46 @@</div><div class='add'>+#include <stdarg.h></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 < 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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/checkbox.c</a></div><div class='hunk'>@@ -0,0 +1,290 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></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->data;</div><div class='add'>+ rb->type = RADIO;</div><div class='add'>+</div><div class='add'>+ rb->prevButton = prevButton;</div><div class='add'>+</div><div class='add'>+ for (curr = co; curr; curr = rb->prevButton) {</div><div class='add'>+ rb = curr->data;</div><div class='add'>+ rb->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->data;</div><div class='add'>+</div><div class='add'>+ setMember = rb->lastButton;</div><div class='add'>+ rb = setMember->data;</div><div class='add'>+</div><div class='add'>+ while (rb && rb->value != '*') {</div><div class='add'>+ setMember = rb->prevButton;</div><div class='add'>+ if (!setMember)</div><div class='add'>+ return NULL;</div><div class='add'>+ rb = setMember->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->data;</div><div class='add'>+</div><div class='add'>+ return cb->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->data;</div><div class='add'>+</div><div class='add'>+ *cb->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->data = cb;</div><div class='add'>+ cb->flags = 0;</div><div class='add'>+ if (result)</div><div class='add'>+ cb->result = result;</div><div class='add'>+ else</div><div class='add'>+ cb->result = &cb->value;</div><div class='add'>+</div><div class='add'>+ cb->text = strdup(text);</div><div class='add'>+ cb->seq = strdup(seq);</div><div class='add'>+ cb->type = CHECK;</div><div class='add'>+ cb->hasFocus = 0;</div><div class='add'>+ cb->inactive = COLORSET_CHECKBOX;</div><div class='add'>+ cb->active = COLORSET_ACTCHECKBOX;</div><div class='add'>+ defValue ? (*cb->result = defValue) : (*cb->result = cb->seq[0]);</div><div class='add'>+</div><div class='add'>+ co->ops = &cbOps;</div><div class='add'>+</div><div class='add'>+ co->callback = NULL;</div><div class='add'>+ co->height = 1;</div><div class='add'>+ co->width = strlen(text) + 4;</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->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->data;</div><div class='add'>+ int row, col;</div><div class='add'>+</div><div class='add'>+ cb->flags = newtSetFlags(cb->flags, flags, sense);</div><div class='add'>+</div><div class='add'>+ if (!(cb->flags & NEWT_FLAG_DISABLED))</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+ else</div><div class='add'>+ co->takesFocus = 0;</div><div class='add'>+</div><div class='add'>+ newtGetrc(&row, &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->data;</div><div class='add'>+</div><div class='add'>+ if (c->top == -1 || !c->isMapped) return;</div><div class='add'>+</div><div class='add'>+ if (cb->flags & NEWT_FLAG_DISABLED) {</div><div class='add'>+ cb->inactive = NEWT_COLORSET_DISENTRY;</div><div class='add'>+ cb->active = NEWT_COLORSET_DISENTRY;</div><div class='add'>+ } else {</div><div class='add'>+ cb->inactive = COLORSET_CHECKBOX;</div><div class='add'>+ cb->active = COLORSET_ACTCHECKBOX;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(cb->inactive);</div><div class='add'>+</div><div class='add'>+ newtGotorc(c->top, c->left);</div><div class='add'>+</div><div class='add'>+ switch (cb->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->text);</div><div class='add'>+</div><div class='add'>+ if (cb->hasFocus)</div><div class='add'>+ SLsmg_set_color(cb->active);</div><div class='add'>+</div><div class='add'>+ newtGotorc(c->top, c->left + 1);</div><div class='add'>+ SLsmg_write_char(*cb->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->data;</div><div class='add'>+</div><div class='add'>+ free(cb->text);</div><div class='add'>+ free(cb->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->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->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->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->type == RADIO) {</div><div class='add'>+ makeActive(co);</div><div class='add'>+ } else if (cb->type == CHECK) {</div><div class='add'>+ cur = strchr(cb->seq, *cb->result);</div><div class='add'>+ if (!cur)</div><div class='add'>+ *cb->result = *cb->seq;</div><div class='add'>+ else {</div><div class='add'>+ cur++;</div><div class='add'>+ if (! *cur)</div><div class='add'>+ *cb->result = *cb->seq;</div><div class='add'>+ else</div><div class='add'>+ *cb->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->callback)</div><div class='add'>+ co->callback(co, co->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->type == RADIO) {</div><div class='add'>+ makeActive(co);</div><div class='add'>+ } else if (cb->type == CHECK) {</div><div class='add'>+ cur = strchr(cb->seq, *cb->result);</div><div class='add'>+ if (!cur)</div><div class='add'>+ *cb->result = *cb->seq;</div><div class='add'>+ else {</div><div class='add'>+ cur++;</div><div class='add'>+ if (! *cur)</div><div class='add'>+ *cb->result = *cb->seq;</div><div class='add'>+ else</div><div class='add'>+ *cb->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->callback)</div><div class='add'>+ co->callback(co, co->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->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->lastButton;</div><div class='add'>+ rb = curr->data;</div><div class='add'>+ while (curr && rb->value == rb->seq[0]) {</div><div class='add'>+ curr = rb->prevButton;</div><div class='add'>+ if (curr) rb = curr->data;</div><div class='add'>+ }</div><div class='add'>+ if (curr) {</div><div class='add'>+ rb->value = rb->seq[0];</div><div class='add'>+ cbDraw(curr);</div><div class='add'>+ }</div><div class='add'>+ cb->value = cb->seq[1];</div><div class='add'>+ cbDraw(co);</div><div class='add'>+</div><div class='add'>+ if (co->callback)</div><div class='add'>+ co->callback(co, co->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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/checkboxtree.c</a></div><div class='hunk'>@@ -0,0 +1,714 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></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->branch && item->selected == what) || (what == COUNT_EXPOSED))</div><div class='add'>+ count++;</div><div class='add'>+ if (item->branch || (what == COUNT_EXPOSED && item->selected))</div><div class='add'>+ count += countItems(item->branch, what);</div><div class='add'>+ item = item->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->flatList[ct->flatCount++] = item;</div><div class='add'>+ if (item->branch && item->selected) doBuildFlatList(ct, item->branch);</div><div class='add'>+ item = item->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->data;</div><div class='add'>+</div><div class='add'>+ if (ct->flatList) free(ct->flatList);</div><div class='add'>+ ct->flatCount = countItems(ct->itemlist, COUNT_EXPOSED);</div><div class='add'>+</div><div class='add'>+ ct->flatList = malloc(sizeof(*ct->flatList) * (ct->flatCount+1));</div><div class='add'>+ ct->flatCount = 0;</div><div class='add'>+ doBuildFlatList(ct, ct->itemlist);</div><div class='add'>+ ct->flatList[ct->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->data == data) {</div><div class='add'>+ if (path) path[items->depth] = where;</div><div class='add'>+ if (len) *len = items->depth + 1;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (items->branch && doFindItemPath(items->branch, data, path, len)) {</div><div class='add'>+ if (path) path[items->depth] = where;</div><div class='add'>+ return 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ items = items->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->data;</div><div class='add'>+</div><div class='add'>+ if (!doFindItemPath(ct->itemlist, data, NULL, &len)) return NULL;</div><div class='add'>+</div><div class='add'>+ path = malloc(sizeof(*path) * (len + 1));</div><div class='add'>+ doFindItemPath(ct->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->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->itemlist) {</div><div class='add'>+ if (numIndexes > 1) return -1;</div><div class='add'>+</div><div class='add'>+ ct->itemlist = malloc(sizeof(*ct->itemlist));</div><div class='add'>+ item = ct->itemlist;</div><div class='add'>+ item->prev = NULL;</div><div class='add'>+ item->next = NULL;</div><div class='add'>+ } else {</div><div class='add'>+ curList = ct->itemlist;</div><div class='add'>+ listPtr = &ct->itemlist;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ index = indexes[i];</div><div class='add'>+ while (i < 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 && item) </div><div class='add'>+ item = item->next, index--;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ i++;</div><div class='add'>+ if (i < numIndexes) {</div><div class='add'>+ curList = item->branch;</div><div class='add'>+ listPtr = &item->branch;</div><div class='add'>+ if (!curList && (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->prev));</div><div class='add'>+ item->next = item->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->next) item = item->next;</div><div class='add'>+ item->next = malloc(sizeof(*curList->prev));</div><div class='add'>+ item->next->prev = item;</div><div class='add'>+ item = item->next;</div><div class='add'>+ item->next = NULL;</div><div class='add'>+ } else { </div><div class='add'>+ newNode = malloc(sizeof(*newNode));</div><div class='add'>+ newNode->prev = item->prev;</div><div class='add'>+ newNode->next = item;</div><div class='add'>+</div><div class='add'>+ if (item->prev) item->prev->next = newNode;</div><div class='add'>+ item->prev = newNode;</div><div class='add'>+ item = newNode;</div><div class='add'>+ if (!item->prev) *listPtr = item;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ item->text = strdup(text);</div><div class='add'>+ item->data = data;</div><div class='add'>+ if (flags & NEWT_FLAG_SELECTED) {</div><div class='add'>+ item->selected = 1;</div><div class='add'>+ } else {</div><div class='add'>+ item->selected = 0;</div><div class='add'>+ }</div><div class='add'>+ item->flags = flags;</div><div class='add'>+ item->branch = NULL;</div><div class='add'>+ item->depth = numIndexes - 1;</div><div class='add'>+</div><div class='add'>+ i = 4 + (3 * item->depth);</div><div class='add'>+</div><div class='add'>+ if ((strlen(text) + i + ct->pad) > co->width) {</div><div class='add'>+ co->width = strlen(text) + i + ct->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->data == data) return items;</div><div class='add'>+ if (items->branch) {</div><div class='add'>+ i = findItem(items->branch, data);</div><div class='add'>+ if (i) return i;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ items = items->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->selected==seqindex : items->selected) && !items->branch)</div><div class='add'>+ list[(*num)++] = (void *) items->data;</div><div class='add'>+ if (items->branch)</div><div class='add'>+ listSelected(items->branch, num, list, seqindex);</div><div class='add'>+ items = items->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->data;</div><div class='add'>+ </div><div class='add'>+ if (seqnum) {</div><div class='add'>+ while( ct->seq[seqindex] && ( ct->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->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->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->callback = NULL;</div><div class='add'>+ co->data = ct;</div><div class='add'>+ co->ops = &ctOps;</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+ co->height = height;</div><div class='add'>+ co->width = 0;</div><div class='add'>+ co->isMapped = 0;</div><div class='add'>+ ct->itemlist = NULL;</div><div class='add'>+ ct->firstItem = NULL;</div><div class='add'>+ ct->currItem = NULL;</div><div class='add'>+ ct->flatList = NULL;</div><div class='add'>+ if (seq)</div><div class='add'>+ ct->seq = strdup(seq);</div><div class='add'>+ else</div><div class='add'>+ ct->seq = strdup(" *");</div><div class='add'>+ if (flags & NEWT_FLAG_SCROLL) {</div><div class='add'>+ ct->sb = newtVerticalScrollbar(left, top, height,</div><div class='add'>+ COLORSET_LISTBOX, COLORSET_ACTLISTBOX);</div><div class='add'>+ ct->pad = 2;</div><div class='add'>+ } else {</div><div class='add'>+ ct->sb = NULL;</div><div class='add'>+ ct->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->data;</div><div class='add'>+</div><div class='add'>+ co->isMapped = isMapped;</div><div class='add'>+ if (ct->sb)</div><div class='add'>+ ct->sb->ops->mapped(ct->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->data;</div><div class='add'>+</div><div class='add'>+ co->top = newTop;</div><div class='add'>+ co->left = newLeft;</div><div class='add'>+</div><div class='add'>+ if (ct->sb)</div><div class='add'>+ ct->sb->ops->place(ct->sb, co->left + co->width - 1, co->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->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->selected = 0;</div><div class='add'>+ break;</div><div class='add'>+ case NEWT_FLAGS_SET:</div><div class='add'>+ item->selected = 1;</div><div class='add'>+ break;</div><div class='add'>+ case NEWT_FLAGS_TOGGLE:</div><div class='add'>+ if (item->branch)</div><div class='add'>+ item->selected = !item->selected;</div><div class='add'>+ else {</div><div class='add'>+ item->selected++;</div><div class='add'>+ if (item->selected==strlen(ct->seq))</div><div class='add'>+ item->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->branch) {</div><div class='add'>+ currItem = *ct->currItem;</div><div class='add'>+ firstItem = *ct->firstItem;</div><div class='add'>+</div><div class='add'>+ buildFlatList(co);</div><div class='add'>+</div><div class='add'>+ ct->currItem = ct->flatList;</div><div class='add'>+ while (*ct->currItem != currItem) ct->currItem++;</div><div class='add'>+</div><div class='add'>+ ct->firstItem = ct->flatList;</div><div class='add'>+ if (ct->flatCount > co->height) {</div><div class='add'>+ struct items ** last = ct->flatList + ct->flatCount - co->height;</div><div class='add'>+ while (*ct->firstItem != firstItem && ct->firstItem != last)</div><div class='add'>+ ct->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->next) {</div><div class='add'>+ if (!item->branch)</div><div class='add'>+ item->selected = selected;</div><div class='add'>+ else</div><div class='add'>+ ctSetItems(item->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->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->isMapped) return ;</div><div class='add'>+</div><div class='add'>+ if (!ct->firstItem) {</div><div class='add'>+ buildFlatList(co);</div><div class='add'>+ ct->firstItem = ct->currItem = ct->flatList;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ item = ct->firstItem;</div><div class='add'>+ </div><div class='add'>+ i = 0;</div><div class='add'>+ while (*item && i < co->height) {</div><div class='add'>+ newtGotorc(co->top + i, co->left);</div><div class='add'>+ if (*item == *ct->currItem) {</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX);</div><div class='add'>+ currRow = co->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 < (*item)->depth; j++)</div><div class='add'>+ SLsmg_write_string(" ");</div><div class='add'>+</div><div class='add'>+ if ((*item)->branch) {</div><div class='add'>+ if ((*item)->selected) </div><div class='add'>+ SLsmg_write_string("<-> ");</div><div class='add'>+ else</div><div class='add'>+ SLsmg_write_string("<+> ");</div><div class='add'>+ } else {</div><div class='add'>+ char tmp[5];</div><div class='add'>+ snprintf(tmp,5,"[%c] ",ct->seq[(*item)->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)->text, co->width - 4 - </div><div class='add'>+ (3 * (*item)->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 < co->height) {</div><div class='add'>+ spaces = alloca(co->width);</div><div class='add'>+ memset(spaces, ' ', co->width);</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_LISTBOX);</div><div class='add'>+ }</div><div class='add'>+ while (i < co->height) {</div><div class='add'>+ newtGotorc(co->top + i, co->left);</div><div class='add'>+ SLsmg_write_nstring(spaces, co->width);</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if(ct->sb) {</div><div class='add'>+ newtScrollbarSet(ct->sb, ct->currItem - ct->flatList, </div><div class='add'>+ ct->flatCount - 1);</div><div class='add'>+ ct->sb->ops->draw(ct->sb);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ newtGotorc(currRow, co->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->data;</div><div class='add'>+ struct items * item, * nextitem;</div><div class='add'>+</div><div class='add'>+ nextitem = item = ct->itemlist;</div><div class='add'>+</div><div class='add'>+ while (item != NULL) {</div><div class='add'>+ nextitem = item->next;</div><div class='add'>+ free(item->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->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->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 && key != ' ') {</div><div class='add'>+ for (selnum = 0; ct->seq[selnum]; selnum++)</div><div class='add'>+ if (key == ct->seq[selnum])</div><div class='add'>+ break;</div><div class='add'>+ if (!ct->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->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->currItem, NEWT_FLAGS_TOGGLE);</div><div class='add'>+ er.result = ER_SWALLOWED;</div><div class='add'>+ if (!(*ct->currItem)->branch || (*ct->currItem)->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->currItem)->branch) {</div><div class='add'>+ ctSetItems((*ct->currItem)->branch, selnum);</div><div class='add'>+ if (!(*ct->currItem)->selected)</div><div class='add'>+ key = NEWT_KEY_DOWN;</div><div class='add'>+ } else {</div><div class='add'>+ (*ct->currItem)->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->callback) co->callback(co, co->callbackData);</div><div class='add'>+ return er;</div><div class='add'>+ case NEWT_KEY_HOME:</div><div class='add'>+ ct->currItem = ct->flatList;</div><div class='add'>+ ct->firstItem = ct->flatList;</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->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->currItem = ct->flatList + ct->flatCount - 1;</div><div class='add'>+ if (ct->flatCount <= co->height)</div><div class='add'>+ ct->firstItem = ct->flatList;</div><div class='add'>+ else</div><div class='add'>+ ct->firstItem = ct->flatList + ct->flatCount - co->height;</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->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->callback) co->callback(co, co->callbackData);</div><div class='add'>+ if (strlen(ct->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->currItem - ct->flatList + 1) < ct->flatCount) {</div><div class='add'>+ ct->currItem++;</div><div class='add'>+</div><div class='add'>+ if (ct->currItem - ct->firstItem >= co->height) </div><div class='add'>+ ct->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->callback) co->callback(co, co->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->currItem != ct->flatList) {</div><div class='add'>+ ct->currItem--;</div><div class='add'>+</div><div class='add'>+ if (ct->currItem < ct->firstItem)</div><div class='add'>+ ct->firstItem = ct->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->callback) co->callback(co, co->callbackData);</div><div class='add'>+ return er;</div><div class='add'>+ case NEWT_KEY_PGUP:</div><div class='add'>+ if (ct->firstItem - co->height < ct->flatList) {</div><div class='add'>+ ct->firstItem = ct->currItem = ct->flatList;</div><div class='add'>+ } else {</div><div class='add'>+ ct->currItem -= co->height;</div><div class='add'>+ ct->firstItem -= co->height;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->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->flatList + ct->flatCount - 1;</div><div class='add'>+ lastItem = ct->firstItem + co->height - 1;</div><div class='add'>+</div><div class='add'>+ if (lastItem + co->height > listEnd) {</div><div class='add'>+ ct->firstItem = listEnd - co->height + 1;</div><div class='add'>+ ct->currItem = listEnd;</div><div class='add'>+ } else {</div><div class='add'>+ ct->currItem += co->height;</div><div class='add'>+ ct->firstItem += co->height;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ctDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->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->data;</div><div class='add'>+</div><div class='add'>+ if (!ct->currItem) return NULL;</div><div class='add'>+ return (*ct->currItem)->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->data;</div><div class='add'>+ item = findItem(ct->itemlist, data);</div><div class='add'>+ if (!item) return;</div><div class='add'>+</div><div class='add'>+ free(item->text);</div><div class='add'>+ item->text = strdup(text);</div><div class='add'>+</div><div class='add'>+ i = 4 + (3 * item->depth);</div><div class='add'>+</div><div class='add'>+ if ((strlen(text) + i + ct->pad) > co->width) {</div><div class='add'>+ co->width = strlen(text) + i + ct->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->data;</div><div class='add'>+ item = findItem(ct->itemlist, data);</div><div class='add'>+ if (!item) return -1;</div><div class='add'>+ if (item->branch)</div><div class='add'>+ return item->selected ? NEWT_CHECKBOXTREE_EXPANDED : NEWT_CHECKBOXTREE_COLLAPSED;</div><div class='add'>+ else</div><div class='add'>+ return ct->seq[item->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->data;</div><div class='add'>+ item = findItem(ct->itemlist, data);</div><div class='add'>+ if (!item || item->branch) return;</div><div class='add'>+</div><div class='add'>+ for(i = 0; ct->seq[i]; i++)</div><div class='add'>+ if (value == ct->seq[i])</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ if (!ct->seq[i]) return;</div><div class='add'>+ item->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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/entry.c</a></div><div class='hunk'>@@ -0,0 +1,376 @@</div><div class='add'>+#include <ctype.h></div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></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->data;</div><div class='add'>+</div><div class='add'>+ if ((strlen(value) + 1) > (unsigned int)en->bufAlloced) {</div><div class='add'>+ free(en->buf);</div><div class='add'>+ en->bufAlloced = strlen(value) + 1;</div><div class='add'>+ en->buf = malloc(en->bufAlloced);</div><div class='add'>+ if (en->resultPtr) *en->resultPtr = en->buf;</div><div class='add'>+ }</div><div class='add'>+ memset(en->buf, 0, en->bufAlloced); /* clear the buffer */</div><div class='add'>+ strcpy(en->buf, value);</div><div class='add'>+ en->bufUsed = strlen(value);</div><div class='add'>+ en->firstChar = 0;</div><div class='add'>+ if (cursorAtEnd)</div><div class='add'>+ en->cursorPosition = en->bufUsed;</div><div class='add'>+ else</div><div class='add'>+ en->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->data = en;</div><div class='add'>+</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->height = 1;</div><div class='add'>+ co->width = width;</div><div class='add'>+ co->isMapped = 0;</div><div class='add'>+ co->callback = NULL;</div><div class='add'>+</div><div class='add'>+ co->ops = &entryOps;</div><div class='add'>+</div><div class='add'>+ en->flags = flags;</div><div class='add'>+ en->cursorPosition = 0;</div><div class='add'>+ en->firstChar = 0;</div><div class='add'>+ en->bufUsed = 0;</div><div class='add'>+ en->bufAlloced = width + 1;</div><div class='add'>+ en->filter = NULL;</div><div class='add'>+</div><div class='add'>+ if (!(en->flags & NEWT_FLAG_DISABLED))</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+ else</div><div class='add'>+ co->takesFocus = 0;</div><div class='add'>+</div><div class='add'>+ if (initialValue && strlen(initialValue) > (unsigned int)width) {</div><div class='add'>+ en->bufAlloced = strlen(initialValue) + 1;</div><div class='add'>+ }</div><div class='add'>+ en->buf = malloc(en->bufAlloced);</div><div class='add'>+ en->resultPtr = resultPtr;</div><div class='add'>+ if (en->resultPtr) *en->resultPtr = en->buf;</div><div class='add'>+</div><div class='add'>+ memset(en->buf, 0, en->bufAlloced);</div><div class='add'>+ if (initialValue) {</div><div class='add'>+ strcpy(en->buf, initialValue);</div><div class='add'>+ en->bufUsed = strlen(initialValue);</div><div class='add'>+ en->cursorPosition = en->bufUsed;</div><div class='add'>+ } else {</div><div class='add'>+ *en->buf = '\0';</div><div class='add'>+ en->bufUsed = 0;</div><div class='add'>+ en->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->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->isMapped) return;</div><div class='add'>+</div><div class='add'>+ if (en->flags & 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->flags & NEWT_FLAG_HIDDEN) {</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+ for (i = 0; i < co->width; i++)</div><div class='add'>+ SLsmg_write_char('_');</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+</div><div class='add'>+ if (en->cursorPosition < en->firstChar) {</div><div class='add'>+ /* scroll to the left */</div><div class='add'>+ en->firstChar = en->cursorPosition;</div><div class='add'>+ } else if ((en->firstChar + co->width) <= en->cursorPosition) {</div><div class='add'>+ /* scroll to the right */</div><div class='add'>+ en->firstChar = en->cursorPosition - co->width + 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ chptr = en->buf + en->firstChar;</div><div class='add'>+</div><div class='add'>+ if (en->flags & 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 <= co->width) {</div><div class='add'>+ i = len;</div><div class='add'>+ SLsmg_write_string(chptr);</div><div class='add'>+ while (i < co->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->width);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (en->flags & NEWT_FLAG_HIDDEN)</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+ else</div><div class='add'>+ newtGotorc(co->top, co->left + (en->cursorPosition - en->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->data;</div><div class='add'>+ int row, col;</div><div class='add'>+</div><div class='add'>+ en->flags = newtSetFlags(en->flags, flags, sense);</div><div class='add'>+</div><div class='add'>+ if (!(en->flags & NEWT_FLAG_DISABLED))</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+ else</div><div class='add'>+ co->takesFocus = 0;</div><div class='add'>+</div><div class='add'>+ newtGetrc(&row, &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->data;</div><div class='add'>+</div><div class='add'>+ free(en->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->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->flags & NEWT_FLAG_HIDDEN)</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+ else</div><div class='add'>+ newtGotorc(co->top, co->left +</div><div class='add'>+ (en->cursorPosition - en->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->callback)</div><div class='add'>+ co->callback(co, co->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->filter)</div><div class='add'>+ ch = en->filter(co, en->filterData, ch, en->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) &&</div><div class='add'>+ (en->flags ^ NEWT_FLAG_HIDDEN)) {</div><div class='add'>+ if (strlen(en->buf) >= ev.u.mouse.x - co->left) {</div><div class='add'>+ en->cursorPosition = ev.u.mouse.x - co->left;</div><div class='add'>+ newtGotorc(co->top,</div><div class='add'>+ co->left +(en->cursorPosition - en->firstChar));</div><div class='add'>+ } else {</div><div class='add'>+ en->cursorPosition = strlen(en->buf);</div><div class='add'>+ newtGotorc(co->top,</div><div class='add'>+ co->left +(en->cursorPosition - en->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->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->flags & 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->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->cursorPosition = en->bufUsed;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case '\013': /* ^K */</div><div class='add'>+ en->bufUsed = en->cursorPosition;</div><div class='add'>+ memset(en->buf + en->bufUsed, 0, en->bufAlloced - en->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->cursorPosition)</div><div class='add'>+ en->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->buf + en->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->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->cursorPosition) {</div><div class='add'>+ /* if this isn't true, there's nothing to erase */</div><div class='add'>+ chptr = en->buf + en->cursorPosition;</div><div class='add'>+ en->bufUsed--;</div><div class='add'>+ en->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->cursorPosition < en->bufUsed)</div><div class='add'>+ en->cursorPosition++;</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ default:</div><div class='add'>+ if ((key >= 0x20 && key <= 0x7e) || (key >= 0xa0 && key <= 0xff)) {</div><div class='add'>+ if (!(en->flags & NEWT_FLAG_SCROLL) && en->bufUsed >= co->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->bufUsed + 1) == en->bufAlloced) {</div><div class='add'>+ en->bufAlloced += 20;</div><div class='add'>+ en->buf = realloc(en->buf, en->bufAlloced);</div><div class='add'>+ if (en->resultPtr) *en->resultPtr = en->buf;</div><div class='add'>+ memset(en->buf + en->bufUsed + 1, 0, 20);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (en->cursorPosition == en->bufUsed) {</div><div class='add'>+ en->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->buf + en->bufUsed) - 1;</div><div class='add'>+ if ((en->bufUsed + 1) == en->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->bufUsed++;</div><div class='add'>+</div><div class='add'>+ insPoint = en->buf + en->cursorPosition;</div><div class='add'>+</div><div class='add'>+ while (chptr >= 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->buf[en->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->data;</div><div class='add'>+</div><div class='add'>+ return en->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->data;</div><div class='add'>+ en->filter = filter;</div><div class='add'>+ en->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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/form.c</a></div><div class='hunk'>@@ -0,0 +1,712 @@</div><div class='add'>+#include <unistd.h></div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdarg.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <sys/time.h></div><div class='add'>+#include <sys/types.h></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->data;</div><div class='add'>+ struct element * el = form->elements + compNum;</div><div class='add'>+</div><div class='add'>+ if ((co->top + form->vertOffset) > el->top) return 0;</div><div class='add'>+ if ((co->top + form->vertOffset + co->height) <</div><div class='add'>+ (el->top + el->co->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->data = form;</div><div class='add'>+ co->width = 0;</div><div class='add'>+ co->height = 0;</div><div class='add'>+ co->top = -1;</div><div class='add'>+ co->left = -1;</div><div class='add'>+ co->isMapped = 0;</div><div class='add'>+</div><div class='add'>+ co->takesFocus = 0; /* we may have 0 components */</div><div class='add'>+ co->ops = &formOps;</div><div class='add'>+</div><div class='add'>+ form->help = help;</div><div class='add'>+ form->flags = flags;</div><div class='add'>+ form->numCompsAlloced = 5;</div><div class='add'>+ form->numComps = 0;</div><div class='add'>+ form->currComp = -1;</div><div class='add'>+ form->vertOffset = 0;</div><div class='add'>+ form->fixedHeight = 0;</div><div class='add'>+ form->numRows = 0;</div><div class='add'>+ form->numFds = 0;</div><div class='add'>+ form->maxFd = 0;</div><div class='add'>+ form->fds = NULL;</div><div class='add'>+ form->beenSet = 0;</div><div class='add'>+ form->elements = malloc(sizeof(*(form->elements)) * form->numCompsAlloced);</div><div class='add'>+</div><div class='add'>+ form->background = COLORSET_WINDOW;</div><div class='add'>+ form->hotKeys = malloc(sizeof(int));</div><div class='add'>+ form->numHotKeys = 0;</div><div class='add'>+ form->timer = 0;</div><div class='add'>+ form->lastTimeout.tv_sec = form->lastTimeout.tv_usec = 0;</div><div class='add'>+ if (!(form->flags & 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->vertBar = vertBar;</div><div class='add'>+ else</div><div class='add'>+ form->vertBar = NULL;</div><div class='add'>+</div><div class='add'>+ form->helpTag = help;</div><div class='add'>+ form->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->data;</div><div class='add'>+</div><div class='add'>+ return form->elements[form->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->data;</div><div class='add'>+ int i, new;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < form->numComps; i++) {</div><div class='add'>+ if (form->elements[i].co == subco) break;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (form->elements[i].co != subco) return;</div><div class='add'>+ new = i;</div><div class='add'>+</div><div class='add'>+ if (co->isMapped && !componentFits(co, new)) {</div><div class='add'>+ gotoComponent(form, -1);</div><div class='add'>+ form->vertOffset = form->elements[new].top - co->top - 1;</div><div class='add'>+ if (form->vertOffset > (form->numRows - co->height))</div><div class='add'>+ form->vertOffset = form->numRows - co->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->data;</div><div class='add'>+</div><div class='add'>+ form->timer = millisecs;</div><div class='add'>+ form->lastTimeout.tv_usec = 0;</div><div class='add'>+ form->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->data;</div><div class='add'>+</div><div class='add'>+ form->fixedHeight = 1;</div><div class='add'>+ co->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->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->data;</div><div class='add'>+</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+</div><div class='add'>+ if (form->numCompsAlloced == form->numComps) {</div><div class='add'>+ form->numCompsAlloced += 5;</div><div class='add'>+ form->elements = realloc(form->elements,</div><div class='add'>+ sizeof(*(form->elements)) * form->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->elements[form->numComps].left = -2;</div><div class='add'>+ form->elements[form->numComps].top = -2;</div><div class='add'>+ form->elements[form->numComps].co = newco;</div><div class='add'>+</div><div class='add'>+ if (newco->takesFocus && form->currComp == -1)</div><div class='add'>+ form->currComp = form->numComps;</div><div class='add'>+</div><div class='add'>+ form->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->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->top;</div><div class='add'>+ horizDelta = left - co->left;</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->left = left;</div><div class='add'>+</div><div class='add'>+ for (i = 0, el = form->elements; i < form->numComps; i++, el++) {</div><div class='add'>+ el->co->top += vertDelta;</div><div class='add'>+ el->top += vertDelta;</div><div class='add'>+ el->co->left += horizDelta;</div><div class='add'>+ el->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->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->background);</div><div class='add'>+ newtClearBox(co->left, co->top, co->width, co->height);</div><div class='add'>+ for (i = 0, el = form->elements; i < form->numComps; i++, el++) {</div><div class='add'>+ /* the scrollbar *always* fits somewhere */</div><div class='add'>+ if (el->co == form->vertBar) {</div><div class='add'>+ el->co->ops->mapped(el->co, 1);</div><div class='add'>+ el->co->ops->draw(el->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->co->top = el->top - form->vertOffset;</div><div class='add'>+ el->co->ops->mapped(el->co, 1);</div><div class='add'>+ el->co->ops->draw(el->co);</div><div class='add'>+ } else {</div><div class='add'>+ el->co->ops->mapped(el->co, 0);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (form->vertBar)</div><div class='add'>+ newtScrollbarSet(form->vertBar, form->vertOffset,</div><div class='add'>+ form->numRows - co->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->data;</div><div class='add'>+ newtComponent subco = form->elements[form->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->numComps) return er;</div><div class='add'>+</div><div class='add'>+ subco = form->elements[form->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->numComps) {</div><div class='add'>+ i = form->currComp;</div><div class='add'>+ num = 0;</div><div class='add'>+ while (er.result == ER_IGNORED && num != form->numComps ) {</div><div class='add'>+ er = form->elements[i].co->ops->event(form->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->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->elements; i < form->numComps; i++, el++) {</div><div class='add'>+ if ((el->co->top <= ev.u.mouse.y) &&</div><div class='add'>+ (el->co->top + el->co->height > ev.u.mouse.y) &&</div><div class='add'>+ (el->co->left <= ev.u.mouse.x) &&</div><div class='add'>+ (el->co->left + el->co->width > ev.u.mouse.x)) {</div><div class='add'>+ found = 1;</div><div class='add'>+ if (el->co->takesFocus) {</div><div class='add'>+ gotoComponent(form, i);</div><div class='add'>+ subco = form->elements[form->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->ops->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->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->ops->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->currComp;</div><div class='add'>+</div><div class='add'>+ if (page) {</div><div class='add'>+ new += dir * co->height;</div><div class='add'>+ if (new < 0)</div><div class='add'>+ new = 0;</div><div class='add'>+ else if (new >= form->numComps)</div><div class='add'>+ new = (form->numComps - 1);</div><div class='add'>+</div><div class='add'>+ while (!form->elements[new].co->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 < 0)</div><div class='add'>+ new = form->numComps - 1;</div><div class='add'>+ else if (new >= form->numComps)</div><div class='add'>+ new = 0;</div><div class='add'>+ } else if (new < 0 || new >= form->numComps)</div><div class='add'>+ return er;</div><div class='add'>+ } while (!form->elements[new].co->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 < 0) {</div><div class='add'>+ /* make the new component the first one */</div><div class='add'>+ form->vertOffset = form->elements[new].top - co->top;</div><div class='add'>+ } else {</div><div class='add'>+ /* make the new component the last one */</div><div class='add'>+ form->vertOffset = (form->elements[new].top +</div><div class='add'>+ form->elements[new].co->height) -</div><div class='add'>+ (co->top + co->height);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (form->vertOffset < 0) form->vertOffset = 0;</div><div class='add'>+ if (form->vertOffset > (form->numRows - co->height))</div><div class='add'>+ form->vertOffset = form->numRows - co->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->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 < form->numComps; i++) {</div><div class='add'>+ subco = form->elements[i].co;</div><div class='add'>+ if (subco->ops->destroy) {</div><div class='add'>+ subco->ops->destroy(subco);</div><div class='add'>+ } else {</div><div class='add'>+ if (subco->data) free(subco->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->hotKeys) free(form->hotKeys);</div><div class='add'>+</div><div class='add'>+ free(form->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, &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->data;</div><div class='add'>+</div><div class='add'>+ form->numHotKeys++;</div><div class='add'>+ form->hotKeys = realloc(form->hotKeys, sizeof(int) * form->numHotKeys);</div><div class='add'>+ form->hotKeys[form->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->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->beenSet) return;</div><div class='add'>+</div><div class='add'>+ form->beenSet = 1;</div><div class='add'>+</div><div class='add'>+ if (!form->numComps) return;</div><div class='add'>+</div><div class='add'>+ co->width = 0;</div><div class='add'>+ if (!form->fixedHeight) co->height = 0;</div><div class='add'>+</div><div class='add'>+ co->top = form->elements[0].co->top;</div><div class='add'>+ co->left = form->elements[0].co->left;</div><div class='add'>+ for (i = 0, el = form->elements; i < form->numComps; i++, el++) {</div><div class='add'>+ if (el->co->ops == &formOps)</div><div class='add'>+ newtFormSetSize(el->co);</div><div class='add'>+</div><div class='add'>+ el->left = el->co->left;</div><div class='add'>+ el->top = el->co->top;</div><div class='add'>+</div><div class='add'>+ if (co->left > el->co->left) {</div><div class='add'>+ delta = co->left - el->co->left;</div><div class='add'>+ co->left -= delta;</div><div class='add'>+ co->width += delta;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (co->top > el->co->top) {</div><div class='add'>+ delta = co->top - el->co->top;</div><div class='add'>+ co->top -= delta;</div><div class='add'>+ if (!form->fixedHeight)</div><div class='add'>+ co->height += delta;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((co->left + co->width) < (el->co->left + el->co->width))</div><div class='add'>+ co->width = (el->co->left + el->co->width) - co->left;</div><div class='add'>+</div><div class='add'>+ if (!form->fixedHeight) {</div><div class='add'>+ if ((co->top + co->height) < (el->co->top + el->co->height))</div><div class='add'>+ co->height = (el->co->top + el->co->height) - co->top;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((el->co->top + el->co->height - co->top) > form->numRows) {</div><div class='add'>+ form->numRows = el->co->top + el->co->height - co->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->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->currComp == -1) {</div><div class='add'>+ gotoComponent(form, 0);</div><div class='add'>+ } else</div><div class='add'>+ gotoComponent(form, form->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(&readSet);</div><div class='add'>+ FD_ZERO(&writeSet);</div><div class='add'>+ FD_SET(0, &readSet);</div><div class='add'>+ max = form->maxFd;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < form->numFds; i++) {</div><div class='add'>+ if (form->fds[i].flags & NEWT_FD_READ)</div><div class='add'>+ FD_SET(form->fds[i].fd, &readSet);</div><div class='add'>+ if (form->fds[i].flags & NEWT_FD_WRITE)</div><div class='add'>+ FD_SET(form->fds[i].fd, &writeSet);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (form->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->lastTimeout.tv_sec && !form->lastTimeout.tv_usec)</div><div class='add'>+ gettimeofday(&form->lastTimeout, NULL);</div><div class='add'>+</div><div class='add'>+ nextTimeout.tv_sec = form->lastTimeout.tv_sec + </div><div class='add'>+ (form->timer / 1000);</div><div class='add'>+ nextTimeout.tv_usec = form->lastTimeout.tv_usec + </div><div class='add'>+ (form->timer % 1000) * 1000;</div><div class='add'>+</div><div class='add'>+ gettimeofday(&now, 0);</div><div class='add'>+</div><div class='add'>+ if (now.tv_sec > 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 > 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 < nextTimeout.tv_sec) {</div><div class='add'>+ timeout.tv_sec = nextTimeout.tv_sec - now.tv_sec;</div><div class='add'>+ if (now.tv_usec > 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, &readSet, &writeSet, NULL, </div><div class='add'>+ form->timer ? &timeout : NULL);</div><div class='add'>+ if (i < 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->reason = NEWT_EXIT_TIMER;</div><div class='add'>+ gettimeofday(&form->lastTimeout, NULL);</div><div class='add'>+ } else</div><div class='add'>+ {</div><div class='add'>+ if (FD_ISSET(0, &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 < form->numHotKeys; i++) {</div><div class='add'>+ if (form->hotKeys[i] == key) {</div><div class='add'>+ es->reason = NEWT_EXIT_HOTKEY;</div><div class='add'>+ es->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 && form->helpTag && form->helpCb)</div><div class='add'>+ form->helpCb(co, form->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->reason = NEWT_EXIT_COMPONENT;</div><div class='add'>+ es->u.co = form->exitComp;</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+ } else {</div><div class='add'>+ es->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->ops->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->ops->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->ops->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->currComp != -1) {</div><div class='add'>+ ev.event = EV_UNFOCUS;</div><div class='add'>+ sendEvent(form->elements[form->currComp].co, ev);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ form->currComp = newComp;</div><div class='add'>+</div><div class='add'>+ if (form->currComp != -1) {</div><div class='add'>+ ev.event = EV_FOCUS;</div><div class='add'>+ ev.when = EV_NORMAL;</div><div class='add'>+ sendEvent(form->elements[form->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->callback = f;</div><div class='add'>+ co->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->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->data;</div><div class='add'>+</div><div class='add'>+ form->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->data;</div><div class='add'>+</div><div class='add'>+ form->fds = realloc(form->fds, (form->numFds + 1) * sizeof(*form->fds));</div><div class='add'>+ form->fds[form->numFds].fd = fd;</div><div class='add'>+ form->fds[form->numFds++].flags = fdFlags;</div><div class='add'>+ if (form->maxFd < fd) form->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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/grid.c</a></div><div class='hunk'>@@ -0,0 +1,389 @@</div><div class='add'>+#include <alloca.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></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->rows = rows;</div><div class='add'>+ grid->cols = cols;</div><div class='add'>+</div><div class='add'>+ grid->fields = malloc(sizeof(*grid->fields) * cols);</div><div class='add'>+ while (cols--) {</div><div class='add'>+ grid->fields[cols] = malloc(sizeof(**(grid->fields)) * rows);</div><div class='add'>+ memset(grid->fields[cols], 0, sizeof(**(grid->fields)) * rows);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ grid->width = grid->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 = &grid->fields[col][row];</div><div class='add'>+</div><div class='add'>+ if (field->type == NEWT_GRID_SUBGRID) </div><div class='add'>+ newtGridFree(field->u.grid, 1);</div><div class='add'>+</div><div class='add'>+ field->type = type;</div><div class='add'>+ field->u.co = (void *) val;</div><div class='add'>+</div><div class='add'>+ field->padLeft = padLeft;</div><div class='add'>+ field->padRight = padRight;</div><div class='add'>+ field->padTop = padTop;</div><div class='add'>+ field->padBottom = padBottom;</div><div class='add'>+ field->anchor = anchor;</div><div class='add'>+ field->flags = flags;</div><div class='add'>+</div><div class='add'>+ grid->width = grid->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 < 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->cols);</div><div class='add'>+ memset(widths, 0, sizeof(*widths) * grid->cols);</div><div class='add'>+ heights = alloca(sizeof(*heights) * grid->rows);</div><div class='add'>+ memset(heights, 0, sizeof(*heights) * grid->rows);</div><div class='add'>+</div><div class='add'>+ minWidth = 0;</div><div class='add'>+ for (row = 0; row < grid->rows; row++) {</div><div class='add'>+ i = 0;</div><div class='add'>+ for (col = 0; col < grid->cols; col++) {</div><div class='add'>+ field = &grid->fields[col][row];</div><div class='add'>+ if (field->type == NEWT_GRID_SUBGRID) {</div><div class='add'>+ /* we'll have to redo this later */</div><div class='add'>+ if (field->u.grid->width == -1) </div><div class='add'>+ shuffleGrid(field->u.grid, left, top, 0);</div><div class='add'>+ j = field->u.grid->width;</div><div class='add'>+ } else if (field->type == NEWT_GRID_COMPONENT) {</div><div class='add'>+ if (field->u.co->ops == formOps)</div><div class='add'>+ newtFormSetSize(field->u.co);</div><div class='add'>+ j = field->u.co->width;</div><div class='add'>+ } else </div><div class='add'>+ j = 0;</div><div class='add'>+</div><div class='add'>+ j += field->padLeft + field->padRight;</div><div class='add'>+</div><div class='add'>+ if (j > 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 > 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 < grid->cols; col++) {</div><div class='add'>+ i = 0;</div><div class='add'>+ for (row = 0; row < grid->rows; row++) {</div><div class='add'>+ field = &grid->fields[col][row];</div><div class='add'>+ if (field->type == NEWT_GRID_SUBGRID) {</div><div class='add'>+ /* we'll have to redo this later */</div><div class='add'>+ if (field->u.grid->height == -1) </div><div class='add'>+ shuffleGrid(field->u.grid, 0, 0, 0);</div><div class='add'>+ j = field->u.grid->height;</div><div class='add'>+ } else if (field->type == NEWT_GRID_COMPONENT){</div><div class='add'>+ j = field->u.co->height;</div><div class='add'>+ } else </div><div class='add'>+ j = 0;</div><div class='add'>+</div><div class='add'>+ j += field->padTop + field->padBottom;</div><div class='add'>+</div><div class='add'>+ if (j > 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 > 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->width < minWidth) grid->width = minWidth; /* ack! */</div><div class='add'>+ if (grid->height < minHeight) grid->height = minHeight; /* ditto! */</div><div class='add'>+</div><div class='add'>+ if (!set) return;</div><div class='add'>+</div><div class='add'>+ distSpace(grid->width - minWidth, grid->cols, widths);</div><div class='add'>+ distSpace(grid->height - minHeight, grid->rows, heights);</div><div class='add'>+</div><div class='add'>+ thisTop = top;</div><div class='add'>+ for (row = 0; row < grid->rows; row++) {</div><div class='add'>+ i = 0;</div><div class='add'>+ thisLeft = left;</div><div class='add'>+ for (col = 0; col < grid->cols; col++) {</div><div class='add'>+ field = &grid->fields[col][row];</div><div class='add'>+</div><div class='add'>+ if (field->type == NEWT_GRID_EMPTY) continue;</div><div class='add'>+</div><div class='add'>+ x = thisLeft + field->padLeft;</div><div class='add'>+ remx = widths[col] - field->padLeft - field->padRight;</div><div class='add'>+ y = thisTop + field->padTop;</div><div class='add'>+ remy = heights[row] - field->padTop - field->padBottom;</div><div class='add'>+</div><div class='add'>+ if (field->type == NEWT_GRID_SUBGRID) {</div><div class='add'>+ remx -= field->u.grid->width;</div><div class='add'>+ remy -= field->u.grid->height;</div><div class='add'>+ } else if (field->type == NEWT_GRID_COMPONENT) {</div><div class='add'>+ remx -= field->u.co->width;</div><div class='add'>+ remy -= field->u.co->height;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (!(field->flags & NEWT_GRID_FLAG_GROWX)) {</div><div class='add'>+ if (field->anchor & NEWT_ANCHOR_RIGHT)</div><div class='add'>+ x += remx;</div><div class='add'>+ else if (!(field->anchor & NEWT_ANCHOR_LEFT))</div><div class='add'>+ x += (remx / 2);</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (!(field->flags & NEWT_GRID_FLAG_GROWY)) {</div><div class='add'>+ if (field->anchor & NEWT_ANCHOR_BOTTOM)</div><div class='add'>+ y += remx;</div><div class='add'>+ else if (!(field->anchor & NEWT_ANCHOR_TOP))</div><div class='add'>+ y += (remy / 2);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (field->type == NEWT_GRID_SUBGRID) {</div><div class='add'>+ if (field->flags & NEWT_GRID_FLAG_GROWX)</div><div class='add'>+ field->u.grid->width = widths[col] - field->padLeft </div><div class='add'>+ - field->padRight;</div><div class='add'>+ if (field->flags & NEWT_GRID_FLAG_GROWY)</div><div class='add'>+ field->u.grid->height = heights[col] - field->padTop</div><div class='add'>+ - field->padBottom;</div><div class='add'>+</div><div class='add'>+ shuffleGrid(field->u.grid, x, y, 1);</div><div class='add'>+ } else if (field->type == NEWT_GRID_COMPONENT) {</div><div class='add'>+ field->u.co->ops->place(field->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 < grid->cols; col++) {</div><div class='add'>+ if (recurse) {</div><div class='add'>+ for (row = 0; row < grid->rows; row++) {</div><div class='add'>+ if (grid->fields[col][row].type == NEWT_GRID_SUBGRID)</div><div class='add'>+ newtGridFree(grid->fields[col][row].u.grid, 1);</div><div class='add'>+ }</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free(grid->fields[col]);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free(grid->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->width == -1 || grid->height == -1) {</div><div class='add'>+ grid->width = grid->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->width;</div><div class='add'>+ *height = grid->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, &width, &height);</div><div class='add'>+ if (width < 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, &width, &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 < grid->cols; col++) {</div><div class='add'>+ for (row = 0; row < grid->rows; row++) {</div><div class='add'>+ if (grid->fields[col][row].type == NEWT_GRID_SUBGRID && recurse)</div><div class='add'>+ newtGridAddComponentsToForm(grid->fields[col][row].u.grid,</div><div class='add'>+ form, 1);</div><div class='add'>+ else if (grid->fields[col][row].type == NEWT_GRID_COMPONENT)</div><div class='add'>+ newtFormAddComponent(form, grid->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 < 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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/label.c</a></div><div class='hunk'>@@ -0,0 +1,81 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></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->data = la;</div><div class='add'>+</div><div class='add'>+ co->ops = &labelOps;</div><div class='add'>+</div><div class='add'>+ co->height = 1;</div><div class='add'>+ co->width = strlen(text);</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->takesFocus = 0;</div><div class='add'>+</div><div class='add'>+ la->length = strlen(text);</div><div class='add'>+ la->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->data;</div><div class='add'>+</div><div class='add'>+ newLength = strlen(text);</div><div class='add'>+ if (newLength <= la->length) {</div><div class='add'>+ memset(la->text, ' ', la->length);</div><div class='add'>+ memcpy(la->text, text, newLength);</div><div class='add'>+ } else {</div><div class='add'>+ free(la->text);</div><div class='add'>+ la->text = strdup(text);</div><div class='add'>+ la->length = newLength;</div><div class='add'>+ co->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->data;</div><div class='add'>+</div><div class='add'>+ if (co->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->top, co->left);</div><div class='add'>+ SLsmg_write_string(la->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->data;</div><div class='add'>+</div><div class='add'>+ free(la->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&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 <sopwith@cuc.edu></div><div class='add'>+ (from the original listbox by Erik Troan <ewt@redhat.com>)</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 <slang.h></div><div class='add'>+#include <stdio.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+#include <ctype.h></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->data;</div><div class='add'>+</div><div class='add'>+ co->isMapped = isMapped;</div><div class='add'>+ if (li->sb)</div><div class='add'>+ li->sb->ops->mapped(li->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->data;</div><div class='add'>+</div><div class='add'>+ co->top = newTop;</div><div class='add'>+ co->left = newLeft;</div><div class='add'>+</div><div class='add'>+ if (li->sb)</div><div class='add'>+ li->sb->ops->place(li->sb, co->left + co->width - li->bdxAdjust - 1,</div><div class='add'>+ co->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->boxItems = NULL;</div><div class='add'>+ li->numItems = 0;</div><div class='add'>+ li->currItem = 0;</div><div class='add'>+ li->numSelected = 0;</div><div class='add'>+ li->isActive = 0;</div><div class='add'>+ li->userHasSetWidth = 0;</div><div class='add'>+ li->startShowItem = 0;</div><div class='add'>+ li->sbAdjust = 0;</div><div class='add'>+ li->bdxAdjust = 0;</div><div class='add'>+ li->bdyAdjust = 0;</div><div class='add'>+ li->flags = flags & (NEWT_FLAG_RETURNEXIT | NEWT_FLAG_BORDER |</div><div class='add'>+ NEWT_FLAG_MULTIPLE);</div><div class='add'>+</div><div class='add'>+ if (li->flags & NEWT_FLAG_BORDER) {</div><div class='add'>+ li->bdxAdjust = 2;</div><div class='add'>+ li->bdyAdjust = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ co->height = height;</div><div class='add'>+ li->curHeight = co->height - (2 * li->bdyAdjust);</div><div class='add'>+</div><div class='add'>+ if (height) {</div><div class='add'>+ li->grow = 0;</div><div class='add'>+ if (flags & NEWT_FLAG_SCROLL) {</div><div class='add'>+ sb = newtVerticalScrollbar(left, top + li->bdyAdjust,</div><div class='add'>+ li->curHeight,</div><div class='add'>+ COLORSET_LISTBOX, COLORSET_ACTLISTBOX);</div><div class='add'>+ li->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->grow = 1;</div><div class='add'>+ sb = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ li->sb = sb;</div><div class='add'>+ co->data = li;</div><div class='add'>+ co->isMapped = 0;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->ops = &listboxOps;</div><div class='add'>+ co->takesFocus = 1;</div><div class='add'>+ co->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->curWidth = maxField;</div><div class='add'>+ co->width = li->curWidth + li->sbAdjust + 2 * li->bdxAdjust;</div><div class='add'>+</div><div class='add'>+ if (li->sb)</div><div class='add'>+ li->sb->left = co->left + co->width - li->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->data;</div><div class='add'>+ struct items * item;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ item = li->boxItems, i = 0;</div><div class='add'>+ while (item && item->data != key)</div><div class='add'>+ item = item->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->data;</div><div class='add'>+</div><div class='add'>+ if (num >= li->numItems)</div><div class='add'>+ li->currItem = li->numItems - 1;</div><div class='add'>+ else if (num < 0)</div><div class='add'>+ li->currItem = 0;</div><div class='add'>+ else</div><div class='add'>+ li->currItem = num;</div><div class='add'>+</div><div class='add'>+ if (li->currItem < li->startShowItem)</div><div class='add'>+ li->startShowItem = li->currItem;</div><div class='add'>+ else if (li->currItem - li->startShowItem > li->curHeight - 1)</div><div class='add'>+ li->startShowItem = li->currItem - li->curHeight + 1;</div><div class='add'>+ if (li->startShowItem + li->curHeight > li->numItems)</div><div class='add'>+ li->startShowItem = li->numItems - li->curHeight;</div><div class='add'>+ if(li->startShowItem < 0)</div><div class='add'>+ li->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->data;</div><div class='add'>+</div><div class='add'>+ if(li->sb)</div><div class='add'>+ newtScrollbarSet(li->sb, li->currItem + 1, li->numItems);</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->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->data;</div><div class='add'>+</div><div class='add'>+ co->width = width;</div><div class='add'>+ li->curWidth = co->width - li->sbAdjust - 2 * li->bdxAdjust;</div><div class='add'>+ li->userHasSetWidth = 1;</div><div class='add'>+ if (li->sb) li->sb->left = co->width + co->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->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->boxItems; item != NULL && i < li->currItem;</div><div class='add'>+ i++, item = item->next);</div><div class='add'>+</div><div class='add'>+ if (item)</div><div class='add'>+ return (void *)item->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->data;</div><div class='add'>+ int i;</div><div class='add'>+ struct items * item;</div><div class='add'>+</div><div class='add'>+ item = li->boxItems, i = 0;</div><div class='add'>+ while (item && item->data != key)</div><div class='add'>+ item = item->next, i++;</div><div class='add'>+</div><div class='add'>+ if (!item) return;</div><div class='add'>+</div><div class='add'>+ if (item->isSelected)</div><div class='add'>+ li->numSelected--;</div><div class='add'>+</div><div class='add'>+ switch(sense) {</div><div class='add'>+ case NEWT_FLAGS_RESET:</div><div class='add'>+ item->isSelected = 0; break;</div><div class='add'>+ case NEWT_FLAGS_SET:</div><div class='add'>+ item->isSelected = 1; break;</div><div class='add'>+ case NEWT_FLAGS_TOGGLE:</div><div class='add'>+ item->isSelected = !item->isSelected;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (item->isSelected)</div><div class='add'>+ li->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->data;</div><div class='add'>+</div><div class='add'>+ for(item = li->boxItems; item != NULL;</div><div class='add'>+ item = item->next)</div><div class='add'>+ item->isSelected = 0;</div><div class='add'>+ li->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->data;</div><div class='add'>+ if(!li || !li->numSelected) return NULL;</div><div class='add'>+</div><div class='add'>+ retval = malloc(li->numSelected * sizeof(void *));</div><div class='add'>+ for(i = 0, item = li->boxItems; item != NULL;</div><div class='add'>+ item = item->next)</div><div class='add'>+ if(item->isSelected)</div><div class='add'>+ retval[i++] = (void *)item->data;</div><div class='add'>+ *numitems = li->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->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->boxItems; item != NULL && i < num;</div><div class='add'>+ i++, item = item->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->text);</div><div class='add'>+ item->text = strdup(text);</div><div class='add'>+ }</div><div class='add'>+ if (li->userHasSetWidth == 0 && strlen(text) > li->curWidth) {</div><div class='add'>+ updateWidth(co, li, strlen(text));</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (num >= li->startShowItem && num <= li->startShowItem + co->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->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->boxItems; item != NULL && i < num;</div><div class='add'>+ i++, item = item->next);</div><div class='add'>+</div><div class='add'>+ item->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->data;</div><div class='add'>+ struct items *item;</div><div class='add'>+</div><div class='add'>+ if(li->boxItems) {</div><div class='add'>+ for (item = li->boxItems; item->next != NULL; item = item->next);</div><div class='add'>+</div><div class='add'>+ item = item->next = malloc(sizeof(struct items));</div><div class='add'>+ } else {</div><div class='add'>+ item = li->boxItems = malloc(sizeof(struct items));</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (!li->userHasSetWidth && text && (strlen(text) > li->curWidth))</div><div class='add'>+ updateWidth(co, li, strlen(text));</div><div class='add'>+</div><div class='add'>+ item->text = strdup(text); item->data = data; item->next = NULL;</div><div class='add'>+ item->isSelected = 0;</div><div class='add'>+</div><div class='add'>+ if (li->grow)</div><div class='add'>+ co->height++, li->curHeight++;</div><div class='add'>+ li->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->data;</div><div class='add'>+ struct items *item, *t;</div><div class='add'>+</div><div class='add'>+ if (li->boxItems) {</div><div class='add'>+ if (key) {</div><div class='add'>+ item = li->boxItems;</div><div class='add'>+ while (item && item->data != key) item = item->next;</div><div class='add'>+</div><div class='add'>+ if (!item) return 1;</div><div class='add'>+</div><div class='add'>+ t = item->next;</div><div class='add'>+ item = item->next = malloc(sizeof(struct items));</div><div class='add'>+ item->next = t;</div><div class='add'>+ } else {</div><div class='add'>+ t = li->boxItems;</div><div class='add'>+ item = li->boxItems = malloc(sizeof(struct items));</div><div class='add'>+ item->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->boxItems = malloc(sizeof(struct items));</div><div class='add'>+ item->next = NULL;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (!li->userHasSetWidth && text && (strlen(text) > li->curWidth))</div><div class='add'>+ updateWidth(co, li, strlen(text));</div><div class='add'>+</div><div class='add'>+ item->text = strdup(text?text:"(null)"); item->data = data;</div><div class='add'>+ item->isSelected = 0;</div><div class='add'>+</div><div class='add'>+ if (li->sb)</div><div class='add'>+ li->sb->left = co->left + co->width - li->bdxAdjust - 1;</div><div class='add'>+ li->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->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->boxItems == NULL || li->numItems <= 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->boxItems;</div><div class='add'>+ while (item && item->data != key) {</div><div class='add'>+ item2 = item;</div><div class='add'>+ item = item->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->next = item->next;</div><div class='add'>+ else</div><div class='add'>+ li->boxItems = item->next;</div><div class='add'>+</div><div class='add'>+ free(item->text);</div><div class='add'>+ free(item);</div><div class='add'>+ li->numItems--;</div><div class='add'>+</div><div class='add'>+ if (!li->userHasSetWidth) {</div><div class='add'>+ widest = 0;</div><div class='add'>+ for (item = li->boxItems; item != NULL; item = item->next)</div><div class='add'>+ if ((t = strlen(item->text)) > widest) widest = t;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (li->currItem >= num)</div><div class='add'>+ li->currItem--;</div><div class='add'>+</div><div class='add'>+ if (!li->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->data) == NULL)</div><div class='add'>+ return;</div><div class='add'>+ for(anitem = li->boxItems; anitem != NULL; anitem = nextitem) {</div><div class='add'>+ nextitem = anitem->next;</div><div class='add'>+ free(anitem->text);</div><div class='add'>+ free(anitem);</div><div class='add'>+ }</div><div class='add'>+ li->numItems = li->numSelected = li->currItem = li->startShowItem = 0;</div><div class='add'>+ li->boxItems = NULL;</div><div class='add'>+ if (!li->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->data;</div><div class='add'>+ int i;</div><div class='add'>+ struct items *item;</div><div class='add'>+</div><div class='add'>+ if (!li->boxItems || num >= li->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->boxItems;</div><div class='add'>+ while (item && i < num) {</div><div class='add'>+ i++, item = item->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->text;</div><div class='add'>+ if (data)</div><div class='add'>+ *data = (void *)item->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->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->isMapped) return ;</div><div class='add'>+</div><div class='add'>+ if(li->flags & NEWT_FLAG_BORDER) {</div><div class='add'>+ if(li->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->left, co->top, co->width, co->height, 0);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if(li->sb)</div><div class='add'>+ li->sb->ops->draw(li->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->boxItems; item != NULL && i < li->startShowItem;</div><div class='add'>+ i++, item = item->next);</div><div class='add'>+</div><div class='add'>+ j = i;</div><div class='add'>+</div><div class='add'>+ for (i = 0; item != NULL && i < li->curHeight; i++, item = item->next) {</div><div class='add'>+ if (!item->text) continue;</div><div class='add'>+</div><div class='add'>+ newtGotorc(co->top + i + li->bdyAdjust, co->left + li->bdxAdjust);</div><div class='add'>+ if(j + i == li->currItem) {</div><div class='add'>+ if(item->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->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->text, li->curWidth);</div><div class='add'>+</div><div class='add'>+ }</div><div class='add'>+ newtGotorc(co->top + (li->currItem - li->startShowItem), co->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->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->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->flags & NEWT_FLAG_MULTIPLE)) break;</div><div class='add'>+ newtListboxSelectItem(co, li->boxItems[li->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->numItems <= 0) break;</div><div class='add'>+ if(li->currItem < li->numItems - 1) {</div><div class='add'>+ li->currItem++;</div><div class='add'>+ if(li->currItem > (li->startShowItem + li->curHeight - 1)) {</div><div class='add'>+ li->startShowItem = li->currItem - li->curHeight + 1;</div><div class='add'>+ if(li->startShowItem + li->curHeight > li->numItems)</div><div class='add'>+ li->startShowItem = li->numItems - li->curHeight;</div><div class='add'>+ }</div><div class='add'>+ if(li->sb)</div><div class='add'>+ newtScrollbarSet(li->sb, li->currItem + 1, li->numItems);</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ }</div><div class='add'>+ if(co->callback) co->callback(co, co->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->numItems <= 0) break;</div><div class='add'>+ if(li->flags & 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->numItems <= 0) break;</div><div class='add'>+ if(li->currItem > 0) {</div><div class='add'>+ li->currItem--;</div><div class='add'>+ if(li->currItem < li->startShowItem)</div><div class='add'>+ li->startShowItem = li->currItem;</div><div class='add'>+ if(li->sb)</div><div class='add'>+ newtScrollbarSet(li->sb, li->currItem + 1, li->numItems);</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ }</div><div class='add'>+ if(co->callback) co->callback(co, co->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->numItems <= 0) break;</div><div class='add'>+ li->startShowItem -= li->curHeight - 1;</div><div class='add'>+ if(li->startShowItem < 0)</div><div class='add'>+ li->startShowItem = 0;</div><div class='add'>+ li->currItem -= li->curHeight - 1;</div><div class='add'>+ if(li->currItem < 0)</div><div class='add'>+ li->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->numItems <= 0) break;</div><div class='add'>+ li->startShowItem += li->curHeight;</div><div class='add'>+ if(li->startShowItem > (li->numItems - li->curHeight)) {</div><div class='add'>+ li->startShowItem = li->numItems - li->curHeight;</div><div class='add'>+ }</div><div class='add'>+ li->currItem += li->curHeight;</div><div class='add'>+ if(li->currItem >= li->numItems) {</div><div class='add'>+ li->currItem = li->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->numItems <= 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->numItems <= 0) break;</div><div class='add'>+ li->startShowItem = li->numItems - li->curHeight;</div><div class='add'>+ if(li->startShowItem < 0)</div><div class='add'>+ li->startShowItem = 0;</div><div class='add'>+ li->currItem = li->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->numItems <= 0) break;</div><div class='add'>+ if (ev.u.key < NEWT_KEY_EXTRA_BASE && isalpha(ev.u.key)) {</div><div class='add'>+ for(i = 0, item = li->boxItems; item != NULL &&</div><div class='add'>+ i < li->currItem; i++, item = item->next);</div><div class='add'>+</div><div class='add'>+ if (item && item->text && (toupper(*item->text) == toupper(ev.u.key))) {</div><div class='add'>+ item = item->next;</div><div class='add'>+ i++;</div><div class='add'>+ } else { </div><div class='add'>+ item = li->boxItems;</div><div class='add'>+ i = 0;</div><div class='add'>+ }</div><div class='add'>+ while (item && item->text &&</div><div class='add'>+ toupper(*item->text) != toupper(ev.u.key)) {</div><div class='add'>+ item = item->next;</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+ if (item) {</div><div class='add'>+ li->currItem = i;</div><div class='add'>+ if(li->currItem < li->startShowItem ||</div><div class='add'>+ li->currItem > li->startShowItem)</div><div class='add'>+ li->startShowItem =</div><div class='add'>+ li->currItem > li->numItems - li->curHeight ?</div><div class='add'>+ li->startShowItem = li->numItems - li->curHeight :</div><div class='add'>+ li->currItem;</div><div class='add'>+ if(li->sb)</div><div class='add'>+ newtScrollbarSet(li->sb, li->currItem + 1, li->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->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->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->sb &&</div><div class='add'>+ ev.u.mouse.x == co->left + co->width - li->bdxAdjust - 1 &&</div><div class='add'>+ ev.u.mouse.y == co->top + li->bdyAdjust) {</div><div class='add'>+ if(li->numItems <= 0) break;</div><div class='add'>+ if(li->currItem > 0) {</div><div class='add'>+ li->currItem--;</div><div class='add'>+ if(li->currItem < li->startShowItem)</div><div class='add'>+ li->startShowItem = li->currItem;</div><div class='add'>+ if(li->sb)</div><div class='add'>+ newtScrollbarSet(li->sb, li->currItem + 1, li->numItems);</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ }</div><div class='add'>+ if(co->callback) co->callback(co, co->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->sb &&</div><div class='add'>+ ev.u.mouse.x == co->left + co->width - li->bdxAdjust - 1 &&</div><div class='add'>+ ev.u.mouse.y == co->top + co->height - li->bdyAdjust - 1) {</div><div class='add'>+ if(li->numItems <= 0) break;</div><div class='add'>+ if(li->currItem < li->numItems - 1) {</div><div class='add'>+ li->currItem++;</div><div class='add'>+ if(li->currItem > (li->startShowItem + li->curHeight - 1)) {</div><div class='add'>+ li->startShowItem = li->currItem - li->curHeight + 1;</div><div class='add'>+ if(li->startShowItem + li->curHeight > li->numItems)</div><div class='add'>+ li->startShowItem = li->numItems - li->curHeight;</div><div class='add'>+ }</div><div class='add'>+ if(li->sb)</div><div class='add'>+ newtScrollbarSet(li->sb, li->currItem + 1, li->numItems);</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ }</div><div class='add'>+ if(co->callback) co->callback(co, co->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 >= co->top + li->bdyAdjust) &&</div><div class='add'>+ (ev.u.mouse.y <= co->top + co->height - (li->bdyAdjust * 2)) &&</div><div class='add'>+ (ev.u.mouse.x >= co->left + li->bdxAdjust) &&</div><div class='add'>+ (ev.u.mouse.x <= co->left + co->width + (li->bdxAdjust * 2))) {</div><div class='add'>+ li->currItem = li->startShowItem +</div><div class='add'>+ (ev.u.mouse.y - li->bdyAdjust - co->top);</div><div class='add'>+ newtListboxRealSetCurrent(co);</div><div class='add'>+ listboxDraw(co);</div><div class='add'>+ if(co->callback) co->callback(co, co->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->data;</div><div class='add'>+ struct items * item, * nextitem;</div><div class='add'>+</div><div class='add'>+ nextitem = item = li->boxItems;</div><div class='add'>+</div><div class='add'>+ while (item != NULL) {</div><div class='add'>+ nextitem = item->next;</div><div class='add'>+ free(item->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->sb) li->sb->ops->destroy(li->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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/newt.c</a></div><div class='hunk'>@@ -0,0 +1,672 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdio.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></div><div class='add'>+#include <sys/signal.h></div><div class='add'>+#include <sys/time.h></div><div class='add'>+#include <sys/types.h></div><div class='add'>+#include <termios.h></div><div class='add'>+#include <unistd.h></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'>+" <Tab>/<Alt-Tab> between elements | <Space> selects | <F12> 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 & 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(&sa, 0, sizeof(sa));</div><div class='add'>+ sa.sa_handler = handleSigwinch;</div><div class='add'>+ sigaction(SIGWINCH, &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 && 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->code; curr++) {</div><div class='add'>+ if (curr->str) {</div><div class='add'>+ if (!strcmp(curr->str, buf))</div><div class='add'>+ return curr->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->code; curr++) {</div><div class='add'>+ if (curr->str) {</div><div class='add'>+ if (!strcmp(curr->str, buf))</div><div class='add'>+ return curr->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 > 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->left = left;</div><div class='add'>+ currentWindow->top = top;</div><div class='add'>+ currentWindow->width = width;</div><div class='add'>+ currentWindow->height = height;</div><div class='add'>+ currentWindow->title = title ? strdup(title) : NULL;</div><div class='add'>+</div><div class='add'>+ currentWindow->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 < height + 3; j++, row++) {</div><div class='add'>+ SLsmg_gotorc(row, col);</div><div class='add'>+ SLsmg_read_raw(currentWindow->buffer + n,</div><div class='add'>+ currentWindow->width + 3);</div><div class='add'>+ n += currentWindow->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->title) {</div><div class='add'>+ i = strlen(currentWindow->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->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 < (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) && (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->top - 1;</div><div class='add'>+ col = currentWindow->left - 1;</div><div class='add'>+ for (j = 0; j < currentWindow->height + 3; j++, row++) {</div><div class='add'>+ SLsmg_gotorc(row, col);</div><div class='add'>+ SLsmg_write_raw(currentWindow->buffer + n,</div><div class='add'>+ currentWindow->width + 3);</div><div class='add'>+ n += currentWindow->width + 3;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ free(currentWindow->buffer);</div><div class='add'>+ free(currentWindow->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->left;</div><div class='add'>+ *y = currentWindow->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->top;</div><div class='add'>+ newCol += currentWindow->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->top;</div><div class='add'>+ left += currentWindow->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->top;</div><div class='add'>+ left += currentWindow->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->code; curr++) {</div><div class='add'>+ if (!curr->str)</div><div class='add'>+ curr->str = SLtt_tgetstr(curr->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(&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, &set, &set, &set, &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 < 0) {</div><div class='add'>+ col = SLtt_Screen_Cols + col;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (row < 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 & (~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->left = newLeft;</div><div class='add'>+ c->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->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&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 <stdarg.h></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 << 0)</div><div class='add'>+#define NEWT_FLAG_HIDDEN (1 << 1)</div><div class='add'>+#define NEWT_FLAG_SCROLL (1 << 2)</div><div class='add'>+#define NEWT_FLAG_DISABLED (1 << 3)</div><div class='add'>+/* OBSOLETE #define NEWT_FLAG_NOSCROLL (1 << 4) for listboxes */</div><div class='add'>+#define NEWT_FLAG_BORDER (1 << 5)</div><div class='add'>+#define NEWT_FLAG_WRAP (1 << 6)</div><div class='add'>+#define NEWT_FLAG_NOF12 (1 << 7)</div><div class='add'>+#define NEWT_FLAG_MULTIPLE (1 << 8)</div><div class='add'>+#define NEWT_FLAG_SELECTED (1 << 9)</div><div class='add'>+#define NEWT_FLAG_CHECKBOX (1 << 10)</div><div class='add'>+#define NEWT_FLAG_PASSWORD (1 << 11) /* draw '*' of chars in entrybox */</div><div class='add'>+#define NEWT_FD_READ (1 << 0)</div><div class='add'>+#define NEWT_FD_WRITE (1 << 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 << 0)</div><div class='add'>+#define NEWT_ANCHOR_RIGHT (1 << 1)</div><div class='add'>+#define NEWT_ANCHOR_TOP (1 << 2)</div><div class='add'>+#define NEWT_ANCHOR_BOTTOM (1 << 3)</div><div class='add'>+</div><div class='add'>+#define NEWT_GRID_FLAG_GROWX (1 << 0)</div><div class='add'>+#define NEWT_GRID_FLAG_GROWY (1 << 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&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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/scale.c</a></div><div class='hunk'>@@ -0,0 +1,72 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></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->data = sc;</div><div class='add'>+</div><div class='add'>+ co->ops = &scaleOps;</div><div class='add'>+</div><div class='add'>+ co->height = 1;</div><div class='add'>+ co->width = width;</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->takesFocus = 0;</div><div class='add'>+</div><div class='add'>+ sc->fullValue = fullValue;</div><div class='add'>+ sc->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->data;</div><div class='add'>+ int newCharsSet;</div><div class='add'>+</div><div class='add'>+ newCharsSet = (amount * co->width) / sc->fullValue;</div><div class='add'>+ </div><div class='add'>+ if (newCharsSet != sc->charsSet) {</div><div class='add'>+ sc->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->data;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (co->top == -1) return;</div><div class='add'>+</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(NEWT_COLORSET_FULLSCALE);</div><div class='add'>+ for (i = 0; i < sc->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 < (co->width - sc->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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/scrollbar.c</a></div><div class='hunk'>@@ -0,0 +1,124 @@</div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></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->data;</div><div class='add'>+ int new;</div><div class='add'>+</div><div class='add'>+ if (sb->arrows)</div><div class='add'>+ new = (where * (co->height - 3)) / (total ? total : 1) + 1;</div><div class='add'>+ else</div><div class='add'>+ new = (where * (co->height - 1)) / (total ? total : 1);</div><div class='add'>+ if (new != sb->curr) {</div><div class='add'>+ sbDrawThumb(co, 0);</div><div class='add'>+ sb->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->data = sb;</div><div class='add'>+</div><div class='add'>+ if (!strcmp(getenv("TERM"), "linux") && height >= 2) {</div><div class='add'>+ sb->arrows = 1;</div><div class='add'>+ sb->curr = 1;</div><div class='add'>+ } else {</div><div class='add'>+ sb->arrows = 0;</div><div class='add'>+ sb->curr = 0;</div><div class='add'>+ }</div><div class='add'>+ sb->cs = normalColorset;</div><div class='add'>+ sb->csThumb = thumbColorset;</div><div class='add'>+</div><div class='add'>+ co->ops = &sbOps;</div><div class='add'>+ co->isMapped = 0;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->height = height;</div><div class='add'>+ co->width = 1;</div><div class='add'>+ co->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->data;</div><div class='add'>+ int i;</div><div class='add'>+</div><div class='add'>+ if (!co->isMapped) return;</div><div class='add'>+</div><div class='add'>+ SLsmg_set_color(sb->cs);</div><div class='add'>+</div><div class='add'>+ SLsmg_set_char_set(1);</div><div class='add'>+ if (sb->arrows) {</div><div class='add'>+ newtGotorc(co->top, co->left);</div><div class='add'>+ SLsmg_write_char('\x2d');</div><div class='add'>+ for (i = 1; i < co->height - 1; i++) {</div><div class='add'>+ newtGotorc(i + co->top, co->left);</div><div class='add'>+ SLsmg_write_char('\x61');</div><div class='add'>+ }</div><div class='add'>+ newtGotorc(co->top + co->height - 1, co->left);</div><div class='add'>+ SLsmg_write_char('\x2e');</div><div class='add'>+ } else {</div><div class='add'>+ for (i = 0; i < co->height; i++) {</div><div class='add'>+ newtGotorc(i + co->top, co->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->data;</div><div class='add'>+ char ch = isOn ? '#' : '\x61';</div><div class='add'>+</div><div class='add'>+ if (!co->isMapped) return;</div><div class='add'>+</div><div class='add'>+ newtGotorc(sb->curr + co->top, co->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->csThumb);</div><div class='add'>+ else*/</div><div class='add'>+ SLsmg_set_color(sb->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->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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/textbox.c</a></div><div class='hunk'>@@ -0,0 +1,409 @@</div><div class='add'>+#include <ctype.h></div><div class='add'>+#include <slang.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></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->data;</div><div class='add'>+</div><div class='add'>+ co->isMapped = isMapped;</div><div class='add'>+ if (tb->sb)</div><div class='add'>+ tb->sb->ops->mapped(tb->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->data;</div><div class='add'>+</div><div class='add'>+ co->top = newTop;</div><div class='add'>+ co->left = newLeft;</div><div class='add'>+</div><div class='add'>+ if (tb->sb)</div><div class='add'>+ tb->sb->ops->place(tb->sb, co->left + co->width - 1, co->top);</div><div class='add'>+}</div><div class='add'>+</div><div class='add'>+void newtTextboxSetHeight(newtComponent co, int height) {</div><div class='add'>+ co->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->data;</div><div class='add'>+</div><div class='add'>+ return (tb->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'>+ &actWidth, &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->data = tb;</div><div class='add'>+</div><div class='add'>+ co->ops = &textboxOps;</div><div class='add'>+</div><div class='add'>+ co->height = height;</div><div class='add'>+ co->top = top;</div><div class='add'>+ co->left = left;</div><div class='add'>+ co->takesFocus = 0;</div><div class='add'>+ co->width = width;</div><div class='add'>+</div><div class='add'>+ tb->doWrap = flags & NEWT_FLAG_WRAP;</div><div class='add'>+ tb->numLines = 0;</div><div class='add'>+ tb->linesAlloced = 0;</div><div class='add'>+ tb->lines = NULL;</div><div class='add'>+ tb->topLine = 0;</div><div class='add'>+ tb->textWidth = width;</div><div class='add'>+</div><div class='add'>+ if (flags & NEWT_FLAG_SCROLL) {</div><div class='add'>+ co->width += 2;</div><div class='add'>+ tb->sb = newtVerticalScrollbar(co->left + co->width - 1, co->top, </div><div class='add'>+ co->height, COLORSET_TEXTBOX, COLORSET_TEXTBOX);</div><div class='add'>+ } else {</div><div class='add'>+ tb->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) > 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 & 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 <= (unsigned char)(c&0xff) && (unsigned char)(c&0xff) <= 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 && text < end) {</div><div class='add'>+ if (end - text < 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 < (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 < 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 > text && !isspace(*chptr)) chptr--;</div><div class='add'>+ while (chptr > text && isspace(*chptr)) chptr--;</div><div class='add'>+ chptr++;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ if (chptr-text == 1 && !isspace(*chptr))</div><div class='add'>+ chptr = text + width - 1;</div><div class='add'>+</div><div class='add'>+ if (chptr > 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 <= max; i++) {</div><div class='add'>+ doReflow(expandedText, NULL, i, &howbad, NULL);</div><div class='add'>+</div><div class='add'>+ if (minbad == -1 || howbad < 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, &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->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->lines) {</div><div class='add'>+ free(tb->lines);</div><div class='add'>+ tb->linesAlloced = tb->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->doWrap) {</div><div class='add'>+ doReflow(expanded, &reflowed, tb->textWidth, &badness, &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->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->linesAlloced++;</div><div class='add'>+ tb->lines = malloc(sizeof(char *) * tb->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->data;</div><div class='add'>+</div><div class='add'>+ if (len > tb->textWidth) len = tb->textWidth;</div><div class='add'>+</div><div class='add'>+ tb->lines[tb->numLines] = malloc(tb->textWidth + 1);</div><div class='add'>+ memset(tb->lines[tb->numLines], ' ', tb->textWidth); </div><div class='add'>+ memcpy(tb->lines[tb->numLines], s, len);</div><div class='add'>+ tb->lines[tb->numLines++][tb->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->data;</div><div class='add'>+ int size;</div><div class='add'>+</div><div class='add'>+ if (tb->sb) {</div><div class='add'>+ size = tb->numLines - c->height;</div><div class='add'>+ newtScrollbarSet(tb->sb, tb->topLine, size ? size : 0);</div><div class='add'>+ tb->sb->ops->draw(tb->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->topLine) < tb->numLines && i < c->height; i++) {</div><div class='add'>+ newtGotorc(c->top + i, c->left);</div><div class='add'>+ SLsmg_write_string(tb->lines[i + tb->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->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 && ev.event == EV_KEYPRESS && tb->sb) {</div><div class='add'>+ switch (ev.u.key) {</div><div class='add'>+ case NEWT_KEY_UP:</div><div class='add'>+ if (tb->topLine) tb->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->topLine < (tb->numLines - co->height)) tb->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->topLine += co->height;</div><div class='add'>+ if (tb->topLine > (tb->numLines - co->height)) {</div><div class='add'>+ tb->topLine = tb->numLines - co->height;</div><div class='add'>+ if (tb->topLine < 0) tb->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->topLine -= co->height;</div><div class='add'>+ if (tb->topLine < 0) tb->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 && ev.event == EV_MOUSE && tb->sb) {</div><div class='add'>+ /* Top scroll arrow */</div><div class='add'>+ if (ev.u.mouse.x == co->width && ev.u.mouse.y == co->top) {</div><div class='add'>+ if (tb->topLine) tb->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->width &&</div><div class='add'>+ ev.u.mouse.y == co->top + co->height - 1) {</div><div class='add'>+ if (tb->topLine < (tb->numLines - co->height)) tb->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->data;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < tb->numLines; i++) </div><div class='add'>+ free(tb->lines[i]);</div><div class='add'>+ free(tb->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&id=98a18b797c63ea9baab31768ed720ad32c0004e8'>mdk-stage1/newt/windows.c</a></div><div class='hunk'>@@ -0,0 +1,275 @@</div><div class='add'>+#include <errno.h></div><div class='add'>+#include <stdarg.h></div><div class='add'>+#include <stdio.h></div><div class='add'>+#include <stdlib.h></div><div class='add'>+#include <string.h></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 >= size || i == -1);</div><div class='add'>+</div><div class='add'>+ flowedText = newtReflowText(buf, 35, 5, 5, &width, &height);</div><div class='add'>+ if (height > 6) {</div><div class='add'>+ free(flowedText);</div><div class='add'>+ flowedText = newtReflowText(buf, 60, 5, 5, &width, &height);</div><div class='add'>+ }</div><div class='add'>+ free(buf);</div><div class='add'>+</div><div class='add'>+ if (height > 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, &b1, button2, &b2, </div><div class='add'>+ button3, &b3, NULL);</div><div class='add'>+ } else if (button2) {</div><div class='add'>+ buttonGrid = newtButtonBar(button1, &b1, button2, &b2, NULL);</div><div class='add'>+ } else {</div><div class='add'>+ buttonGrid = newtButtonBar(button1, &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 < maxListHeight) maxListHeight = i;</div><div class='add'>+ needScroll = i > 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 < 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] && rc < 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 < 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 < 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 < 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] && rc < 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&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 $< -o $@</div><div class='add'>+</div><div class='add'>+$(OBJS-DIET): %-DIET.o: %.c</div><div class='add'>+ gcc $(FLAGS) $(DIETLIBC_INCLUDES) -c $< -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&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 >= CHAR_TOKEN) && (x <= 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) <= DOT_TOKEN) && ((t) >= 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 >= FIRST_BINARY_OP) && (t <= 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 >= 0x50) && (t <= 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)>=FIRST_ASSIGN_TOKEN)&&((t)<=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__) && _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&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) && defined(HAVE_SIGEMPTYSET)</div><div class='add'>+# if defined(HAVE_SIGACTION) && 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) && !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&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&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 < MIN_KEYWORD_LEN)</div><div class='add'>+ || (len > 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 > MAX_HASH_VALUE) || (hash < MIN_HASH_VALUE))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ kw = &Keyword_Table[hash - MIN_HASH_VALUE];</div><div class='add'>+ if ((NULL != (name = kw->name))</div><div class='add'>+ && (*str == *name)</div><div class='add'>+ && (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&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&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 <math.h></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->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->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->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->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->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->cl_name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ return cl->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)->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)->v.array_val->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->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->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->cl_class_type != SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+#endif</div><div class='add'>+ (*cl->cl_destroy) (data_type, (VOID_STAR) &obj->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 >= _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 >= _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->data_type = type;</div><div class='add'>+ y->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 >= _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->data_type = type;</div><div class='add'>+ y->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->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'>+ && _SLarith_Is_Arith_Type [y->data_type]</div><div class='add'>+ && (_SLarith_Is_Arith_Type [type] >= _SLarith_Is_Arith_Type[y->data_type]))</div><div class='add'>+ {</div><div class='add'>+ /* This should not fail */</div><div class='add'>+ (void) _SLarith_typecast (y->data_type, (VOID_STAR)&y->v, 1, </div><div class='add'>+ type, (VOID_STAR)&obj->v);</div><div class='add'>+ obj->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->data_type != SLANG_ARRAY_TYPE)</div><div class='add'>+ || (y->v.array_val->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 > otop - _SLRun_Stack) || (n < 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 > 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)) <= 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 <= _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 > 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 > 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 < 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 <= 0)</div><div class='add'>+ return 0;</div><div class='add'>+ </div><div class='add'>+ top = _SLStack_Pointer;</div><div class='add'>+ if (top < _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 > _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 < top)</div><div class='add'>+ {</div><div class='add'>+ SLang_Class_Type *cl;</div><div class='add'>+ unsigned char data_type = bot->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->cl_push) (data_type, (VOID_STAR) &bot->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 >= 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 < 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 < 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 < 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'>+ && (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->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->data_type;</div><div class='add'>+ a_data_type = obja->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'>+ && _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, &c_cl, 1)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ c_data_type = c_cl->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) &obja->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) &objb->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->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->cl_name, b_cl->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->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->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 (&objb)) return;</div><div class='add'>+ if (0 == SLang_pop (&obja))</div><div class='add'>+ {</div><div class='add'>+ (void) do_binary_ab (op, &obja, &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 (&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 (&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->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, &b_cl, unary_type)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ b_type = b_cl->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) &obj->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->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->cl_name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ ret = (*b_cl->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->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 (&obj)) return -1;</div><div class='add'>+ ret = do_unary_op (op, &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 (&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 (&objb))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ ret = do_binary_ab (op, obja_ptr, &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 (&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->data_type == SLANG_INT_TYPE)</div><div class='add'>+ return SLclass_push_int_obj (SLANG_INT_TYPE, obja_ptr->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->data_type == SLANG_INT_TYPE)</div><div class='add'>+ return SLclass_push_int_obj (SLANG_INT_TYPE, obja_ptr->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->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->cl_sput == NULL)</div><div class='add'>+ || (cl->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->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->b.s_blk;</div><div class='add'>+ op = bc_blk->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 (&obj_A))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((-1 == _SLpush_slang_obj (&obj_A))</div><div class='add'>+ || (-1 == cl->cl_sget ((unsigned char) type, name))</div><div class='add'>+ || (-1 == SLang_pop (&obj)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&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, &obj))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&obj);</div><div class='add'>+ SLang_free_object (&obj_A);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+ SLang_free_object (&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 (&obj_A))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&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->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->data_type;</div><div class='add'>+ if (type == SLANG_ARRAY_TYPE)</div><div class='add'>+ type = a->v.array_val->data_type;</div><div class='add'>+ </div><div class='add'>+ u->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->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->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->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->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->data_type = SLANG_DOUBLE_TYPE;</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ u->v.double_val = 1;</div><div class='add'>+ break;</div><div class='add'>+#endif</div><div class='add'>+ default:</div><div class='add'>+ u->data_type = SLANG_INT_TYPE;</div><div class='add'>+ u->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, &op, &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 (&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 (&x)))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&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 (&y, &x))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&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, &y, &x))</div><div class='add'>+ {</div><div class='add'>+ SLang_free_object (&y);</div><div class='add'>+ SLang_free_object (&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 (&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 (&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->b.nt_ivar_blk;</div><div class='add'>+</div><div class='add'>+ intrinsic_type = ivar->type;</div><div class='add'>+ intrinsic_addr = ivar->addr;</div><div class='add'>+</div><div class='add'>+ op_type = bc_blk->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->cl_push) (intrinsic_type, intrinsic_addr))</div><div class='add'>+ || (-1 == SLang_pop (&obja)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ (void) perform_lvalue_operation (op_type, &obja);</div><div class='add'>+ SLang_free_object (&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->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->is_global == 0)</div><div class='add'>+ {</div><div class='add'>+ objp = ref->v.local_obj;</div><div class='add'>+ if (objp > 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->v.nt;</div><div class='add'>+ switch (nt->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'>+ &((SLang_Global_Var_Type *)nt)->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 (&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 (&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->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->bc_sub_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_LVARIABLE:</div><div class='add'>+ objp = (Local_Variable_Frame - bc_blk->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 = &bc_blk->b.nt_gvar_blk->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 (&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->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->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->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 >= 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 > 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 (&at, 1))</div><div class='add'>+ return NULL;</div><div class='add'>+ obj->data_type = SLANG_ARRAY_TYPE;</div><div class='add'>+ return obj->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->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)->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) &obj->v;</div><div class='add'>+ else if (type == SLANG_CLASS_TYPE_MMT)</div><div class='add'>+ return SLang_object_from_mmt (obj->v.ref);</div><div class='add'>+ else</div><div class='add'>+ return obj->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->i_fun;</div><div class='add'>+ argc = objf->num_args;</div><div class='add'>+ type = objf->return_type;</div><div class='add'>+ arg_types = objf->arg_types;</div><div class='add'>+</div><div class='add'>+ if (argc > 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->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 && (_SLang_Trace > 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 >= 0)</div><div class='add'>+ trace_dump (">>%s (%d args)\n",</div><div class='add'>+ objf->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 >= 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 ("<<%s (returning %d values)\n",</div><div class='add'>+ objf->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 < 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 < (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->cl_foreach == NULL)</div><div class='add'>+ || (cl->cl_foreach_open == NULL)</div><div class='add'>+ || (cl->cl_foreach_close == NULL))</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_NOT_IMPLEMENTED, "%s does not permit foreach", cl->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->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->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->cl_foreach) ((unsigned char) type, foreach_context);</div><div class='add'>+ if (status <= 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->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->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]->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 (&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 (&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 (&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 (&ctrl))</div><div class='add'>+ || (-1 == SLang_pop_integer (&last))</div><div class='add'>+ || (-1 == SLang_pop_integer (&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 >= 0)</div><div class='add'>+ {</div><div class='add'>+ if (i > last) break;</div><div class='add'>+ }</div><div class='add'>+ else if (i < 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 (&ctrl))</div><div class='add'>+ goto return_error;</div><div class='add'>+ while (ctrl > 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 <= addr_max)</div><div class='add'>+ {</div><div class='add'>+ if (addr->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->b.blk);</div><div class='add'>+ if (SLang_Error</div><div class='add'>+ || Lang_Break_Condition</div><div class='add'>+ || (-1 == pop_ctrl_integer (&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) && (test == 0))</div><div class='add'>+ * || ((stype == _SLANG_BCST_ORELSE) && 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 (&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->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->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->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->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->nlocals == AUTOLOAD_NUM_LOCALS)</div><div class='add'>+ {</div><div class='add'>+ header = NULL;</div><div class='add'>+ if (-1 == SLang_load_file(fun->v.autoload_filename))</div><div class='add'>+ goto the_return;</div><div class='add'>+</div><div class='add'>+ if (fun->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->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) > 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->v.header;</div><div class='add'>+ header->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->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->nargs;</div><div class='add'>+ while (i > 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'>+ && (0 == strcmp (Trace_Function, _SLang_Current_Function_Name))</div><div class='add'>+ && (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 (">>%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->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->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 ("<<%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->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->name, n_locals,</div><div class='add'>+#if _SLANG_HAS_DEBUG_CODE</div><div class='add'>+ fun->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 > 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->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->num_refs == 1)</div><div class='add'>+ free_function_header (header);</div><div class='add'>+ else</div><div class='add'>+ header->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 < 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 < 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->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->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) >= 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->unary_op, nt->name_type))</div><div class='add'>+ do_traceback (nt->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->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->is_global == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Object_Type *obj = ref->v.local_obj;</div><div class='add'>+ if (obj > 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->v.local_obj);</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ (void) inner_interp_nametype (ref->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->is_global == 0)</div><div class='add'>+ {</div><div class='add'>+ SLang_Object_Type *obj = ref->v.local_obj;</div><div class='add'>+ if (obj > 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->v.local_obj->data_type;</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ {</div><div class='add'>+ SLang_Name_Type *nt = ref->v.nt;</div><div class='add'>+ if ((nt->name_type != SLANG_GVARIABLE)</div><div class='add'>+ && (nt->name_type != SLANG_PVARIABLE))</div><div class='add'>+ return 1;</div><div class='add'>+ type = ((SLang_Global_Var_Type *)nt)->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->is_global == 0)</div><div class='add'>+ {</div><div class='add'>+ obj = ref->v.local_obj;</div><div class='add'>+ if (obj > 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->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->v.nt;</div><div class='add'>+ if ((nt->name_type != SLANG_GVARIABLE)</div><div class='add'>+ && (nt->name_type != SLANG_PVARIABLE))</div><div class='add'>+ return -1;</div><div class='add'>+ obj = &((SLang_Global_Var_Type *)nt)->obj;</div><div class='add'>+ }</div><div class='add'>+ SLang_free_object (obj);</div><div class='add'>+ obj->data_type = SLANG_UNDEFINED_TYPE;</div><div class='add'>+ obj->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 <= 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->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->cl_push) (subtype, (VOID_STAR) &obj->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->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->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->cl_push) (subtype, (VOID_STAR) &obj->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->type;</div><div class='add'>+ cl = _SLclass_get_class (stype);</div><div class='add'>+</div><div class='add'>+ if (-1 == (*cl->cl_push_intrinsic) (stype, ivar->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 (&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->cl_dereference)(type, (VOID_STAR) &obj.v);</div><div class='add'>+</div><div class='add'>+ SLang_free_object (&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 < Switch_Objects)</div><div class='add'>+ || (0 == (type = swobjptr->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 (&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, &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 (&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, &obj);</div><div class='add'>+ SLang_free_object (&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->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 = &addr->b.nt_gvar_blk->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->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->data_type = SLANG_UNDEFINED_TYPE;</div><div class='add'>+ obj->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 < 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->b.blk);</div><div class='add'>+</div><div class='add'>+ if (Last_Error <= 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 >= addr_start)</div><div class='add'>+ {</div><div class='add'>+ if (addr->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->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 < 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 < 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->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->bc_main_type;</div><div class='add'>+</div><div class='add'>+ Bytecodes[(x << 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->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->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 (&addr->b.nt_gvar_blk->obj))</div><div class='add'>+ do_name_type_error (addr->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->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->b.nt_ifun_blk);</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ do_traceback(addr->b.nt_ifun_blk->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->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->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->b.iconst_blk->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->b.dconst_blk->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 (&addr->b.nt_gvar_blk->obj))</div><div class='add'>+ do_name_type_error (addr->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->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->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->bc_sub_type);</div><div class='add'>+ (*cl->cl_push_literal) (addr->bc_sub_type, (VOID_STAR) &addr->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->bc_sub_type, (int) addr->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->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->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->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->bc_sub_type - _SLANG_BCST_USER_BLOCK0] = addr->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->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 (&i)) && (i == 0))</div><div class='add'>+ inner_interp (addr->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 (&i)) && i)</div><div class='add'>+ inner_interp (addr->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'>+ && (block <= addr)</div><div class='add'>+ && (Lang_Break_Condition == 0)</div><div class='add'>+ && (0 == inner_interp (block->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->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->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 (&test))</div><div class='add'>+ && (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->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->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->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->bc_main_type - _SLANG_BC_X_USER0] != NULL)</div><div class='add'>+ {</div><div class='add'>+ inner_interp(User_Block_Ptr[addr->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->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->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->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->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->bc_sub_type, Local_Variable_Frame - addr->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->bc_sub_type, &addr->b.nt_gvar_blk->obj))</div><div class='add'>+ do_name_type_error (addr->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->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->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->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->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->bc_sub_type, (int) addr->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->bc_sub_type, (int) addr->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->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->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->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ execute_intrinsic_fun (addr->b.nt_ifun_blk);</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ do_traceback(addr->b.nt_ifun_blk->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->b.nt_ifun_blk);</div><div class='add'>+ if (SLang_Error)</div><div class='add'>+ {</div><div class='add'>+ do_traceback(addr->b.nt_ifun_blk->name, 0, NULL);</div><div class='add'>+ break;</div><div class='add'>+ }</div><div class='add'>+ addr++;</div><div class='add'>+ (*addr->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->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ _SLang_dup_and_push_slstring (addr->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->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ execute_slang_fun (addr->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->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->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->b.nt_ifun_blk->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->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ push_local_variable (addr->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->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ SLclass_push_int_obj (addr->bc_sub_type, (int) addr->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->b.call_function) ();</div><div class='add'>+ addr++;</div><div class='add'>+ push_local_variable (addr->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->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->bc_main_type)</div><div class='add'>+ {</div><div class='add'>+ case _SLANG_BC_BLOCK:</div><div class='add'>+ if (lang_free_branch(p->b.blk))</div><div class='add'>+ SLfree((char *)p->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->bc_sub_type);</div><div class='add'>+ (*cl->cl_byte_code_destroy) (p->bc_sub_type, (VOID_STAR) &p->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->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->num_refs > 1)</div><div class='add'>+ {</div><div class='add'>+ h->num_refs--;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if (h->body != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (lang_free_branch (h->body))</div><div class='add'>+ SLfree ((char *) h->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->block = This_Compile_Block;</div><div class='add'>+ c->block_ptr = Compile_ByteCode_Ptr;</div><div class='add'>+ c->block_max = This_Compile_Block_Max;</div><div class='add'>+ c->block_type = This_Compile_Block_Type;</div><div class='add'>+ c->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->block;</div><div class='add'>+ This_Compile_Block_Max = c->block_max;</div><div class='add'>+ This_Compile_Block_Type = c->block_type;</div><div class='add'>+ Compile_ByteCode_Ptr = c->block_ptr;</div><div class='add'>+ This_Static_NameSpace = c->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->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->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->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->name[0])</div><div class='add'>+ && (0 == strcmp (t->name + 1, name)))</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ t = t->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] != '>'))</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->table, Global_NameSpace->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->table, table->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->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'>+ && (NULL != (t = locate_name_in_table (name, hash, This_Static_NameSpace->table, This_Static_NameSpace->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->table, Global_NameSpace->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->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->name_type = name_type;</div><div class='add'>+</div><div class='add'>+ hash = hash % table_size;</div><div class='add'>+ t->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->table;</div><div class='add'>+ table_size = ns->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->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 > 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->i_fun = addr;</div><div class='add'>+ f->num_args = nargs;</div><div class='add'>+ f->return_type = ret_type;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < nargs; i++)</div><div class='add'>+ f->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->addr = addr;</div><div class='add'>+ v->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'>+ && (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->v.header != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (f->nlocals == AUTOLOAD_NUM_LOCALS)</div><div class='add'>+ SLang_free_slstring ((char *)f->v.autoload_filename); /* autoloaded filename */</div><div class='add'>+ else</div><div class='add'>+ free_function_header (f->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->file != NULL) SLang_free_slstring (f->file);</div><div class='add'>+ f->file = file;</div><div class='add'>+#endif</div><div class='add'>+ f->v.header = h;</div><div class='add'>+ f->nlocals = num_locals;</div><div class='add'>+ f->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->table, Global_NameSpace->table_size);</div><div class='add'>+</div><div class='add'>+ if ((f != NULL)</div><div class='add'>+ && (f->name_type == SLANG_FUNCTION)</div><div class='add'>+ && (f->v.header != NULL)</div><div class='add'>+ && (f->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->table, </div><div class='add'>+ Global_NameSpace->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 < 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->name);</div><div class='add'>+ t1 = t->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->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->is_global)</div><div class='add'>+ {</div><div class='add'>+ SLang_Name_Type *nt = ref->v.nt;</div><div class='add'>+</div><div class='add'>+ switch (nt->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 &%s", </div><div class='add'>+ nt->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->name_type;</div><div class='add'>+ name = nt->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->name_type == SLANG_FUNCTION)</div><div class='add'>+ || (entry->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->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->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)->bc_main_type == 0)</div><div class='add'>+ {</div><div class='add'>+ (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_INTRSTOP;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ (b-1)->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)->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)->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)->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)->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)->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->bc_main_type)</div><div class='add'>+ {</div><div class='add'>+ case _SLANG_BC_CALL_DIRECT:</div><div class='add'>+ (b-1)->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)->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)->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->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->num_refs = 1;</div><div class='add'>+ h->body = This_Compile_Block;</div><div class='add'>+ </div><div class='add'>+#if USE_COMBINED_BYTECODES</div><div class='add'>+ optimize_block (h->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->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->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'>+ && (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->bc_main_type = _SLANG_BC_BLOCK;</div><div class='add'>+ node->bc_sub_type = 0;</div><div class='add'>+ node->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 < 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->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->table, ns->table_size);</div><div class='add'>+</div><div class='add'>+ if (g != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (g->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 >= 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->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'>+ && (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 < 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->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->bc_main_type = mt;</div><div class='add'>+ Compile_ByteCode_Ptr->b.i_blk = op;</div><div class='add'>+ Compile_ByteCode_Ptr->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->bc_main_type = _SLANG_BC_BINARY;</div><div class='add'>+ Compile_ByteCode_Ptr->b.i_blk = op;</div><div class='add'>+ Compile_ByteCode_Ptr->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->bc_main_type == last_bc)</div><div class='add'>+ {</div><div class='add'>+ Compile_ByteCode_Ptr = b;</div><div class='add'>+ b->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->bc_main_type = nt->main_type;</div><div class='add'>+ Compile_ByteCode_Ptr->b.ptr_blk = nt->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->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->b.s_blk = name;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL_STR;</div><div class='add'>+ Compile_ByteCode_Ptr->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->b.l_blk = (long) tok->line_number;</div><div class='add'>+#endif</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL;</div><div class='add'>+ Compile_ByteCode_Ptr->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->name != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (strcmp (name, nt->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->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->name_type;</div><div class='add'>+ Compile_ByteCode_Ptr->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->b.i_blk = ((SLang_Local_Var_Type *) entry)->local_var_number;</div><div class='add'>+ else</div><div class='add'>+ Compile_ByteCode_Ptr->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->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->b.i_blk = ((SLang_Local_Var_Type *) entry)->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->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->bc_main_type = _SLANG_BC_TMP;</div><div class='add'>+ Compile_ByteCode_Ptr->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->bc_main_type = main_type;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_sub_type = 0;</div><div class='add'>+ Compile_ByteCode_Ptr->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->b.call_function = f;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = byte_code;</div><div class='add'>+ Compile_ByteCode_Ptr->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->b.l_blk = i;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = bc_main_type;</div><div class='add'>+ Compile_ByteCode_Ptr->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", &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->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->bc_main_type = _SLANG_BC_LITERAL;</div><div class='add'>+ Compile_ByteCode_Ptr->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", &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->b.float_blk = x;</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL;</div><div class='add'>+ Compile_ByteCode_Ptr->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->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->bc_main_type = _SLANG_BC_LITERAL_STR;</div><div class='add'>+ Compile_ByteCode_Ptr->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->b.bs_blk = SLbstring_dup (s)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL;</div><div class='add'>+ Compile_ByteCode_Ptr->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->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'>+ && (-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->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->b.i_blk = ((SLang_Local_Var_Type *) v)->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->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)->type);</div><div class='add'>+ if (cl->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->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->bc_sub_type = assign_type;</div><div class='add'>+ Compile_ByteCode_Ptr->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->name_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_LVARIABLE:</div><div class='add'>+ Compile_ByteCode_Ptr->b.i_blk = ((SLang_Local_Var_Type *) v)->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->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->bc_sub_type = v->name_type;</div><div class='add'>+ Compile_ByteCode_Ptr->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->bc_sub_type = _SLANG_BCST_ASSIGN + (t->type - _STRUCT_ASSIGN_TOKEN);</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_SET_STRUCT_LVALUE;</div><div class='add'>+ Compile_ByteCode_Ptr->b.s_blk = _SLstring_dup_hashed_string (t->v.s_val, t->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->bc_sub_type = _SLANG_BCST_ASSIGN + (t->type - _ARRAY_ASSIGN_TOKEN);</div><div class='add'>+ Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_SET_ARRAY_LVALUE;</div><div class='add'>+ Compile_ByteCode_Ptr->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->bc_main_type = _SLANG_BC_FIELD;</div><div class='add'>+ Compile_ByteCode_Ptr->b.s_blk = _SLstring_dup_hashed_string(t->v.s_val, t->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->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->b.i_blk = ((SLang_Local_Var_Type *)entry)->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->b.nt_blk = entry;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ Compile_ByteCode_Ptr->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'>+ && (Lang_Defining_Function == 0))</div><div class='add'>+ || (requires_block</div><div class='add'>+ && (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->bc_main_type = break_type;</div><div class='add'>+ Compile_ByteCode_Ptr->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->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'>+ && (NULL != locate_name_in_table (t->v.s_val, t->hash, This_Static_NameSpace->table, This_Static_NameSpace->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->v.s_val);</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ add_global_variable (t->v.s_val, SLANG_GVARIABLE, t->hash, Global_NameSpace);</div><div class='add'>+ }</div><div class='add'>+ else if (t->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->type == IDENT_TOKEN)</div><div class='add'>+ add_local_variable (t->v.s_val, t->hash);</div><div class='add'>+ else if (t->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->type == IDENT_TOKEN)</div><div class='add'>+ add_global_variable (t->v.s_val, SLANG_GVARIABLE, t->hash, This_Static_NameSpace);</div><div class='add'>+ else if (t->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->type == IDENT_TOKEN)</div><div class='add'>+ add_global_variable (t->v.s_val, SLANG_PVARIABLE, t->hash, This_Static_NameSpace);</div><div class='add'>+ else if (t->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->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->v.s_val, SLANG_FUNCTION, t->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)->b.blk;</div><div class='add'>+</div><div class='add'>+ while (0 != (t = p->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->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->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->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->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->v.s_val, t->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->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->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->v.s_val, t->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->v.s_val, t->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->v.s_val, t->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->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->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->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->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->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->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->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->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->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->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->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->v.s_val, t->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->v.s_val, (unsigned int) t->hash));</div><div class='add'>+ break;</div><div class='add'>+</div><div class='add'>+ case BSTRING_TOKEN:</div><div class='add'>+ compile_bstring (t->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->type - _SCALAR_ASSIGN_TOKEN),</div><div class='add'>+ t->v.s_val, t->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->v.s_val, t->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->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->v.s_val, t->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->v.s_val, t->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->v.s_val, t->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->v.s_val, t->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->bc_main_type = _SLANG_BC_LINE_NUM;</div><div class='add'>+ Compile_ByteCode_Ptr->b.l_blk = t->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->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->static_namespace;</div><div class='add'>+ Compile_Context_Stack = cc->next;</div><div class='add'>+ Default_Variable_Mode = cc->compile_variable_mode;</div><div class='add'>+ Default_Define_Function = cc->define_function;</div><div class='add'>+ Compile_Mode_Function = cc->compile_mode_function;</div><div class='add'>+</div><div class='add'>+ Lang_Defining_Function = cc->lang_defining_function;</div><div class='add'>+ Local_Variable_Number = cc->local_variable_number;</div><div class='add'>+ Function_Args_Number = cc->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->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->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'>+ && (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->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->static_namespace = This_Static_NameSpace;</div><div class='add'>+ cc->compile_variable_mode = Default_Variable_Mode;</div><div class='add'>+ cc->define_function = Default_Define_Function;</div><div class='add'>+ cc->locals_hash_table = Locals_Hash_Table;</div><div class='add'>+</div><div class='add'>+ cc->lang_defining_function = Lang_Defining_Function;</div><div class='add'>+ cc->local_variable_number = Local_Variable_Number;</div><div class='add'>+ cc->function_args_number = Function_Args_Number;</div><div class='add'>+ cc->locals_hash_table = Locals_Hash_Table;</div><div class='add'>+ cc->compile_mode_function = Compile_Mode_Function;</div><div class='add'>+</div><div class='add'>+ cc->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->table;</div><div class='add'>+ table_size = ns->table_size;</div><div class='add'>+ </div><div class='add'>+ if ((pp_name != NULL)</div><div class='add'>+ && (-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->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->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->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->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->namespace_name == NULL)</div><div class='add'>+ return "";</div><div class='add'>+ </div><div class='add'>+ return This_Static_NameSpace->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&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__) && 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 <stdio.h></div><div class='add'>+#include <stdarg.h></div><div class='add'>+#if defined(__STDC__) || defined(__BORLANDC__) || defined(__cplusplus)</div><div class='add'>+# include <stddef.h> /* 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__) && !defined(DOS386)</div><div class='add'>+# include <dos.h></div><div class='add'>+#endif</div><div class='add'>+</div><div class='add'>+#if defined(__BORLANDC__)</div><div class='add'>+# include <alloc.h></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_) && 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) && !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) && !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 --> 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 > 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) & 0xFF)</div><div class='add'>+#define SLSMG_EXTRACT_COLOR(x) (((x)>>8)&0xFF)</div><div class='add'>+#define SLSMG_BUILD_CHAR(ch,color) (((SLsmg_Char_Type)(unsigned char)(ch))|((color)<<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 '<'</div><div class='add'>+# define SLSMG_RARROW_CHAR '>'</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 > 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 *)&((T *)0L)->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&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 <math.h></div><div class='add'>+</div><div class='add'>+#ifdef HAVE_LOCALE_H</div><div class='add'>+# include <locale.h></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 < 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->copy_function copies type i to type j. Similarly,</div><div class='add'>+ * B_ij->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) > 0) ? 1 : (((x) < 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) > 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) >= 0) ? (a) : -(a))</div><div class='add'>+#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 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) > 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) > 0) ? 1 : (((x) < 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) > 0) ? 1 : (((x) < 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) > 0) ? 1 : (((x) < 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) > 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) > 0) ? 1 : (((x) < 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) > 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) <= MAXIMUM_ARITH_TYPE_VALUE) \</div><div class='add'>+ && (Type_Precedence_Table[x] < 8) && (Type_Precedence_Table[x] != -1))</div><div class='add'>+#define IS_ARITHMETIC_TYPE(x) \</div><div class='add'>+ (((x) <= MAXIMUM_ARITH_TYPE_VALUE) && (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 > 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] > 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'>+ && (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'>+ && (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 (&obj))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((obj.data_type > MAXIMUM_ARITH_TYPE_VALUE)</div><div class='add'>+ || ((j = Type_Precedence_Table[obj.data_type]) == -1)</div><div class='add'>+ || (j >= 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 (&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)&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)&obj.v, ptr, 1);</div><div class='add'>+</div><div class='add'>+ return SLang_push (&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, &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 (&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 (&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 (&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 < 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) && 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 < 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->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->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->cl_push_literal = info->push_literal;</div><div class='add'>+ cl->cl_to_bool = integer_to_bool;</div><div class='add'>+</div><div class='add'>+ cl->cl_cmp = info->cmp_fun;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLclass_register_class (cl, info->data_type, info->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->data_type, info->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->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->cl_byte_code_destroy = double_byte_code_destroy;</div><div class='add'>+ cl->cl_push_literal = double_push_literal;</div><div class='add'>+ cl->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->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 <= 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 <= 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 >= FLOAT_PRECEDENCE_VALUE)</div><div class='add'>+ || (i < 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->data_type;</div><div class='add'>+ ib = b->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 > 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->data_type = d->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) &c->v, (VOID_STAR)&a->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) &d->v, (VOID_STAR)&b->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->data_type;</div><div class='add'>+ b_type = ob->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'>+ && (b_type == SLANG_DOUBLE_TYPE))</div><div class='add'>+ return double_double_scalar_bin_op (oa->v.int_val, ob->v.double_val, op);</div><div class='add'>+</div><div class='add'>+ if ((a_type == SLANG_DOUBLE_TYPE)</div><div class='add'>+ && (b_type == SLANG_INT_TYPE))</div><div class='add'>+ return double_double_scalar_bin_op (oa->v.double_val, ob->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, &obj_a, &obj_b);</div><div class='add'>+ oa = &obj_a;</div><div class='add'>+ ob = &obj_b;</div><div class='add'>+ </div><div class='add'>+ a_type = oa->data_type;</div><div class='add'>+ b_type = ob->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->v.char_val, ob->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->v.uchar_val, ob->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->v.short_val, ob->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->v.ushort_val, ob->v.ushort_val, op);</div><div class='add'>+# else</div><div class='add'>+ return int_int_scalar_bin_op ((int)oa->v.ushort_val, (int)ob->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->v.int_val, ob->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->v.uint_val, ob->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->v.long_val, ob->v.long_val, op);</div><div class='add'>+ case SLANG_ULONG_TYPE:</div><div class='add'>+ return ulong_ulong_scalar_bin_op (oa->v.ulong_val, ob->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->v.float_val, ob->v.float_val, op);</div><div class='add'>+ case SLANG_DOUBLE_TYPE:</div><div class='add'>+ return double_double_scalar_bin_op (oa->v.double_val, ob->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&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 < 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 < 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 > 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 < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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 < 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 < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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 < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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 < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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 < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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 < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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 < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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_BXOR:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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 < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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 < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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_SHR:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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'>+#endif /* GENERIC_BIT_OPERATIONS */</div><div class='add'>+ case SLANG_EQ:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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 < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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 < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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_GE:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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_LT:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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_LE:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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_OR:</div><div class='add'>+#if _SLANG_OPTIMIZE_FOR_SPEED < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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 < 2</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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'>+ 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 & 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 << b);</div><div class='add'>+ case SLANG_SHR:</div><div class='add'>+ return PUSH_SCALAR_OBJ_FUN (a >> b);</div><div class='add'>+#endif</div><div class='add'>+ case SLANG_GT: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a > b));</div><div class='add'>+ case SLANG_LT: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a < b));</div><div class='add'>+ case SLANG_GE: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a >= b));</div><div class='add'>+ case SLANG_LE: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a <= 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 && 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 > 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&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, &one, 1)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == at->cl->cl_apop ((unsigned char) type, at->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->dims;</div><div class='add'>+ num_dims = at->num_dims;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 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 < 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->data + (ofs * at->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->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->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->cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+ || (cl->cl_class_type == SLANG_CLASS_TYPE_VECTOR))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ f = cl->cl_destroy;</div><div class='add'>+ sizeof_type = cl->cl_sizeof_type;</div><div class='add'>+ type = cl->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->cl->cl_destroy) (at->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->cl->cl_init_array_object) (at->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->num_elements == 0)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ max_dims = at->dims;</div><div class='add'>+ num_dims = at->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->num_refs > 1)</div><div class='add'>+ {</div><div class='add'>+ at->num_refs -= 1;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ data = at->data;</div><div class='add'>+ flags = at->flags;</div><div class='add'>+</div><div class='add'>+ if (flags & SLARR_DATA_VALUE_IS_INTRINSIC)</div><div class='add'>+ return; /* not to be freed */</div><div class='add'>+</div><div class='add'>+ if (flags & 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 > 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 < num_dims; i++)</div><div class='add'>+ {</div><div class='add'>+ if (dims[i] < 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->data_type = type;</div><div class='add'>+ at->cl = cl;</div><div class='add'>+ at->num_dims = num_dims;</div><div class='add'>+ at->num_refs = 1;</div><div class='add'>+</div><div class='add'>+ if (read_only) at->flags = SLARR_DATA_VALUE_IS_READ_ONLY;</div><div class='add'>+ switch (cl->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->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 < num_dims; i++)</div><div class='add'>+ {</div><div class='add'>+ at->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 < SLARRAY_MAX_DIMS)</div><div class='add'>+ at->dims[i++] = 1;</div><div class='add'>+</div><div class='add'>+ at->num_elements = num_elements;</div><div class='add'>+ at->index_fun = linear_get_data_addr;</div><div class='add'>+ at->sizeof_type = sizeof_type = cl->cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+ if (data != NULL)</div><div class='add'>+ {</div><div class='add'>+ at->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->data = data;</div><div class='add'>+</div><div class='add'>+ if ((cl->cl_init_array_object != NULL)</div><div class='add'>+ && (-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 > 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 < 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->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 > 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 (&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->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->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 (&type))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ anew = (_SLclass_get_class (type))->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->cl;</div><div class='add'>+ if ((at->flags & SLARR_DATA_VALUE_IS_POINTER)</div><div class='add'>+ && (*(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->cl_name);</div><div class='add'>+ return -1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ return (*cl->cl_apush)(at->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->flags & 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->data;</div><div class='add'>+ xmin = range->first_index;</div><div class='add'>+ dx = range->delta;</div><div class='add'>+</div><div class='add'>+ imax = at->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 < 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->data = (VOID_STAR) data;</div><div class='add'>+ at->flags &= ~SLARR_DATA_VALUE_IS_RANGE;</div><div class='add'>+ at->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 < num_indices; i++)</div><div class='add'>+ {</div><div class='add'>+ obj = index_objs + i;</div><div class='add'>+ if (obj->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 >= 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->data_type == SLANG_ARRAY_TYPE)</div><div class='add'>+ {</div><div class='add'>+ SLang_Array_Type *at = obj->v.array_val;</div><div class='add'>+</div><div class='add'>+ if (at->num_dims == 1)</div><div class='add'>+ {</div><div class='add'>+ if ((num_indices == 1)</div><div class='add'>+ && (0 == (at->flags & 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->num_elements;</div><div class='add'>+ indices = (int *) ind_at->data;</div><div class='add'>+ indices_max = indices + ind_at->num_elements;</div><div class='add'>+</div><div class='add'>+ while (indices < 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 >= 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->data_type;</div><div class='add'>+ cl = at->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->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->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->data_type, 0, NULL, ind_at->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->data;</div><div class='add'>+ indices_max = indices + ind_at->num_elements;</div><div class='add'>+</div><div class='add'>+ src_data = (unsigned char *) at->data;</div><div class='add'>+ new_data = (unsigned char *) new_at->data;</div><div class='add'>+ sizeof_type = new_at->sizeof_type;</div><div class='add'>+ is_ptr = (new_at->flags & SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+</div><div class='add'>+ while (indices < 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->num_dims)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM, "Array requires %u indices", at->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 < 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->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->data_type == SLANG_INT_TYPE)</div><div class='add'>+ {</div><div class='add'>+ range_buf [i] = min_index = max_index = obj->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->v.array_val;</div><div class='add'>+</div><div class='add'>+ if (ind_at->flags & 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->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->first_index) < 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->last_index) < 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->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 > 0)</div><div class='add'>+ {</div><div class='add'>+ if (first_index > 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 <= 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 < 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 >= 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->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->data;</div><div class='add'>+ tmp_max = tmp + ind_at->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 < tmp_max)</div><div class='add'>+ {</div><div class='add'>+ if (max_index > *tmp)</div><div class='add'>+ max_index = *tmp;</div><div class='add'>+ if (min_index < *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) && (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 < 0)</div><div class='add'>+ max_index += at_dims_i;</div><div class='add'>+ if (min_index < 0)</div><div class='add'>+ min_index += at_dims_i;</div><div class='add'>+</div><div class='add'>+ if ((min_index < 0) || (min_index >= at_dims_i)</div><div class='add'>+ || (max_index < 0) || (max_index >= 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->%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, &num_elements, &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->flags & SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+ sizeof_type = at->sizeof_type;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (at->data_type);</div><div class='add'>+</div><div class='add'>+ if ((is_array == 0) && (num_elements == 1))</div><div class='add'>+ {</div><div class='add'>+ new_data = (char *)cl->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->data_type, 0, NULL, &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->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 < 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 < num_indices; i++)</div><div class='add'>+ {</div><div class='add'>+ if (is_dim_array[i]) /* was: (max_dims[i] > 1) */</div><div class='add'>+ {</div><div class='add'>+ new_at->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->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 && (*(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->cl_apush) (at->data_type, (VOID_STAR)new_data);</div><div class='add'>+ (*cl->cl_adestroy) (at->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, &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->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 (&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->data, at->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 (&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->data, at->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 > 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 (&at, 1))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (-1 == pop_indices (index_objs, num_indices, &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 < 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 (&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 (&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 (&i))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (i < 0) i = i + (int)len;</div><div class='add'>+ if ((unsigned int) i > 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 (&bs))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (NULL == (s = SLbstring_get_pointer (bs, &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 (&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)->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->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'>+ && (data_type != SLANG_ANY_TYPE)</div><div class='add'>+ && (SLANG_ARRAY_TYPE == SLang_peek_at_stack ()))</div><div class='add'>+ {</div><div class='add'>+ if (-1 == SLang_pop_array (&at, 0))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((at->num_elements != num_elements)</div><div class='add'>+#if 0</div><div class='add'>+ || (at->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->data;</div><div class='add'>+ *data_increment = at->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->cl_transfer_buf;</div><div class='add'>+</div><div class='add'>+ if (-1 == (*cl->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, &num_elements, &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->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'>+ &bt, &data_to_put, &data_increment))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ sizeof_type = at->sizeof_type;</div><div class='add'>+ is_ptr = (at->flags & 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 < 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->cl_destroy) (cl->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->sizeof_type;</div><div class='add'>+</div><div class='add'>+ cl = at->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->num_elements, 1,</div><div class='add'>+ &bt, &data_to_put, &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->data;</div><div class='add'>+ indices_max = indices + ind_at->num_elements;</div><div class='add'>+</div><div class='add'>+ is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+ dest_data = (char *) at->data;</div><div class='add'>+</div><div class='add'>+ ret = -1;</div><div class='add'>+ while (indices < 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->cl_destroy) (cl->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)->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 (&at, 0))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (at->flags & 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->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, &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, &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 (&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 > *b) return 1;</div><div class='add'>+ if (*a < *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->cl;</div><div class='add'>+</div><div class='add'>+ if ((SLang_Error == 0)</div><div class='add'>+ && (NULL != (a_data = get_data_addr (Sort_Array, a)))</div><div class='add'>+ && (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->flags & SLARR_DATA_VALUE_IS_POINTER)</div><div class='add'>+ && ((*(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->cl_name);</div><div class='add'>+ }</div><div class='add'>+ else if (0 == (*cl->cl_cmp)(Sort_Array->data_type, a_data, b_data, &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 > *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->num_elements;</div><div class='add'>+</div><div class='add'>+ if (at_str->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->data;</div><div class='add'>+ for (i = 0; i < n; i++) indx[i] = i;</div><div class='add'>+</div><div class='add'>+ if (n > 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 (&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 (&at, 1))</div><div class='add'>+ return;</div><div class='add'>+ if (at->cl->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->cl->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, &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->num_elements * at->sizeof_type;</div><div class='add'>+ bs = SLbstring_create ((unsigned char *)at->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 (&s)) return;</div><div class='add'>+</div><div class='add'>+ if (-1 == SLang_pop_array (&at, 0))</div><div class='add'>+ goto free_and_return;</div><div class='add'>+</div><div class='add'>+ if (at->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->num_elements;</div><div class='add'>+ if (n > 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->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 (&at, 1))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ num_dims = (int)at->num_dims;</div><div class='add'>+</div><div class='add'>+ if (NULL != (bt = SLang_create_array (SLANG_INT_TYPE, 0, NULL, &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->dims;</div><div class='add'>+ bdata = (int *) bt->data;</div><div class='add'>+ for (i = 0; i < 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->num_dims);</div><div class='add'>+ (void) _SLang_push_datatype (at->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->data;</div><div class='add'>+</div><div class='add'>+ if (d < 0)</div><div class='add'>+ d += at->dims[0];</div><div class='add'>+</div><div class='add'>+ value = r->first_index + d * r->delta;</div><div class='add'>+ return (VOID_STAR) &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->delta = delta;</div><div class='add'>+ dims = 0;</div><div class='add'>+</div><div class='add'>+ if (xminptr != NULL)</div><div class='add'>+ data->first_index = *xminptr;</div><div class='add'>+ else</div><div class='add'>+ data->first_index = 0;</div><div class='add'>+</div><div class='add'>+ if (xmaxptr != NULL)</div><div class='add'>+ data->last_index = *xmaxptr;</div><div class='add'>+ else</div><div class='add'>+ data->last_index = -1;</div><div class='add'>+</div><div class='add'>+/* if ((xminptr != NULL) && (xmaxptr != NULL))</div><div class='add'>+ { */</div><div class='add'>+ idims = 1 + (data->last_index - data->first_index) / delta;</div><div class='add'>+ if (idims > 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, &dims, 1)))</div><div class='add'>+ return NULL;</div><div class='add'>+</div><div class='add'>+ at->index_fun = range_get_data_addr;</div><div class='add'>+ at->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 < 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 <= 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 > 0.0)</div><div class='add'>+ {</div><div class='add'>+ if (last >= xmax)</div><div class='add'>+ n -= 1;</div><div class='add'>+ }</div><div class='add'>+ else if (last <= 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, &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->data;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 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->data;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 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 < 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] ? &double_vals[0] : NULL),</div><div class='add'>+ (has_vals[1] ? &double_vals[1] : NULL),</div><div class='add'>+ (has_vals[2] ? &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] ? &int_vals[0] : NULL),</div><div class='add'>+ (has_vals[1] ? &int_vals[1] : NULL),</div><div class='add'>+ (has_vals[2] ? &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 (&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->num_elements;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ type = arrays[0]->data_type;</div><div class='add'>+ max_dims = min_dims = arrays[0]->num_dims;</div><div class='add'>+ min_rows = max_rows = arrays[0]->dims[0];</div><div class='add'>+</div><div class='add'>+ for (i = 1; i < 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->num_dims;</div><div class='add'>+ if (num > max_dims) max_dims = num;</div><div class='add'>+ if (num < min_dims) min_dims = num;</div><div class='add'>+</div><div class='add'>+ num = bt->dims[0];</div><div class='add'>+ if (num > max_rows) max_rows = num;</div><div class='add'>+ if (num < min_rows) min_rows = num;</div><div class='add'>+</div><div class='add'>+ if (type == bt->data_type)</div><div class='add'>+ continue;</div><div class='add'>+</div><div class='add'>+ if (1 != _SLarray_typecast (bt->data_type, (VOID_STAR) &bt, 1,</div><div class='add'>+ type, (VOID_STAR) &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, &num_elements, 1)))</div><div class='add'>+ goto free_and_return;</div><div class='add'>+</div><div class='add'>+ is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER);</div><div class='add'>+ sizeof_type = at->sizeof_type;</div><div class='add'>+ dest_data = (char *) at->data;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 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->data;</div><div class='add'>+ num_elements = bt->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) && (max_dims == 1) && (min_rows == max_rows))</div><div class='add'>+ {</div><div class='add'>+ at->num_dims = 2;</div><div class='add'>+ at->dims[0] = count;</div><div class='add'>+ at->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 < 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 > 0) && (--obj >= _SLRun_Stack))</div><div class='add'>+ {</div><div class='add'>+ this_type = obj->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, &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, &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->data;</div><div class='add'>+ a_type = at->data_type;</div><div class='add'>+ na = at->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->data;</div><div class='add'>+ b_type = bt->data_type;</div><div class='add'>+ nb = bt->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) && (bt != NULL))</div><div class='add'>+ {</div><div class='add'>+ num_dims = at->num_dims;</div><div class='add'>+</div><div class='add'>+ if (num_dims != bt->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 < num_dims; i++)</div><div class='add'>+ {</div><div class='add'>+ if (at->dims[i] != bt->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, &c_cl, 1)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ no_init = ((c_cl->cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+ || (c_cl->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'>+ && (at->num_refs == 1)</div><div class='add'>+ && (at->data_type == c_cl->cl_data_type))</div><div class='add'>+ {</div><div class='add'>+ ct = at;</div><div class='add'>+ ct->num_refs = 2;</div><div class='add'>+ }</div><div class='add'>+ else if ((bt != NULL) </div><div class='add'>+ && (bt->num_refs == 1)</div><div class='add'>+ && (bt->data_type == c_cl->cl_data_type))</div><div class='add'>+ {</div><div class='add'>+ ct = bt;</div><div class='add'>+ ct->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->cl_data_type, 0, NULL, ct->dims, ct->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->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 (&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->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) &at, 1,</div><div class='add'>+ SLANG_CHAR_TYPE, (VOID_STAR) &zero, 1,</div><div class='add'>+ (VOID_STAR) &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->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->data;</div><div class='add'>+ num_elements = at->num_elements;</div><div class='add'>+</div><div class='add'>+ b_num = 0;</div><div class='add'>+ for (i = 0; i < 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, &b_num, 1, 1)))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ b_data = (int *) bt->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->data_type != SLANG_INT_TYPE)</div><div class='add'>+ || (ind_at->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->num_elements;</div><div class='add'>+ dims = (int *) ind_at->data;</div><div class='add'>+</div><div class='add'>+ num_elements = 1;</div><div class='add'>+ for (i = 0; i < num_dims; i++)</div><div class='add'>+ {</div><div class='add'>+ int d = dims[i];</div><div class='add'>+ if (d < 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->num_elements)</div><div class='add'>+ || (num_dims > 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 < num_dims; i++)</div><div class='add'>+ at->dims [i] = dims[i];</div><div class='add'>+</div><div class='add'>+ while (i < SLARRAY_MAX_DIMS)</div><div class='add'>+ {</div><div class='add'>+ at->dims [i] = 1;</div><div class='add'>+ i++;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ at->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 (&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->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 < 3)</div><div class='add'>+ {</div><div class='add'>+ SLang_verror (SL_INVALID_PARM,</div><div class='add'>+ "Usage: array_map (Return-Type, &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 > 0)</div><div class='add'>+ {</div><div class='add'>+ i--;</div><div class='add'>+ if (-1 == SLang_pop_array (&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->num_elements > 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->num_elements;</div><div class='add'>+</div><div class='add'>+ if (-1 == _SLang_pop_datatype (&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->dims, at->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 < 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->num_elements == num_elements)</div><div class='add'>+ args[i].increment = ati->sizeof_type;</div><div class='add'>+ /* memset already guarantees increment to be zero */</div><div class='add'>+</div><div class='add'>+ if (ati->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->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->data;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 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 < 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->cl->cl_apop (type, (VOID_STAR) addr))</div><div class='add'>+ goto return_error;</div><div class='add'>+</div><div class='add'>+ addr += at->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 < 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->data_type;</div><div class='add'>+ num_dims = at->num_dims;</div><div class='add'>+ dims = at->dims;</div><div class='add'>+</div><div class='add'>+ sprintf (buf, "%s[%d", SLclass_get_datatype_name (type), at->dims[0]);</div><div class='add'>+</div><div class='add'>+ for (i = 1; i < 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->cl_binary_ops;</div><div class='add'>+</div><div class='add'>+ while (ab != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (ab->data_type == SLANG_ARRAY_TYPE)</div><div class='add'>+ return 0;</div><div class='add'>+ ab = ab->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->data_type;</div><div class='add'>+ if (NULL == (f = _SLclass_get_unary_fun (op, at->cl, &b_cl, unary_type)))</div><div class='add'>+ return NULL;</div><div class='add'>+ b_type = b_cl->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->cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+ || (b_cl->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'>+ && (at->num_refs == 1)</div><div class='add'>+ && (at->data_type == b_cl->cl_data_type))</div><div class='add'>+ {</div><div class='add'>+ bt = at;</div><div class='add'>+ bt->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->dims, at->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->data, at->num_elements, bt->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->data_type;</div><div class='add'>+</div><div class='add'>+ if (a_type == b_type)</div><div class='add'>+ {</div><div class='add'>+ at->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->cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+ || (b_cl->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->dims, at->num_dims, no_init)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if (1 == (*t) (a_type, at->data, at->num_elements, b_type, bt->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->data_type;</div><div class='add'>+ num_elements = at->num_elements;</div><div class='add'>+ sizeof_type = at->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->dims, at->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->data;</div><div class='add'>+ if (0 == (at->flags & 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->cl->cl_acopy;</div><div class='add'>+ for (i = 0; i < 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 (&ind_at, 1))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((ind_at->data_type != SLANG_INT_TYPE)</div><div class='add'>+ || (ind_at->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 (&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->data,</div><div class='add'>+ ind_at->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->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->cl_push_intrinsic = array_push_intrinsic;</div><div class='add'>+ cl->cl_dereference = array_dereference;</div><div class='add'>+ cl->cl_datatype_deref = array_datatype_deref;</div><div class='add'>+ cl->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 (&c->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->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->at;</div><div class='add'>+ if (at->num_elements == c->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->flags & SLARR_DATA_VALUE_IS_RANGE)</div><div class='add'>+ {</div><div class='add'>+ int d = (int) c->next_element_index;</div><div class='add'>+ data = range_get_data_addr (at, &d);</div><div class='add'>+ }</div><div class='add'>+ else</div><div class='add'>+ data = (VOID_STAR) ((char *)at->data + (c->next_element_index * at->sizeof_type));</div><div class='add'>+</div><div class='add'>+ c->next_element_index += 1;</div><div class='add'>+</div><div class='add'>+ if ((at->flags & SLARR_DATA_VALUE_IS_POINTER)</div><div class='add'>+ && (*(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->cl->cl_apush)(at->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&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 < (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->num_elements;</div><div class='add'>+ b_data = (VOID_STAR) SLmalloc (at->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->data_type, 0, b_data, at->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->dims[1] = at->dims[0];</div><div class='add'>+ bt->dims[0] = at->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->dims;</div><div class='add'>+ num_dims = at->num_dims;</div><div class='add'>+</div><div class='add'>+ if ((at->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->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->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->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->sizeof_type;</div><div class='add'>+ is_ptr = (at->flags & 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->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->num_dims;</div><div class='add'>+ for (i = 0; i < (int) num_dims; i++)</div><div class='add'>+ bt->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->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->num_elements == 0)</div><div class='add'>+ { /* [] # [] ==> [] */</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->num_elements / a->dims[d];</div><div class='add'>+</div><div class='add'>+ if (d == 0)</div><div class='add'>+ {</div><div class='add'>+ *other = *loops; /* a->num_elements / a->dims[0]; */</div><div class='add'>+ return 0;</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ *other = a->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 (&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 (&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 (&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 (&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 (&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 (&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, &ai, &a_loops, &a_stride))</div><div class='add'>+ || (-1 == get_inner_product_parms (b, &bi, &b_loops, &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->num_dims;</div><div class='add'>+ b_num_dims = b->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'>+ && (b_num_dims == 2)</div><div class='add'>+ && (a->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->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->dims[ai]) != b->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 > 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 < (int)a_num_dims; i++)</div><div class='add'>+ if (i != ai) dims [j++] = a->dims[i];</div><div class='add'>+ for (i = 0; i < (int)b_num_dims; i++)</div><div class='add'>+ if (i != bi) dims [j++] = b->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->data_type)</div><div class='add'>+ {</div><div class='add'>+ case SLANG_FLOAT_TYPE:</div><div class='add'>+ switch (b->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->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->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&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->dims[0];</div><div class='add'>+ nc = at->dims[1];</div><div class='add'>+</div><div class='add'>+ a_data = (GENERIC_TYPE *) at->data;</div><div class='add'>+ b_data = (GENERIC_TYPE *) bt->data;</div><div class='add'>+</div><div class='add'>+ for (i = 0; i < 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 < 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->data;</div><div class='add'>+ b = (GENERIC_TYPE_B *) bt->data;</div><div class='add'>+ a = (GENERIC_TYPE_A *) at->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 < 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 < 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->data;</div><div class='add'>+ b = (GENERIC_TYPE *) bt->data;</div><div class='add'>+ a = (double *) at->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->data;</div><div class='add'>+ b = (double *) bt->data;</div><div class='add'>+ a = (GENERIC_TYPE *) at->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->data;</div><div class='add'>+ b = (double *) bt->data;</div><div class='add'>+ a = (double *) at->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&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->flags & 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->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->sizeof_type,</div><div class='add'>+ at->flags & 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&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->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) && (-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 (&a->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->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 (&e->value);</div><div class='add'>+ SLang_free_slstring (e->key);</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+ if (e->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 < 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->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->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->flags & HAS_DEFAULT_VALUE)</div><div class='add'>+ SLang_free_object (&a->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->elements[h];</div><div class='add'>+</div><div class='add'>+ while (e != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (str == e->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 = &e->value;</div><div class='add'>+ Cached_Array = a;</div><div class='add'>+#endif</div><div class='add'>+ return &e->value;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ e = e->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->key = str;</div><div class='add'>+ e->next = a->elements[h];</div><div class='add'>+ a->elements[h] = e;</div><div class='add'>+</div><div class='add'>+ a->num_elements += 1;</div><div class='add'>+#if USE_CACHED_STRING</div><div class='add'>+ Cached_String = str;</div><div class='add'>+ Cached_Obj = &e->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) && (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 = &e->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, &mmt, &a, &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) && (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'>+ && (a->flags & HAS_DEFAULT_VALUE))</div><div class='add'>+ obj = &a->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->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, &mmt, &a, &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 (&obj))</div><div class='add'>+ {</div><div class='add'>+ if ((obj.data_type != a->type)</div><div class='add'>+#if USE_NEW_ANYTYPE_CODE</div><div class='add'>+ && (a->type != SLANG_ANY_TYPE)</div><div class='add'>+#endif</div><div class='add'>+ )</div><div class='add'>+ {</div><div class='add'>+ (void) SLang_push (&obj);</div><div class='add'>+ if ((-1 == SLclass_typecast (a->type, 1, 1))</div><div class='add'>+ || (-1 == SLang_pop (&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, &obj))</div><div class='add'>+ SLang_free_object (&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 (&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->num_elements;</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &num, 1)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ data = (char **)at->data;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ for (j = 0; j < 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->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->key);</div><div class='add'>+ e = e->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->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 (&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->cl_class_type == SLANG_CLASS_TYPE_SCALAR)</div><div class='add'>+ {</div><div class='add'>+ sizeof_type = cl->cl_sizeof_type;</div><div class='add'>+ memcpy ((char *) dest_data, (char *)&obj->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->cl_acopy) (cl->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->num_elements;</div><div class='add'>+ type = a->type;</div><div class='add'>+</div><div class='add'>+ cl = _SLclass_get_class (type);</div><div class='add'>+ sizeof_type = cl->cl_sizeof_type;</div><div class='add'>+</div><div class='add'>+ if (NULL == (at = SLang_create_array (type, 0, NULL, &num, 1)))</div><div class='add'>+ return;</div><div class='add'>+</div><div class='add'>+ dest_data = (char *)at->data;</div><div class='add'>+</div><div class='add'>+ i = 0;</div><div class='add'>+ for (j = 0; j < 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->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, &e->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->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->elements[h];</div><div class='add'>+ while (v != NULL)</div><div class='add'>+ {</div><div class='add'>+ if (v->key == key)</div><div class='add'>+ {</div><div class='add'>+ if (v0 != NULL)</div><div class='add'>+ v0->next = v->next;</div><div class='add'>+ else</div><div class='add'>+ a->elements[h] = v->next;</div><div class='add'>+</div><div class='add'>+ free_element (v);</div><div class='add'>+ a->num_elements -= 1;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+ v0 = v;</div><div class='add'>+ v = v->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->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 (&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->flags = flags;</div><div class='add'>+ c->mmt = mmt;</div><div class='add'>+ c->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->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->a;</div><div class='add'>+</div><div class='add'>+ i = c->this_hash_index;</div><div class='add'>+ if (i >= SLASSOC_HASH_TABLE_SIZE)</div><div class='add'>+ return 0;</div><div class='add'>+</div><div class='add'>+ e = a->elements[i];</div><div class='add'>+</div><div class='add'>+ j = c->next_same_hash_index;</div><div class='add'>+ c->next_same_hash_index = j + 1;</div><div class='add'>+</div><div class='add'>+ while ((j > 0) && (e != NULL))</div><div class='add'>+ {</div><div class='add'>+ j--;</div><div class='add'>+ e = e->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 >= SLASSOC_HASH_TABLE_SIZE)</div><div class='add'>+ return 0; /* no more */</div><div class='add'>+ }</div><div class='add'>+ while (a->elements [i] == NULL);</div><div class='add'>+</div><div class='add'>+ e = a->elements[i];</div><div class='add'>+ c->this_hash_index = i;</div><div class='add'>+ c->next_same_hash_index = 1;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ if ((c->flags & CTX_WRITE_KEYS)</div><div class='add'>+ && (-1 == SLang_push_string (e->key)))</div><div class='add'>+ return -1;</div><div class='add'>+</div><div class='add'>+ if ((c->flags & CTX_WRITE_VALUES)</div><div class='add'>+ && (-1 == _SLpush_slang_obj (&e->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->cl_length = assoc_length;</div><div class='add'>+ cl->cl_foreach_open = cl_foreach_open;</div><div class='add'>+ cl->cl_foreach_close = cl_foreach_close;</div><div class='add'>+ cl->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&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)->ptr_type ? (b)->v.ptr : (b)->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->len = len;</div><div class='add'>+ b->num_refs = 1;</div><div class='add'>+ b->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->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->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->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->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->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->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->num_refs > 1)</div><div class='add'>+ {</div><div class='add'>+ b->num_refs -= 1;</div><div class='add'>+ return;</div><div class='add'>+ }</div><div class='add'>+</div><div class='add'>+ switch (b->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->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->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->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->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->len;</div><div class='add'>+ if (b->len < len) len = b->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->len > b->len)</div><div class='add'>+ return 1;</div><div class='add'>+ if (a->len == b->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->len + b->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->len);</div><div class='add'>+ memcpy (bytes + a->len, (char *)BS_GET_POINTER(b), b->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 < 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 > 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 < 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 < 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 < 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 < 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'>+ case SLANG_GE:</div><div class='add'>+ for (n = 0; n < 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'>+ case SLANG_LT:</div><div class='add'>+ for (n = 0; n < 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'>+ case SLANG_LE:</div><div class='add'>+ for (n = 0; n < 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'>+ case SLANG_EQ:</div><div class='add'>+ for (n = 0; n < 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 < 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 < 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 < 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->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 < bytes_max)</div><div class='add'>+ {</div><div class='add'>+ unsigned char ch = *bytes;</div><div class='add'>+</div><div class='add'>+ if ((ch < 32) || (ch >= 127) || (ch == '\\'))</div><div class='add'>+ {</div><div class='add'>+ if (b + 4 > 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 < 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->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&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->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) &obj->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->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->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->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 > 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 < 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 < 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)->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)->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->cl_push)(type, (VOID_STAR) &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->cl_pop)(type, (VOID_STAR) &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->cl_apush) (type, from))</div><div class='add'>+ return -1;</div><div class='add'>+ return (*cl->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] < 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->cl_cmp;</div><div class='add'>+ data_type_len = cl->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 > 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 < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &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 < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &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 < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &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'>+ case SLANG_GE:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &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'>+ case SLANG_LT:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &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'>+ case SLANG_LE:</div><div class='add'>+ for (n = 0; n < n_max; n++)</div><div class='add'>+ {</div><div class='add'>+ if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &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'>+ 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->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 < 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'>+ && (0 == strcmp (cl->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->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)->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->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, &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 (&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->cl_pop = datatype_pop;</div><div class='add'>+ cl->cl_push = datatype_push;</div><div class='add'>+ cl->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->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 < 256; i++)</div><div class='add'>+ {</div><div class='add'>+ if ((Registered_Types[i] == NULL)</div><div class='add'>+ && (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->cl_data_type = type;</div><div class='add'>+ cl->cl_class_type = class_type;</div><div class='add'>+ name = cl->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->cl_push == NULL) cl->cl_push = default_push_mmt;</div><div class='add'>+ if (cl->cl_destroy == NULL)</div><div class='add'>+ return method_undefined_error (type, "destroy", name);</div><div class='add'>+ cl->cl_user_destroy_fun = cl->cl_destroy;</div><div class='add'>+ cl->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->cl_destroy == NULL) cl->cl_destroy = default_destroy_simple;</div><div class='add'>+ if ((type_size == 0)</div><div class='add'>+ || (type_size > 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->cl_pop == NULL)</div><div class='add'>+ return method_undefined_error (type, "pop", name);</div><div class='add'>+ if (cl->cl_fread == NULL) cl->cl_fread = scalar_fread;</div><div class='add'>+ if (cl->cl_fwrite == NULL) cl->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->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->cl_destroy == NULL)</div><div class='add'>+ return method_undefined_error (type, "destroy", name);</div><div class='add'>+ if (cl->cl_pop == NULL)</div><div class='add'>+ return method_undefined_error (type, "pop", name);</div><div class='add'>+ cl->cl_apop = vector_apop;</div><div class='add'>+ cl->cl_apush = vector_apush;</div><div class='add'>+ cl->cl_adestroy = default_destroy_simple;</div><div class='add'>+ if (cl->cl_fread == NULL) cl->cl_fread = scalar_fread;</div><div class='add'>+ if (cl->cl_fwrite == NULL) cl->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->cl_string == NULL) cl->cl_string = default_string;</div><div class='add'>+ if (cl->cl_acopy == NULL) cl->cl_acopy = default_acopy;</div><div class='add'>+ if (cl->cl_datatype_deref == NULL) cl->cl_datatype_deref = default_datatype_deref;</div><div class='add'>+</div><div class='add'>+ if (cl->cl_pop == NULL) cl->cl_pop = default_pop;</div><div class='add'>+</div><div class='add'>+ if (cl->cl_push == NULL)</div><div class='add'>+ return method_undefined_error (type, "push", name);</div><div class='add'>+</div><div class='add'>+ if (cl->cl_byte_code_destroy == NULL)</div><div class='add'>+ cl->cl_byte_code_destroy = cl->cl_destroy;</div><div class='add'>+ if (cl->cl_push_literal == NULL)</div><div class='add'>+ cl->cl_push_literal = cl->cl_push;</div><div class='add'>+</div><div class='add'>